SG90 舵机控制(PWM 实战)

📅 2026-05-15 · 📂 硬件编程 · ⏱ 阅读约 6 分钟

📺 B站推荐视频:ESP32 入门教程

概述

SG90 是机器人制作中最常用的微型舵机,价格仅 5 元。通过 PWM 信号精确控制旋转角度(0°~180°),适合做机械臂、云台、机器狗关节。

学习目标:理解舵机 PWM 控制原理,掌握 ESP32 LEDC 驱动舵机,学会多舵机联动。

物料清单

舵机控制原理

SG90 通过 PWM 信号的脉宽(不是占空比)控制角度:

脉宽角度
0.5ms (500μs)
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"。