LEDC Basic 示例

[English]

示例说明

LEDC 是用于生成多通道脉冲宽度调制(PWM)信号的专用外设,可用于调节 LED 亮度或控制电机转速等场景。通过 LEDC,可以灵活配置通道、定时器和占空比,从而实现精确的 PWM 信号输出。

本示例展示如何初始化和配置 LEDC 模块,并演示在 PWM 信号输出过程中如何调节占空比。

运行方法

示例完整代码见 LEDC Basic 示例。运行前的配置说明、引脚连接、构建与烧录流程详见示例目录下的 README.md 文件。

如需自定义配置项及查看默认值,可参考 宏定义说明 部分。

头文件说明

本示例所使用的头文件涵盖了系统工具和 LEDC 驱动模块,为任务运行过程中的输入输出、错误处理以及 LEDC 外设的配置和控制提供支持。

各头文件按功能分类如下:

  1. 系统工具 :提供输入输出和错误码管理功能。

#include <stdio.h>
#include "esp_err.h"
  1. LEDC 驱动 :提供 LEDC 配置以及 PWM 波形生成功能。

#include "driver/ledc.h"

宏定义说明

本示例中的宏定义主要用于配置 ESP32 芯片的 LEDC 外设,涵盖定时器、通道、GPIO 引脚、模式、分辨率、占空比和频率。

宏定义按功能分类如下:

  1. 定时器配置

  • 定义 LEDC 使用的定时器,给通道输出提供时钟基准,并决定 PWM 信号的分辨率和频率。定时器数量因芯片型号而异,多数 ESP32 芯片提供 4 个定时器。各个定时器功能相同,区别仅在于占用情况和能否满足所需的配置。本示例中选择定时器 0。

#define LEDC_TIMER LEDC_TIMER_0
  1. 通道、模式与 GPIO 配置

  • 定义输出 GPIO 引脚,本示例中设置为 GPIO5。可通过将该引脚连接至示波器观察输出信号的波形。

#define LEDC_OUTPUT_IO (5)
  • 定义 LEDC 使用的通道,用于将定时器产生的 PWM 信号映射到实际的 GPIO 引脚。通道数量因芯片型号而异,通道功能本质上相同,每个通道可独立设置占空比。本示例中选择通道 0。

#define LEDC_CHANNEL LEDC_CHANNEL_0
  • 定义 LEDC 模式,可选择高速模式或低速模式(部分芯片仅支持低速模式)。高速模式下参数更新立即生效,低速模式则需同步操作但功耗更低。具体说明及差异可参考 模式说明。本示例中使用低速模式。

#define LEDC_MODE LEDC_LOW_SPEED_MODE
  1. LEDC 参数配置

  • 定义分辨率,用于决定 PWM 占空比的调节精度。分辨率越高,占空比调节越细腻,但最大可支持的频率会降低。本示例中设置为 13 位分辨率。其对应的占空比范围为 0 到 8191(2^13 - 1)。

#define LEDC_DUTY_RES           LEDC_TIMER_13_BIT

备注

在部分 ESP32 芯片上,当 LEDC 占空比分辨率配置为硬件支持的最大值时,无法输出 100% 占空比。实际应用中可通过降低分辨率或将占空比设置为接近最大值的方式规避该限制。

  • 定义占空比,用于决定 PWM 信号的“开/关时间比例”,直接影响输出功率或亮度。示例中定义为 50% 占空比,即信号开关时间相同。

#define LEDC_DUTY               (4096)

备注

占空比的百分比可以通过公式 数值 = 占空比百分比 × 2^N 转换为具体数值,其中 N 为分辨率位数。例如,当占空比为 50% 时,计算结果为 0.5 × 2^13 = 4096,因此在 13-bit 分辨率下,4096 就对应于 50% 占空比。

  • 定义频率,用于决定 PWM 信号的周期快慢,影响外设响应。频率越高会降低分辨率上限。示例中定义为 50% 占空比,即信号开关时间相同。

#define LEDC_FREQUENCY          (4000)

备注

在实际应用中,参数选择通常遵循以下思路:

  1. 先确定应用场景需要的频率范围;

  2. 再选择能满足精度要求的分辨率

  3. 最后根据实际需求设置占空比。

任务函数说明

本示例仅包含 LEDC 初始化函数,用于配置 ESP32 的定时器和通道,以便输出 PWM 信号。

LEDC 初始化函数

example_ledc_init() 用于初始化 ESP32 的 LEDC 外设,完成 PWM 信号输出所需的定时器和通道配置。

  1. 定时器配置:用于确定 PWM 的频率与分辨率。

  • 定义结构体 ledc_timer_config_t 用于 配置定时器

  • 调用 ledc_timer_config() 应用以上定时器配置。更多功能和参数说明可参考 LED PWM 控制器 API

  1. 通道配置:用于绑定 GPIO,并设置初始占空比。

  • 定义结构体 ledc_channel_config_t 用于 配置通道

    • 结构体成员 hpoint 用于配置信号高电平的起始点(相位控制),其取值范围和占空比分辨率相同,通过调整 hpoint 可以实现输出波形的相位偏移。

    • 结构体成员 sleep_mode 用于指定在 Light Sleep 模式下该通道的行为,例如保持输出电平或关闭输出。

    • 结构体成员 flags.output_invert 用于设置是否反转输出波形,取值 0 表示正常输出,1 表示将高低电平取反,主要用于匹配外设的低电平有效逻辑、保持系统信号兼容,或优化开关器件特性,同时可在调节 LED 等设备亮度时反转高低电平方向。

  • 调用 ledc_channel_config() 应用以上通道配置。更多功能和参数说明可参考 LED PWM 控制器 API

初始化完成后,LEDC 外设即可按照设定的频率和占空比输出 PWM 信号。上述初始化配置步骤具有通用性,适用于所有涉及 LEDC 的应用场景,仅需根据实际需求调整相关参数。

主函数说明

本示例演示了 ESP32 LEDC 外设的初始化与 PWM 波形输出,实现通过指定 GPIO 引脚产生固定占空比的 PWM 信号。

  1. 调用任务函数 example_ledc_init() 初始化 LEDC 外设,完成定时器和通道配置,为 PWM 信号输出做好准备。

  2. 改变占空比

  • 调用 ledc_set_duty() 设置 PWM 占空比为 LEDC_DUTY (宏定义,为 50% 占空比),确定高电平与低电平的比例。更多功能和参数说明可参考 LED PWM 控制器 API

  • 调用 ledc_update_duty() 将设置的占空比应用到指定 LEDC 通道,输出对应的 PWM 波形。更多功能和参数说明可参考 LED PWM 控制器 API

备注

  • 在配置通道时通常将占空比设置为 0,使输出保持低电平。这是为了确保初始化过程中不会立即输出有效 PWM 信号,避免 LED 突然点亮或电机意外启动。

  • 初始化完成后,可通过调用 API 根据实际需求调整占空比,从而安全地控制输出信号。

程序现象

示例运行后,GPIO 引脚以固定频率输出 PWM 信号,波形呈周期性方波,可用于 LED 调光、风扇或其他外设控制

在本示例中,PWM 信号占空比设置为 50%,高低电平持续时间相等,各占半周期。为了直观展示占空比的效果,还展示了 25%、75% 占空比以及 50% 占空比反转输出的波形示例。波形中,高电平持续时间随占空比变化而变化,反转输出则高低电平互换,但周期和占空比比例保持不变。通过这些波形示例,可以直观观察不同占空比和反转输出对信号形态的影响。

LEDC output waveform