一:ESP32-S3的PWM知识
在ESP32-S3中有两个硬件外设可以输出PWM信号,分别是LED PWM 控制器 (LEDC) 和 电机控制脉宽调制器 (MCPWM)。它们各有其特点和用途:
LED PWM 控制器 (LEDC):这个模块的主要设计目标是产生高精度的 PWM 波形,用以控制 LED 灯的亮度或者产生声音。LEDC 的分辨率可以达到 16 位,能够产生准确且平滑的变化,适用于控制 LED 灯的亮度和产生声音。并且,LEDC 支持多达 8 个通道的 PWM 输出,且支持任意的GPIO引脚。用户可以配置每个通道的频率和占空比。
电机控制脉宽调制器 (MCPWM):这个模块主要用于马达控制,包括伺服马达、步进马达和普通电机。MCPWM 支持更加复杂的控制模式,如电机的向前/向后驱动、断电刹车等,并且支持闭环控制模式,能满足更复杂的电机控制需求。MCPWM 支持高达1个通道的独立 PWM 输出,并且支持死区控制和外部信号捕获。
总的来说,它们两者在处理 PWM 方面有所不同,并被应用于不同的场景。LEDC 更加适合控制灯光、声音等线性设备,而 MCPWM 包含更高级的功能,适合电机控制。我们以LED PWM 控制器作为案例输出PWM,后面简称LEDC。1.1频率(Frequency)
PWM 信号每秒的周期数,单位为 Hz。例如,控制 LED 人眼无闪烁通常用 1kHz~5kHz;驱动舵机用 50Hz1.2 占空比分辨率(Duty Resolution)
用多少位来表示一个周期内高电平的时间比例。例如:
8 位分辨率 → 占空比值范围 0 ~ 255(2^8 - 1)
10 位分辨率 → 范围 0 ~ 1023(2^10 - 1)
分辨率越高,调节越精细
1.3 频率与分辨率的关系
这是 LEDC 的核心知识点:频率和分辨率相互制约,呈反比关系
总结如下所示:
ESP32-S3 的 LEDC 外设是一个功能完备的 PWM 发生器:
通道数:8 路独立输出,可自由映射到任意 GPIO
频率范围:从极低到 40MHz,覆盖多种应用
硬件渐变:支持自动平滑过渡,解放 CPU
核心限制:仅支持低速模式,所有更新需软件触发
频率与分辨率:两者相互制约,配置时需权衡
二:软件代码:
一:PWM初始化:#define SIGNAL 5
int freq = 10000;
int ledChannel1 = 0;
int resolution = 10;
void setup() {
auto cfg = M5.config();
AtomS3.begin(cfg);
AtomS3.Display.setTextColor(GREEN);
AtomS3.Display.setTextDatum(middle_center);
AtomS3.Display.setFont(&fonts::Orbitron_Light_24);
AtomS3.Display.setTextSize(1);
AtomS3.Display.drawString("PWM", AtomS3.Display.width() / 2,
AtomS3.Display.height() / 2);
// ledcSetup(ledChannel1, freq, resolution);
// ledcAttachPin(SIGNAL, ledChannel1);
ledcAttach(SIGNAL, freq, resolution);
}PWM处理函数:void loop() {
for (int i = 0; i < 500; i++) {
// ledcWrite(ledChannel1, i);
ledcWriteChannel(ledChannel1, i);
delay(2);
}
for (int i = 500; i > 0; i--) {
// ledcWrite(ledChannel1, i);
ledcWriteChannel(ledChannel1, i);
delay(2);
}
}三:遇到的问题使用库函数编译报错,解决办法:
这个编译错误很常见,原因是使用的ESP32开发板包版本是3.0或更高,而示例程序用的是旧版(2.x)的PWM函数名。新版本里ledcSetup和ledcAttachPin这两个函数已经被移除了。
解决办法:
初始化PWM并绑定引脚:ledcAttach(引脚, 频率, 分辨率);
设置占空比:ledcWriteChannel(通道, 占空比值);
当然我们可以将使用的库版本进行降低版本使用:也就是使用旧版环境,但不推荐,因为这会让以后的项目都只能用旧版函数。
方法如下所示:
在Arduino IDE中,打开 工具 > 开发板 > 开发板管理器,搜索 ESP32。
找到 esp32 by Espressif Systems,在版本下拉框中选择 2.0.17 或任何2.x的旧版本进行安装。
安装完成后,重新编译,程序即可通过。
我要赚赏金
