16路PWM引脚仅8路可用,需额外配置第二组PWM?
问题分析与解决方案
你的核心问题是未对8、9号PWM通道执行初始化配置,导致对应引脚无法输出PWM信号。
ESP32的LEDC(PWM)确实分为高速组(通道0-7)和低速组(通道8-15),但无论哪组通道,都必须先通过ledcSetup()配置频率、分辨率,才能正常工作。你的代码里仅初始化了通道0、1、2,通道3-9都缺失了ledcSetup步骤,这是8、9号通道失效的直接原因。
修复后的代码
#define Servo_0 13 #define Servo_1 12 #define Servo_2 14 #define Servo_3 27 #define Servo_4 26 #define Servo_5 25 #define Servo_6 33 #define Servo_7 15 #define Servo_8 2 #define Servo_9 4 #define PWM_Channel0 0 #define PWM_Channel1 1 #define PWM_Channel2 2 #define PWM_Channel3 3 #define PWM_Channel4 4 #define PWM_Channel5 5 #define PWM_Channel6 6 #define PWM_Channel7 7 #define PWM_Channel8 8 #define PWM_Channel9 9 #define PWM_Resolution 8 #define PWM_Freq 50 String str; void setup() { // 初始化所有用到的PWM通道 ledcSetup(PWM_Channel0, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel1, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel2, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel3, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel4, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel5, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel6, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel7, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel8, PWM_Freq, PWM_Resolution); ledcSetup(PWM_Channel9, PWM_Freq, PWM_Resolution); // 绑定引脚与通道 ledcAttachPin(Servo_0, PWM_Channel0); ledcAttachPin(Servo_1, PWM_Channel1); ledcAttachPin(Servo_2, PWM_Channel2); ledcAttachPin(Servo_3, PWM_Channel3); ledcAttachPin(Servo_4, PWM_Channel4); ledcAttachPin(Servo_5, PWM_Channel5); ledcAttachPin(Servo_6, PWM_Channel6); ledcAttachPin(Servo_7, PWM_Channel7); ledcAttachPin(Servo_8, PWM_Channel8); ledcAttachPin(Servo_9, PWM_Channel9); } void colorRGB(byte valRed,byte valGreen,byte valBlue) { ledcWrite(PWM_Channel0, valRed); ledcWrite(PWM_Channel1,valGreen); ledcWrite(PWM_Channel2, valBlue); } void head_End() { int vertical = map(100, 0, 180, 10, 35); int horizontal = map(84, 0, 180, 10, 35); ledcWrite(PWM_Channel0,vertical); ledcWrite(PWM_Channel1,horizontal); } void head_Move(int angle_h,int angle_v) { int h = map(angle_h, 0, 180, 10, 35); int v = map(angle_v, 0, 180, 10, 35); ledcWrite(PWM_Channel0,h); ledcWrite(PWM_Channel1,v); } void boxes(int angle1,int angle2) { int box1 = map(angle1, 0, 180, 10, 35); int box2 = map(angle2, 0, 180, 10, 35); ledcWrite(PWM_Channel8,box1); ledcWrite(PWM_Channel9,box2); } void loop() { boxes(0,160); delay(1000); boxes(160,0); delay(1000); }
额外注意事项
- 确认引脚2、4是否支持绑定到LEDC通道8、9:不同ESP32开发板的引脚功能映射可能有差异,若修复后仍异常,需核对硬件手册确认引脚的LEDC通道兼容性。
- 伺服电机的PWM信号范围:你当前用
map(angle, 0, 180, 10, 35),8位分辨率下对应占空比约4%-13.7%,符合伺服电机标准的1ms-2ms脉冲(50Hz下周期20ms),这个配置是合理的。
内容的提问来源于stack exchange,提问作者אופק
相关产品推荐
相关产品推荐

