跳到主要内容

【PWM】舵机控制

下载例程代码下载代码

注意

请一定按照 例程使用方法 🔗 导入例程,否则下载的可能不是例程而是其他工程。

PWM 简介

PWM 波形

PWM 波形是一种方波信号,是高/低电平不断切换的结果,其波形如图所示,这是 3 种占空比不同的波形:

PWM波形

PWM 的几个关键参数为:

  • 频率(Frequency):即高低电平切换的速度,切换的速度越快则频率越高,1000Hz 的 PWM 波意味着 1 秒钟有 1000 个脉冲

  • 占空比(Duty Cycle):即每个周期内,高电平所占的宽度

    • 例如图中 50% duty cycle,即高/低电平的时间各占 50%

    • 图中的75% duty cycle高电平占 75%,低电平占 25%

    • 图中的25% duty cycle高电平占 25%,低电平占 75%

SG-90 舵机简介

  • 舵机最早是应用于遥控模型的小型执行器,因此也称为 RC 舵机。它有一个输出轴,可以连接摇臂,通过输入信号就能控制摇臂的运动

  • 与电机不同的是,它可以准确的控制摇臂旋转到某一个指定位置,并且自动抵抗外力,维持位置。

  • 除了 RC 模型,舵机可以用于双足机器人、机械臂、自动化执行器(阀门、门窗等等)

    注意:舵机内部是塑料减速齿轮,不可大力掰摇臂,避免损坏齿轮

  • 舵机的输入信号为 50Hz 的 PWM 波,其占空比范围 2.5%~12.5%,分别对应 **0°~180°**位置。因此,调整 PWM 占空比即可控制舵机的角度。

舵机2

如何使用例程

连接硬件,下载程序,即可看到效果

硬件连接

  • 将舵机的 3P 线插到学习板的SERVO 接口。连接前请核对线序
舵机学习板
黄(信号)B8
红(+)5V
棕(-)G
连接
  • 将舵机摇臂安装到舵机输出轴。如果需要更紧固,可以用附件中最小的螺丝拧到摇臂中心的孔里

程序效果

  • 烧录例程后,即可看到舵机摇臂开始摆动
演示

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

  • 开启外部晶振:在 Pinout&Configuration -> System Core -> RCC 页面,将 High Speed Clock (HSE) 配置为 Crystal/Ceramic Resonator
配置时钟源
  • 配置时钟频率:在 Clock Configuration 页面,将 PLL Source 选择为 HSE,将 System Clock Mux 选择为 PLLCLK,然后在 HCLK (MHz) 输入 72 并回车,将 HCLK 频率配置为 72 MHz
时钟配置
  • 分配引脚:在 Pinout&Configuration 页面,将 PB8 配置为 TIM4_CH3

  • 配置 TIM4:在 Pinout&Configuration -> Timers -> TIM4

    • Configuration -> Mode,勾选 Internal Clock,开启 TIM4 的内部时钟源

    • Configuration -> Mode,将 Channel3 配置为 PWM Generation CH3

    • Configuration -> Parameter Settings -> Counter Settings,将 Prescaler 配置为 720-1,将 Counter Period 配置为 2000-1,此时 PWM 频率为 50 Hz

      PWM 频率 = 72 MHz ÷ 720 ÷ 2000 = 50 Hz

2、代码

  • 启动 PWM 输出HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3) 启动 PWM 输出

  • 舵机控制

    • 舵机角度受占空比控制,占空比 2.5%~12.5% 代表 0°~180°

    • 占空比通过__HAL_TIM_SET_COMPARE 调节,参数范围 50~250

      占空比 = Compare 寄存器值 ÷ Counter Period 计数周期

      因此,__HAL_TIM_SET_COMPARE 填入的值 = 占空比 * Counter Period

      例如,设置占空比为 2.5%、12.5%时,2.5% _ 2000 = 50,2.5% _ 2000 = 250

    while (1)
    {
    // 舵机控制占空比范围2.5% ~ 12.5%
    // Counter Period设置的是2000,因此占空比设置范围是50 ~ 250

    // 中点,占空比7.5%,即2000 * 7.5% = 150
    __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 150);
    HAL_Delay(1000);

    // 向左转,占空比2.5%,即2000 * 2.5% = 50
    __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 50);
    HAL_Delay(1000);

    // 向右转,占空比12.5%,即2000 * 12.5% = 250
    __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 250);
    HAL_Delay(1000);
    }