这一章在干嘛?
认识舵机——一种把「电机 + 减速齿轮 + 电位器 + 控制板」打包成一体的自带闭环执行器。你要做的只是给它 50Hz 的 PWM,高电平脉宽就是角度命令。
14.3 控制核心:20ms 周期与 0.5~2.5ms 脉宽
14.1 舵机是什么、怎么分类
舵机(Servo)可以看作自带驱动与控制电路的伺服电机,常见 180° 行程,用于航模舵面、机械臂关节等「转到某角度并保持」的场合。
原书图 14.1.1:SG90 舵机
| 对比项 | 模拟舵机 | 数字舵机 |
|---|---|---|
| 内部电路 | 模拟比较电路 | 含 MCU 与晶振 |
| 信号保持 | 需不停发送 PWM 才能保持位置 | 发一次即可记住 |
接线三根:棕色 GND、红色电源(4.8~6V,6V 力矩更大)、橙色信号。大扭矩负载下电流可达 2A 以上,供电要留余量。
14.2 结构与闭环原理
拆开舵机是五大件:直流电机 + 减速齿轮组(增扭)+ 电位器(角度反馈)+ 控制电路 + 输出轴。控制电路对比「目标脉宽」与「电位器反馈电压」,有偏差就驱使电机转,到位即停——一个完整的位置闭环。
原书图 14.2.1:舵机的结构图
原书图 14.3.1:舵机的工作原理图
原书图 14.3.2:舵机接口定义
它自己就闭环了:
这就是舵机与「裸电机」最大的区别——你不需要写 PID,不需要接编码器,控制板已经替你干完了。MCU 只需要发「角度命令」。
14.3 控制核心:20ms 周期与 0.5~2.5ms 脉宽
控制信号是**周期 20ms(50Hz)**的 PWM,高电平脉宽 0.52.5ms 线性对应 0180°:
原书图 14.3.3:信号脉宽与舵盘位置的关系:0.5ms→0°,1.5ms→90°,2.5ms→180°
定时器配置:PSC=168−1、ARR=20000−1 → 168MHz/168 = 1MHz 计数频率(1 个计数 = 1µs),计 20000 个正好 20ms。比较值即脉宽(单位 µs):
/* 角度 → 比较值:0°--500, 45°--1000, 90°--1500, 135°--2000, 180°--2500 */
uint16_t angle_to_tim_val(float angle)
{
uint16_t ret;
if ((angle < 0) || (angle > 180)) {
ret = 0; /* 角度越界返回 0 */
} else {
ret = 1500 + (int)((float)((angle - 90) * 100 / 9));
if ((ret < 500) || (ret > 2500)) /* 比较值越界保护 */
ret = 0;
}
return ret;
}
14.4 实验与验证
开发板 3 个舵机接口由 TIM8_CH1/CH2/CH3(PI5/PI6/PI7)控制。按键:KEY0 选择舵机 ID,KEY1 角度 +45°(上限 180°),KEY2 −45°(下限 0°)。
两个易错点:
① 舵机 5V(VCC_SRV)由 DC 口 12V 降压而来, 必须接 DC 电源 ,只插 USB 舵机没劲;② 控制信号经过 反相器 电平转换后才到舵机,所以 MCU 侧波形是反的(要给舵机 2ms 高,MCU 就输出 2ms 低)。验证:示波器测接口一在 90° 时的波形应为 50Hz、脉宽 1.5ms。
1. 舵机 PWM 的周期与脉宽范围各是多少?
周期 20ms(50Hz),高电平 0.5
2.5ms 线性对应 0180°;1.5ms 对应中位 90°。
2. 数字舵机与模拟舵机最大的区别?
机械结构相同;数字舵机内有 MCU,只需一次 PWM 即保持位置、响应与精度更好;模拟舵机需持续发送信号。
3. 为什么板上控制信号要「反相」?
MCU 的信号经反相器电平转换后才接舵机(隔离 IO 并兼容不同电平),所以 MCU 侧输出的高电平到舵机侧变成低电平,写代码时要把波形反过来。