機(jī)器人開(kāi)發(fā)過(guò)程中角溃,對(duì)于直流電機(jī)來(lái)說(shuō),編碼器至關(guān)重要篮撑,它不僅可以使我們對(duì)電極進(jìn)行精確的速度閉環(huán)减细,位置閉環(huán),還可以通過(guò)時(shí)間積分赢笨,根據(jù)運(yùn)動(dòng)學(xué)關(guān)系未蝌,獲得速度、位置等信息
STM32的定時(shí)器有編碼器模式茧妒,大大的方便我們的開(kāi)發(fā)
使用STM32cubeMX配置工具萧吠,使得這個(gè)過(guò)程變得無(wú)比簡(jiǎn)單
我使用STM32cubeMX 開(kāi)發(fā)一個(gè)機(jī)器人中 使用兩個(gè)定時(shí)器TIM3 和TIM4編碼器模式讀取編碼器的值,做閉環(huán)控制
STM32定時(shí)器編碼器模式(Encoder Mode)
CubeMX配置過(guò)程
選擇芯片過(guò)程不再贅述
RCC: HSE高速總線始終改為外部晶振
SYS: DEBUG選擇 SW模式
TIM3 TIM4 配置成定時(shí)器模式 Combined Channels: Encoder Mode
TIM3 TIM4 定時(shí)器分頻配置: 這里分頻數(shù)要注意一下纸型,Prescaler 直接給0 ,Counter Period給65535,下面的Encoder Mode 如果是TI1的話就是只計(jì)數(shù)上升沿的脈沖除破,如果是TI2 andTI2 就是上下沿都計(jì),脈沖是前一個(gè)的兩倍
TIM Encoder GPIO上拉模式配置,兩個(gè)定時(shí)器四個(gè)引腳教馆,全部改成 Pull-Up土铺,即上拉模式,主要用于沒(méi)有外部上拉的編碼器讀取時(shí)板鬓,可以確定引腳電平悲敷,防止出錯(cuò)
時(shí)鐘樹(shù)配置
工程配置 IDE選擇 MDK V5
第一欄里選擇復(fù)制必要的庫(kù)文件 第二欄里勾選將文件分為.c和.h
最后點(diǎn)擊生成文件
注意 !
工程路徑絕對(duì)不能有中文名俭令,否則會(huì)報(bào)錯(cuò)后德,無(wú)法復(fù)制stm32的庫(kù)文件到你的工程
keil中添加處理函數(shù)
打開(kāi)生成的文件,在main.c中初始化的時(shí)候開(kāi)啟編碼器計(jì)數(shù)
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
在循環(huán)中調(diào)用 __HAL_TIM_IS_TIM_COUNTING_DOWN 可以獲得當(dāng)前電機(jī)的轉(zhuǎn)向 0為正抄腔、1為負(fù)
DirectionA = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);
DirectionB = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4);
在循環(huán)中調(diào)用 __HAL_TIM_GET_COUNTER 獲取計(jì)數(shù)器的計(jì)數(shù)值瓢湃,即編碼器的脈沖數(shù)
CaptureNumberA=__HAL_TIM_GET_COUNTER(&htim3);
CaptureNumberB=__HAL_TIM_GET_COUNTER(&htim4);
脈沖計(jì)算:
我的電機(jī)編碼器是AB相位差90度,柵格數(shù)是96赫蛇,無(wú)減速器绵患,碼盤(pán)轉(zhuǎn)一圈,A相和B相分別輸出96個(gè)矩形脈沖悟耘,總共輸出192個(gè)脈沖落蝙。
如果使用 Encoder Mode TI1 或者Encoder Mode TI2,碼盤(pán)轉(zhuǎn)一圈得到的計(jì)數(shù)值為192暂幼。
如果使用Encoder Mode TI1 andTI2 那么得到的脈沖數(shù)為384筏勒。
電機(jī)轉(zhuǎn)過(guò)的角度
如果使用Encoder Mode TI1 andTI2 那么
電機(jī)真實(shí)方向= 0為正、1為負(fù)
電機(jī)真實(shí)角度= 得到的脈沖數(shù) / 384 * 360