SG90 舵机控制(PWM 实战)
📅 2026-05-15 · 📂 硬件编程 · ⏱ 阅读约 6 分钟
概述
SG90 是机器人制作中最常用的微型舵机,价格仅 5 元。通过 PWM 信号精确控制旋转角度(0°~180°),适合做机械臂、云台、机器狗关节。
学习目标:理解舵机 PWM 控制原理,掌握 ESP32 LEDC 驱动舵机,学会多舵机联动。
物料清单
- ESP32 ×1
- SG90 舵机 ×2
- 外部 5V 电源(或充电宝)×1
- 杜邦线若干
舵机控制原理
SG90 通过 PWM 信号的脉宽(不是占空比)控制角度:
| 脉宽 | 角度 |
|---|
| 0.5ms (500μs) | 0° |
| 1.0ms (1000μs) | 45° |
| 1.5ms (1500μs) | 90°(中位) |
| 2.0ms (2000μs) | 135° |
| 2.5ms (2500μs) | 180° |
PWM 频率固定为 50Hz(周期 20ms)。ESP32 LEDC 配置:ledcSetup(ch, 50, 16) — 50Hz、16位分辨率。
接线图
🔌 接线
外部5V电源 ESP32 SG90舵机
┌──────┐ ┌─────────┐ ┌─────────┐
│ 5V ──┼──┼─(不接)──┼──┼─ 红线(VCC) │
│ GND ─┼──┼── GND ──┼──┼─ 棕线(GND) │
│ │ │ GPIO23 ─┼──┼─ 橙线(SIG) │
└──────┘ └─────────┘ └─────────┘
⚠️ 不要从 ESP32 3.3V 给舵机供电!
舵机堵转电流可达 750mA。必须用外部 5V。
GND 必须共地!
完整代码:扫描 + 定位
// Servo_Sweep.ino — 双舵机扫描
#include <ESP32Servo.h>
Servo servo1, servo2;
void setup() {
servo1.attach(23, 500, 2500); // 引脚, min脉宽, max脉宽
servo2.attach(22, 500, 2500);
servo1.write(90); // 归中
servo2.write(90);
}
void loop() {
// 0°→180° 缓慢扫描
for (int ang = 0; ang <= 180; ang++) {
servo1.write(ang);
servo2.write(180 - ang); // 镜像运动
delay(15);
}
// 180°→0°
for (int ang = 180; ang >= 0; ang--) {
servo1.write(ang);
servo2.write(180 - ang);
delay(15);
}
}
微秒级精确控制(高级)
// 直接用 writeMicroseconds 获得更高分辨率
servo.writeMicroseconds(1500); // 90° ± 精确到微秒
// 自定义映射:脉宽 → 角度
void setAngle(Servo& s, int deg) {
int pulse = map(deg, 0, 180, 500, 2500);
s.writeMicroseconds(pulse);
}
常见问题
⚠️ 必须独立供电:舵机启动电流大,从 ESP32 3.3V 取电会导致电压跌落→ESP32 重启。必须用外部 5V 电源,并共地。
⚠️ 堵转保护:舵机转到机械限位还继续输出力矩会烧毁电机。代码中限制角度范围 0°~180°,避免超出。
💡 ESP32Servo 库:基于 LEDC 硬件 PWM,比传统 Servo 库更适合 ESP32。安装:库管理器搜索 "ESP32Servo"。