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