问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32学习笔记:TS90A 9g舵机的控制实现

创作时间:
作者:
@小白创作中心

STM32学习笔记:TS90A 9g舵机的控制实现

引用
CSDN
1.
https://blog.csdn.net/qq_42787004/article/details/137110909

今天无意中在电脑边找到了以前购买的9g舵机,刚好上一篇文章记录了通过STM32产生PWM波形的过程,想着9g舵机也是采用PWM波形控制转动角度,这不刚好学有所用吗。

使用的硬件:

  1. 野火的骄阳STM32F407IGT6控制板。
  2. 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处修改:

  5. 手动开启定时器的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 */
}
  1. 在 while (1)死循环中增加占空比设置函数——__HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_x,0);

具体代码如下:

20ms周期对应2000个计数值,所以有以下对应关系
旋转角度与CCR计数器对应关系周期(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舵机上测试通过,其它型号舵机是否能够适用仍需要做进一步的测试。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号