#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开发板稳压器过载 。

关键参数解释

  1. PWM频率:标准舵机使用50Hz频率,即周期20ms 。
  2. 脉宽范围:控制角度通过脉宽调制实现,通常0.5ms对应0度,2.5ms对应180度 。
  3. 占空比计算: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);
}

故障排除

  1. 舵机不转动:检查电源连接是否正常,确保供电电压符合舵机要求 。
  2. 舵机抖动:检查PWM频率是否准确设置为50Hz,或尝试微调占空比值 。
  3. ESP32-S3无法烧录程序:确保开发板处于正确的BootLoader模式,按住BOOT键再按RST键进入下载模式 。​​​​​​
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐