芯片:esp32s3
开发环境:espidfv4.4
一、官网相关资料
1)LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。 该控制器有 8 路通道,可以产生独立的波形来驱动 RGB LED 等设备。
LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度和颜色渐变(因为这个功能,单独作为一个外设?)
2)设置 LEDC 通道分三步完成。注意,与 ESP32 不同,ESP32-S3 仅支持设置通道为低速模式。
-
定时器配置 指定 PWM 信号的频率和占空比分辨率。
-
通道配置 绑定定时器和输出 PWM 信号的 GPIO。
-
改变 PWM 信号 输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。
另一个可选步骤是可以在渐变终端设置一个中断。(嘛意思)
二、配置流程
1)定时器结构体配置l edc_timer_config_t->ledc_timer_config()
要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构 ledc_timer_config_t 传递给该函数:
-
速度模式(值必须为
LEDC_LOW_SPEED_MODE
)对于ESP32s3 -
定时器索引 ledc_timer_t
-
PWM 信号频率
-
PWM 占空比分辨率
频率和占空比分辨率相互关联。PWM 频率越高,占空比分辨率越低,反之亦然。如果 API 不是用来改变 LED 亮度,而是用于其它目的,这种相互关系可能会很重要。更多信息详见 频率和占空比分辨率支持范围 一节。
2)通道配置ledc_channel_config_t ->ledc_channel_config()
定时器设置好后,请配置所需的通道(ledc_channel_t 之一)。配置通道需调用函数 ledc_channel_config()。
需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t 。
在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。
在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。
3)改变pwm占空比
1、软件设置
ledc_set_duty() :设置新的占空比
ledc_update_duty() :使新配置生效
ledc_get_duty():获取当前占空比
通过ledc_channel_config(),配置时的结构体
占空比数值范围:0
– (2 ** duty_resolution) - 1
2、硬件设置(??)
LED PWM 控制器硬件可逐渐改变占空比的数值
1.使能渐变->ledc_fade_func_install()
之后用下列可用渐变函数之一配置:
最后用 ledc_fade_start() 开启渐变。
如不需要渐变和渐变中断,可用函数 ledc_fade_func_uninstall() 关闭
4)改变pwm频率
-
通过调用函数 ledc_set_freq() 设置频率。可用函数 ledc_get_freq() 查看当前频率。
-
通过调用函数 ledc_bind_channel_timer() 将其他定时器绑定到该通道来改变频率和占空比分辨率。
-
通过调用函数 ledc_channel_config() 改变通道的定时器
5)中断
在 ledc_channel_config_t 中选取参数 ledc_intr_type_t ,在渐变完成时触发中断。
要注册处理程序来处理中断,可调用函数 ledc_isr_register()。这个渐变是嘛
6)频率和占空比分辨率支持范围
1、驱动led:5K频率,13位分辨率
2、提供时钟:40M
3、报错:超过占空比和频率范围,占空比分辨率通常用 ledc_timer_bit_t 设置
7)官方示例
使用 LEDC 改变占空比和渐变控制的实例请参照 peripherals/ledc/ledc_fade。
使用 LEDC 基本实例请参照 peripherals/ledc/ledc_basic。
三、上手敲代码
1)使用 LEDC 基本实例请参照 peripherals/ledc/ledc_basic。非常简单
1、readme:该示例使用5 kHz的固定PWM频率,占空比为50%,并输出GPIO引脚
2、结构体配置:定时器和通道
// Prepare and then apply the LEDC PWM timer configuration
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_MODE, //esp32s3只支持低速率
.timer_num = LEDC_TIMER, //LEDC_TIMER_0
.duty_resolution = LEDC_DUTY_RES,//13bit
.freq_hz = LEDC_FREQUENCY, // Set output frequency at 5 kHz
.clk_cfg = LEDC_AUTO_CLK//auto就能用
};
// Prepare and then apply the LEDC PWM channel configuration
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_MODE,//同样低速
.channel = LEDC_CHANNEL,//通道0
.timer_sel = LEDC_TIMER,//timer0,和定时器结构体参数一致
.intr_type = LEDC_INTR_DISABLE,//关闭中断
.gpio_num = LEDC_OUTPUT_IO,//绑定io5
.duty = 0, // Set duty to 0%
.hpoint = 0
};
结构体初始化:ledc_timer_config(&ledc_timer),ledc_timer_config(&ledc_timer)
3、调整占空比,两步走
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY):设置新占空比
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL):更新应用
2)使用 LEDC 改变占空比和渐变控制的实例请参照 peripherals/ledc/ledc_fade。
1、readme:不啦不啦,没介绍,四个通道,四种模式
* LEDC 1: Fade up / increase intensity
* LEDC 2: Fade down / decrease intensity
* LEDC 3: Keep a stable intensity
* LEDC 4: LED is not on
2、appmain:配置了n个结构体,参考上一个历程,基本一样配置->初始化
有一点不一样:添加了esp32的高速模式(还不知道效果)
多了了个参数.flags.output_invert = 1:反转IO,极性反转?
3、控制占空比方法位上面提到的硬件控制
1.ledc_fade_func_install(0);:安装,参数嘛意思,还设置了一个回调?
4、用到的几个函数
ledc_set_fade_with_time(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, 0, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
max_fade_time_ms:最后一个参数,像是在给定时间范围内达到目标值
ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, 0);
ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel);
照猫画虎就完了,都给你封装好了
总结,用起来很方便,只有几个函数,熟悉就能用
转自:https://blog.csdn.net/HandBAI/article/details/131344769