![]() |
|
根據(jù)NANO驅(qū)動(dòng)板的原理圖,找到兩路電機(jī)對(duì)應(yīng)的四路編碼器接口對(duì)應(yīng)STM32上的IO口,并找到其對(duì)應(yīng)的定時(shí)器進(jìn)行模式配置。如下圖所示,使用的兩路電機(jī)的編碼器分別對(duì)應(yīng)到定時(shí)器2和定時(shí)器3。
在STM32CubeMX中找到定時(shí)器2與定時(shí)器3,進(jìn)行模式配置。以下以定時(shí)器2為例,定時(shí)器3只需進(jìn)行相同配置即可。選擇定時(shí)器為編碼器模式,設(shè)置為不分頻,Z大計(jì)數(shù)值為65535,使能自動(dòng)重裝載,并選擇TI1和TI2兩路輸入,實(shí)現(xiàn)四倍頻效果。
配置完定時(shí)器2和定時(shí)器3后,需要再使用一個(gè)定時(shí)器,利用其產(chǎn)生50ms中斷來讀取當(dāng)前的小車速度值,本次例程中采用定時(shí)器6產(chǎn)生中斷。 周期為50ms,計(jì)算方法為 :T=(arr+1)*(psc+1)/Tclk
當(dāng)然,不要忘記了電機(jī)驅(qū)動(dòng)的配置,畢竟還是得先動(dòng)起來才能更好的檢驗(yàn)其測(cè)速功能,電機(jī)的相關(guān)配置和驅(qū)動(dòng)具體可參考上一篇文章。 完成配置后,由STM32CubeMX自動(dòng)生成初始化代碼,選擇合適的編譯器打開當(dāng)前功能,進(jìn)行驅(qū)動(dòng)功能的程序開發(fā)。以下主要對(duì)編碼器測(cè)速的相關(guān)代碼進(jìn)行解釋,其余具體代碼可參考例程文件。
hort encoderPulse[2]={0}; /** * @brief 讀取定時(shí)器2和定時(shí)器3的計(jì)數(shù)值(編碼器脈沖值) * @retval None */ void GetEncoderPulse() { encoderPulse[0] = -((short)__HAL_TIM_GET_COUNTER(&htim2)); //配合小車輪子運(yùn)動(dòng)方向,進(jìn)行取反操作 encoderPulse[1] = -((short)__HAL_TIM_GET_COUNTER(&htim3));
__HAL_TIM_GET_COUNTER(&htim2) = 0; //計(jì)數(shù)值重新清零 __HAL_TIM_GET_COUNTER(&htim3) = 0; } /** * @brief 根據(jù)得到的編碼器脈沖值計(jì)算速度 單位:m/s * @retval 速度值 */ float CalActualSpeed(int pulse) { return (float)(0.003092424 * pulse); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //定時(shí)器6中斷回調(diào)函數(shù),每50ms調(diào)用一次 { float c_leftSpeed,c_rightSpeed; if(htim==(&htim6)) { GetEncoderPulse(); c_leftSpeed = CalActualSpeed(encoderPulse[0]); //獲得當(dāng)前的速度值 c_rightSpeed = CalActualSpeed(encoderPulse[1]); } } 將程序下載到STM32機(jī)器人控制板上,通過串口與上位機(jī)進(jìn)行通信,使用串口調(diào)試助手可觀察到在不同PWM值下,小車的運(yùn)動(dòng)速度。 通過上述介紹的使用定時(shí)器的編碼器模式讀取編碼器的脈沖值,Z終得到實(shí)際的小車運(yùn)行速度。可以看到,在實(shí)際運(yùn)行時(shí),即使控制的PWM信號(hào)占空比一致,左右電機(jī)的轉(zhuǎn)速仍存在一定的偏差。為了使速度更穩(wěn)定以及調(diào)速效果響應(yīng)更迅速和順滑,可以加入PID算法,對(duì)電機(jī)的轉(zhuǎn)速進(jìn)行控制。 |
| 版權(quán)所有 © 北京創(chuàng)澤智慧機(jī)器人科技有限公司 地址:北京 清華科技園C座五樓 電話:4006-937-088 京ICP備20010582號(hào)-2 |