今天无意中在电脑边找到了以前购买的9g舵机,刚好上一篇文章记录了通过STM32产生PWM波形的过程,想着9g舵机也是采用PWM波形控制转动角度,这不刚好学有所用吗。
使用的硬件:
- 野火的骄阳STM32F407IGT6控制板。
- TS90A 9g舵机,外观如下图所示
找到了以前的采购链接,但发现没有多少有用资料,通过网上找到的资料对比,发现舵机的控制原理如下:
从以上2张图片可以看出,我们只需要生成一个周期了20ms的PWM波,再通过高电平的时间(0.5ms~2.5ms)来控制舵机的旋转角度,看起来还挻简单的,接下来开干。
——————————————————————————————————————————
大概的设置过程如下:
1,开通定时器TIM4(其实其它能够产生PWM波形的定时器也可以)的Channel 1,预分频器Prescaler设置为840-1,计数周期Counter Period设置为2000-1
通过以上各参数设置,实际得到的TIM4定时器时钟频率为84000000/840/2000=50Hz,即PWM周期为20ms,满足9g舵机对脉冲周期的要求
2,设置计数模式为:Up,向上计数
3,设置Channel1为PWM输出模式:PWM Generation CH1
4,设置Mode为模式2:PWM mode 2 (默认为mode 1)
通过以上设置,我们已经得到了一路周期为20ms的PWM脉冲,点击GENERATE CODE生成代码,通过CUBE MX自动生成的文件并不能直接使用,需要作如下2处修改:
1,手动开启定时器的PWM输出通道:“HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);,加在main()函数中,和其它初始化函数一起在程序启动时运行
int main(void)
{
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); // 舵机1 :产生50Hz,周期20ms脉冲
/* USER CODE END 2 */
————————————————————————————————————
2,在 while (1)死循环中增加占空比设置函数——__HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_x,0);
具体代码如下:
20ms周期对应2000个计数值,所以有以下对应关系
周期(ms) | 计数值 | 舵机旋转角度(°) |
0.5 | 50 | 0 |
1.0 | 100 | 45 |
1.5 | 150 | 90 |
2.0 | 200 | 135 |
2.5 | 250 | 180 |
/* USER CODE BEGIN WHILE */
while (1)
{
/* TS90A 9g模拟舵机旋转角度控制 */
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,50); //舵机旋转至0°位置
HAL_Delay(300);
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,100); //舵机旋转至45°位置
HAL_Delay(300);
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,150); //舵机旋转至90°位置
HAL_Delay(300);
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,200); //舵机旋转至135°位置
HAL_Delay(300);
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,250); //舵机旋转至180°位置
HAL_Delay(500);
/* USER CODE END WHILE */
}
代码编辑完成后,接着开始硬件接线工作
9g舵机一共需要接3根线,将TIM4 CH1的输出引脚(STM32F407IGT6 为PD12)接至9g舵机控制黄色信号线;红色接至+5V,棕色接至GND。
接线完成后上电,我们可以看到舵机按照程序设定,
首先回到舵机的0°位置,然后停止300ms;
再回到舵机的45°位置,然后停止300ms;
再回到舵机的90°位置,然后停止300ms;
再回到舵机的135°位置,然后停止300ms;
最后回到舵机的180°位置,然后停止500ms;
至此,9g舵机的控制代码测试完成。
舵机旋转
由于舵机有各种型号,控制方式也各不相同,以上代码仅在9g舵机上测试通过,其它型号舵机是否能够适用仍需要做进一步的测试。