【PWM】舵机控制
下载例程代码: 下载代码
请一定按照 例程使用方法🔗 导入例程,否则下载的可能不是例程而是其他工程。
PWM 简介
PWM 波形
PWM波形是一种方波信号,是高/低电平不断切换的结果,其波形如图所示,这是3种占空比不同的波形:

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占空比即可控制舵机的角度。

如何使用例程
连接硬件,下载程序,即可看到效果
硬件连接
- 将舵机的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);
} -