STM32 HAL 库实现舵机旋转
XiaoMa 博士生

引言

舵机

有一种电机可以在程序的控制下,在一定范围内连续改变输出轴角度并可以保持住。 这种电机最早被用在航模和船模等遥控模型中,控制各种舵面的转动,这就是舵机。

舵机控制基本原理

舵机的控制一般需要一个 20ms 周期的 PWM 信号,该脉冲的高电平部分一般为 0.5ms~2.5ms 范围内的角度控制脉冲部分。以 180° 角度伺服为例,对应关系如下所示:

  • 0.5 ms 高电平 ——– 0°
  • 1.0 ms 高电平 ——– 45°
  • 1.5 ms 高电平 ——– 90°
  • 2.0 ms 高电平 ——– 135°
  • 2.5 ms 高电平 ——– 180°

顺时针还是逆时针转动需要自己试。

准备工作

硬件

  • STM32F429IGT6 开发板
  • SG90 9 克舵机

软件

  • STM32CubeMX
  • Keil5

计算

180° → 2ms。那么 3μm → 0.27°。意味着这个舵机的控制精度为 0.27°。

推导公式:n/90(ms) + 0.5ms,n 为想要转到的角度。

实操步骤

  1. 打开 STM32CubeMX 软件,按照 STM32CubeMX 通用配置(参考:成为点灯大师 LED Master | Story Begins )完成后。选择针脚,查阅手册可知 PA6 可通过 TIM3_CH1 开启。配置 TIM3 的 CH1,完成后可以看到右边 PA6 引脚变为绿色。③ 的原理参考:xx。
image-20230405184143879
图 1 TIM3_CH1 配置
  1. 进行 STM32CubeMX 通用配置 [2]的第 5 步。

  2. 打开工程文件。按照 Keil5 MDK 通用配置 [2]完成后开始编写代码。

    打开 main.c 文件。在 main 函数中开启 PWM。

    1
    2
    3
    /* USER CODE BEGIN 2 */
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    /* USER CODE END 2 */

    输出 PWM。此处输出为正转 180° 后反转 180°,以此往复。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);
    HAL_Delay(1000);
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2500);
    HAL_Delay(1000);
    }
    /* USER CODE END 3 */
  3. 进行 Keil5 MDK 通用配置 [2]的第 5 步。

上述例程成功运行。

参考

[1] 基于cubemx的舵机加减速控制方法_bilibili

[2] 成为点灯大师 LED Master | Story Begins