系列目錄:
-
STM32 HAL庫快速實戰【一】《32點燈》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【三】《pwm控制舵機》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【四】《串口簡單使用》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
-
STM32 HAL庫快速實戰【五】《控制串口電機》--基於黑龍江科技大學機電工業機器人實訓 - USTHzhanglu - 博客園 (cnblogs.com)
模塊介紹
TBS-K210舵機
- 數字舵機,采用PWM控制輸出角度
- 工作頻率 50-330HZ
- 脈沖寬度范圍 500-2500us
- 控制角度 270°
- 中立位置 1500us
通過計算可得,步進角為270/2000=0.135°
PWM控制介紹
- 參考文章 PWM頻率與占空比詳解
對於本次控制的舵機,當工作頻率為50HZ,即周期為20ms,20000us時,500us對應的占空比為500/20000=2.5%,2500/20000=12.5%,也就是控制占空比在該區間內變換,即可改變舵機角度。
接線
在這里使用DJ0接口,即PB3。
配置CubeMX
可以使用上節配置好的demo復制后繼續配置,也可以重新生成,這里不多贅述。
點擊PB3,勾選TIM2_CH2定時器
Pinout & Configuration > A-Z > TIM2
Channel2 > PWM Generation CH2
然后配置如下參數
參數 | 作用 |
---|---|
PSC | 預分頻,定時器計數的頻率。當主頻為72Mhz,PSC為71時,計數頻率為72/(71+1)=1Mhz,即每個周期1us |
計數模式 | 遞增計數或者遞減計數 |
ARR | 自動重載值,當計數到這個值時,計數器清零,重新計數。計數周期為1us,ARR為19999時,PWM周期為1us*(19999+1)為20ms,即50HZ |
Pulse | 翻轉計數值,當計數到達這個值時,電平翻轉 |
Polarity | 輸出極性,即計數到達Pulse前的電平狀態 |
GENERATE CODE >Open Project
編寫代碼
配置完PWM后,若要開啟PWM,需要用到HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2)
來打開TIM_CH2的定時器通道。同時舵機歸零時需要一定時間,最好加個延時。
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
HAL_Delay(2000);
HAL_GPIO_WritePin(led_GPIO_Port,led_Pin,GPIO_PIN_RESET);
/* USER CODE END 2 */
注意到這里我們設置的ARR為20000,對應了20ms,調整占空比為2.5%即為500,因此只需要在500-2500之間改變Pulse值即可進行調節角度。
int 一個speed變量用來調整角度(原則上不能使用這個單詞,會造成讀者迷茫,”這個變量究竟控制什么?“,這里代碼已經上傳,因此就不想改了)
通過__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed)
進行修改占空比。
每次改變完占空比后,舵機轉到指定角度需要一定時間,因此需要根據改變角度幅度設置延時,也可以通過共同改變占空比變化量和延時時間來調節速度。delay減半,速度翻倍(
建議加一個翻轉led來判斷運行情況。
注意,當speed范圍不在[500,2500]時舵機不會轉動,因此建議限定speed的范圍。
/* USER CODE BEGIN WHILE */
int speed=500;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,speed);
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
speed+=3;
HAL_Delay(100);
}
/* USER CODE END 3 */
工程源碼
國內用戶請使用gitee克隆或是使用代理訪問Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/pwm