舵机控制信号:PWM(脉宽调制)信号原理
说到舵机控制,咱们得先聊聊PWM。PWM的全称是Pulse Width Modulation,中文叫脉宽调制。说白了,就是通过改变脉冲的宽度来控制东西。
我记得刚入行那会儿,第一次接触舵机,还以为是什么高大上的通信协议。结果一看,就是个方波信号。嗯,就是这么简单。
PWM信号长什么样?
PWM信号就是一个周期性的方波。高电平、低电平来回切换。关键参数就两个:频率和占空比。
- 频率:信号每秒重复的次数,单位Hz
- 周期:频率的倒数,一个完整信号的时间长度
- 占空比:高电平时间占整个周期的比例
举个例子。假设频率是50Hz,那周期就是20ms。如果高电平持续了1.5ms,占空比就是1.5/20 = 7.5%。
核心要点:舵机不看占空比百分比,它只看高电平的绝对时间长度。
PWM频率与占空比
标准舵机的工作频率是50Hz。为什么是50Hz?我猜是因为早期舵机内部用的是模拟电路,这个频率刚好合适。
频率决定了舵机的刷新率。50Hz意味着每20ms更新一次位置指令。对于大多数应用来说,这个速度足够了。
占空比嘛,在舵机控制里,我们更习惯说脉宽。也就是高电平持续的时间。标准范围是1ms到2ms。
| 脉宽 | 对应角度 | 典型应用 |
|---|---|---|
| 1.0 ms | 0° | 极限位置(左) |
| 1.5 ms | 90° | 中间位置 |
| 2.0 ms | 180° | 极限位置(右) |
个人经验:我建议你实际测试一下舵机的极限脉宽。不同品牌的舵机,1ms不一定正好是0°,2ms也不一定是180°。有些舵机支持0.5ms到2.5ms,能转270°。
标准舵机控制协议
标准舵机控制协议,说白了就是:给舵机发一个周期20ms的PWM信号,高电平时间在1ms到2ms之间,舵机就转到对应的角度。
为什么会这样?因为舵机内部有个比较器。它把输入信号的脉宽和内部电位器反馈的电压做比较。脉宽长了,电机正转;短了,电机反转。直到两者相等,电机停转。
我在项目中遇到过一个问题:用Arduino的analogWrite()函数控制舵机,结果舵机抖得厉害。后来发现,analogWrite()的PWM频率是490Hz或980Hz,根本不是50Hz。舵机根本识别不了。
避坑指南:我曾经因为PWM频率不对,折腾了一整天。后来换用Servo库,问题就解决了。如果你用单片机直接输出PWM,一定要确保频率是50Hz。
代码示例:用Arduino控制舵机
#include <Servo.h>
Servo myServo; // 创建一个舵机对象
void setup() {
myServo.attach(9); // 将舵机信号线连接到引脚9
}
void loop() {
// 从0°转到180°,每次增加1°
for (int angle = 0; angle <= 180; angle++) {
myServo.write(angle); // 写入角度值
delay(15); // 等待15ms让舵机到位
}
// 从180°转回0°
for (int angle = 180; angle >= 0; angle--) {
myServo.write(angle);
delay(15);
}
}
你看,代码就这么几行。Servo库帮我们处理了PWM的生成。你只需要告诉它角度,它自动转换成对应的脉宽。
脉宽与角度的换算关系
如果你需要自己计算脉宽,公式很简单:
脉宽(ms) = 1.0 + (角度 / 180) * 1.0
比如90°:1.0 + (90/180) * 1.0 = 1.5ms
比如45°:1.0 + (45/180) * 1.0 = 1.25ms
你想想看,这个关系是线性的。所以控制起来非常直观。
重要提醒:不要长时间让舵机堵转。就是给它发指令让它转到某个位置,但用手掰着不让它动。这样会烧坏舵机内部的电机驱动芯片。我吃过这个亏。
知识体系结构图
这张图把PWM信号的核心要素都串起来了。频率、脉宽、控制协议,三者缺一不可。你只要掌握了这三个点,舵机控制这块就算入门了。
我的建议:刚开始学的时候,别纠结于理论。找个舵机,接上Arduino,跑一遍上面的代码。看到舵机真的动了,那种感觉完全不一样。实践出真知嘛。