舵机控制信号: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 极限位置(左)
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信号 频率 (50Hz) 占空比 / 脉宽 控制协议 周期 = 20ms 刷新率决定响应速度 1ms = 0° 1.5ms = 90° 2ms = 180° 内部比较器原理 线性映射关系 Servo库封装

这张图把PWM信号的核心要素都串起来了。频率、脉宽、控制协议,三者缺一不可。你只要掌握了这三个点,舵机控制这块就算入门了。

我的建议:刚开始学的时候,别纠结于理论。找个舵机,接上Arduino,跑一遍上面的代码。看到舵机真的动了,那种感觉完全不一样。实践出真知嘛。

专注资料整理