这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【M5stackS3】使用库函数PWM功能

共1条 1/1 1 跳转至

【M5stackS3】使用库函数PWM功能

高工
2026-06-13 09:56:16     打赏

一: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;驱动舵机用 50Hz

1.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的旧版本进行安装。

安装完成后,重新编译,程序即可通过。




关键词: arduino     PWM     stack    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]