ESP32S3用PWM控制舵机详解
·
#include <Arduino.h>
// 舵机控制参数定义
const int servoPin = 2; // 舵机信号线连接的GPIO引脚 (例如GPIO2)
const int channel = 0; //使用LEDC通道0 (0-15)
const int freq = 50; //标准舵机PWM频率为50Hz (周期20ms)
const int resolution = 16; //分辨率设置为16位 (0-65535)
const int minDuty = 1638; // 对应0.5ms脉宽 (0度) 的计算值: 0.5ms / 20ms * 65535 ≈ 1638
const int maxDuty = 8192; // 对应2.5ms脉宽 (180度)的计算值: 2.5ms / 20ms * 65535 ≈ 8192
void setup() {
Serial.begin(115200); // 初始化串口用于调试输出
// 1. 配置LEDC PWM通道参数
ledcSetup(channel, freq, resolution);
// 2. 将PWM通道与指定GPIO引脚关联
ledcAttachPin(servoPin, channel);
Serial.println("ESP32-S3舵机PWM控制初始化完成");
}
void loop() {
// 示例:控制舵机从0度转动到180度,再转回0度
Serial.println("舵机转动至0度位置");
ledcWrite(channel, minDuty); // 写入最小占空比,对应0度
delay(1000); // 等待1秒让舵机到位 Serial.println("舵机转动至90度位置");
int midDuty = (minDuty + maxDuty) / 2; // 计算中间位置占空比 ledcWrite(channel, midDuty); // 写入中间占空比,对应90度
delay(1000);
Serial.println("舵机转动至180度位置");
ledcWrite(channel, maxDuty); // 写入最大占空比,对应180度
delay(1000);
Serial.println("舵机转动回90度位置");
ledcWrite(channel, midDuty);
delay(1000);
}
硬件连接说明
舵机通常有三根线,连接方式如下表所示:
| 舵机线颜色 | ESP32-S3 引脚 | 说明 |
|---|---|---|
| 棕色/黑色 | GND | 接地 |
| 红色 | 5V 或 3.3V | 电源正极 (根据舵机工作电压选择) |
| 橙色/黄色 | GPIO2 (示例) | PWM信号控制线 |
注意:大功率舵机建议使用外部电源供电,避免ESP32-S3开发板稳压器过载 。
关键参数解释
- PWM频率:标准舵机使用50Hz频率,即周期20ms 。
- 脉宽范围:控制角度通过脉宽调制实现,通常0.5ms对应0度,2.5ms对应180度 。
- 占空比计算:16位分辨率下,占空比值 = (脉宽/周期) × 65535 。
多舵机控制
如需控制多个舵机,可复用上述代码逻辑,为每个舵机分配不同的GPIO引脚和LEDC通道 :
// 控制两个舵机的示例
const int servoPin1 = 2;
const int servoPin2 = 3;
const int channel1 = 0;
const int channel2 = 1;
void setup() {
ledcSetup(channel1, 50, 16);
ledcSetup(channel2, 50, 16);
ledcAttachPin(servoPin1, channel1);
ledcAttachPin(servoPin2, channel2);
}
故障排除
- 舵机不转动:检查电源连接是否正常,确保供电电压符合舵机要求 。
- 舵机抖动:检查PWM频率是否准确设置为50Hz,或尝试微调占空比值 。
- ESP32-S3无法烧录程序:确保开发板处于正确的BootLoader模式,按住BOOT键再按RST键进入下载模式 。
更多推荐

所有评论(0)