根據NANO驅動板的原理圖,找到兩路電機對應的四路編碼器接口對應STM32上的IO口,并找到其對應的定時器進行模式配置。如下圖所示,使用的兩路電機的編碼器分別對應到定時器2和定時器3。
在STM32CubeMX中找到定時器2與定時器3,進行模式配置。以下以定時器2為例,定時器3只需進行相同配置即可。選擇定時器為編碼器模式,設置為不分頻,最大計數值為65535,使能自動重裝載,并選擇TI1和TI2兩路輸入,實現四倍頻效果。
配置完定時器2和定時器3后,需要再使用一個定時器,利用其產生50ms中斷來讀取當前的小車速度值,本次例程中采用定時器6產生中斷。 周期為50ms,計算方法為 :T=(arr+1)*(psc+1)/Tclk
當然,不要忘記了電機驅動的配置,畢竟還是得先動起來才能更好的檢驗其測速功能,電機的相關配置和驅動具體可參考上一篇文章。 完成配置后,由STM32CubeMX自動生成初始化代碼,選擇合適的編譯器打開當前功能,進行驅動功能的程序開發。以下主要對編碼器測速的相關代碼進行解釋,其余具體代碼可參考例程文件。
hort encoderPulse[2]={0}; /** * @brief 讀取定時器2和定時器3的計數值(編碼器脈沖值) * @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; //計數值重新清零 __HAL_TIM_GET_COUNTER(&htim3) = 0; } /** * @brief 根據得到的編碼器脈沖值計算速度 單位:m/s * @retval 速度值 */ float CalActualSpeed(int pulse) { return (float)(0.003092424 * pulse); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //定時器6中斷回調函數,每50ms調用一次 { float c_leftSpeed,c_rightSpeed; if(htim==(&htim6)) { GetEncoderPulse(); c_leftSpeed = CalActualSpeed(encoderPulse[0]); //獲得當前的速度值 c_rightSpeed = CalActualSpeed(encoderPulse[1]); } } 將程序下載到STM32機器人控制板上,通過串口與上位機進行通信,使用串口調試助手可觀察到在不同PWM值下,小車的運動速度。 通過上述介紹的使用定時器的編碼器模式讀取編碼器的脈沖值,最終得到實際的小車運行速度。可以看到,在實際運行時,即使控制的PWM信號占空比一致,左右電機的轉速仍存在一定的偏差。為了使速度更穩定以及調速效果響應更迅速和順滑,可以加入PID算法,對電機的轉速進行控制。 |
推薦信息 |
»兩輪四輪差速及阿克曼移動底盤設計轉向機器人/小車 |
»動手實現一臺阿克曼ROS小車 |
»四輪驅動機器人的轉向方式是什么 |
»全向輪運動模型規律-量化分析三個全向輪轉速與移動平臺中心點運動速度的關系 |
»三輪全向輪移動平臺坐標系說明示意圖 |
»麥克納姆輪運動速度分解-麥輪平臺運動學模型分析 |
»麥克納姆輪受力分析-受力方向為輪轂坐標系y軸正方向 |
»麥克納姆輪構型由輪轂和輥子組成 |
版權所有 © 北京創澤智慧機器人科技有限公司 地址:北京 清華科技園C座五樓 電話:4006-937-088 京ICP備20010582號-2 |