esp32学习笔记(3)——LEDC(PWM)

本文介绍了ESP32如何利用LEDC模块进行PWM控制,包括LEDC的高速和低速模式、占空比分辨率以及频率设置。详细阐述了配置定时器、通道以及改变PWM信号的步骤,提供了相关的API函数调用示例,并讨论了软件和硬件改变PWM占空比的方法。此外,还提及了中断处理和渐变功能的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

控制led灯渐变
硬件:esp32
idf版本:4.3.2
官方介绍
提示:以下是本篇文章正文内容,下面案例可供参考

一、LEDC介绍

LEDC 通道共有两组,分别为 8 路高速通道和 8 路低速通道。
高速通道模式在硬件中实现,可以自动且无干扰地改变 PWM 占空比。
低速通道模式下,PWM 占空比需要由软件中的驱动器改变。
每组通道都可以使用不同的时钟源。
在这里插入图片描述
1、Speed Mode
LED PWM 控制器高速和低速模式,高速模式的优点是可平稳地改变定时器设置。
意思就是说高速模式下,如果定时器的设置发生了改变,那么在下一次定时器的溢出中断中就会自动改变;但是低速模式下不会自动改变的。
2、频率和占空比分辨率支持范围:
这个先了解一下占空比和分辨率
占空比:就是高电平接通时间与周期的比
例如:一个PWM频率为1000hz,那周期是1ms,如果高电平时间是100us,那么占空比就是100us:1ms=1:10;
分辨率:就是占空比的最小值
是根据PWM的位数计算的,1:2^位数,如果位数是8,那么PWM的分辨率就是1:255,要是想要达到这个分辨率那就要计数器从0计算到255才行,如果计数值太小,那么他的分辨率就达不到1:255,那PWM的输出频率就变高了。
对于esp32控制器 PWM 占空比设置的分辨率范围较广。比如,PWM 频率为 5 kHz 时,占空比分辨率最大可为 13 位。这意味着占空比可为 0 至 100% 之间的任意值,分辨率为 ~0.012%(1/(2 * 13 )= 1/8192)。PWM 频率越高,占空比分辨率越低

二、使用步骤

1、定时器配置 指定 PWM 信号的频率和占空比分辨率。
2、通道配置 绑定定时器和输出 PWM 信号的 GPIO。
3、改变 PWM 信号 输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。

1.定时器配置

要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构 ledc_timer_config_t 传递给该函数:
在这里插入图片描述

速度模式 ledc_mode_t
定时器索引 ledc_timer_t
PWM 信号频率
PWM 占空比分辨率
时钟源 ledc_clk_cfg_t

时钟源设置的越高,可以配置的PWM的频率就越高
在这里插入图片描述

#include "driver/ledc.h"

2.通道配置

定时器设置好后,配置所需的通道(ledc_channel_t 之一)。配置通道需调用函数ledc_channel_config()。
通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t
在这里插入图片描述

此时,通道会按照 ledc_channel_config_t 的配置开始运作,并在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。

3.改变PWM信号

通道开始运行、生成具有恒定占空比和频率的 PWM 信号之后,有几种方式可以改变该信号。驱动 LED 时,主要通过改变占空比来变化光线亮度。
1、使用软件改变PWM占空比
(1)调用函数 ledc_set_duty() 设置新的占空比。
调用函数 ledc_update_duty() 使新配置生效。
调用函数 ledc_get_duty()查看当前设置的占空比,

(2)调用函数 ledc_channel_config()重新传参。
传递给函数的占空比数值范围取决于选定的 duty_resolution,应为 0 至 (2 ** duty_resolution) - 1。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 0 至 1023。此时分辨率为 ~0.1%。
2、使用硬件改变PWM占空比
LED PWM 控制器硬件可逐渐改变占空比的数值
需用函数 ledc_fade_func_install() 使能渐变,之后用下列可用渐变函数之一配置:

ledc_set_fade_with_time()设置LEDC淡出功能有时间限制。
ledc_set_fade_with_step()
ledc_set_fade()

最后需要调用 ledc_fade_start() 开启渐变。渐变可以在阻塞或非阻塞模式下运行。需要特别注意的是,不管在哪种模式下,下一次渐变或单次占空比配置的指令生效都必须等到前一次渐变结束。由于 ESP32 的硬件限制,在渐变达到原先预期的占空比前想要中止本次渐变是不被支持的。
此外,在使能渐变后,每个通道都可以额外通过调用 ledc_cb_register() 注册一个回调函数用以获得渐变完成的事件通知。
如不需要渐变和渐变中断,可用函数 ledc_fade_func_uninstall() 关闭
3、改变PWM的频率

1)用函数 ledc_set_freq() 设置频率。
用函数 ledc_get_freq() 查看当前频率。
(2)用函数 ledc_bind_channel_timer() 将其他定时器绑定到该通道来改变频率和占空比分辨率。
(3)通过调用函数 ledc_channel_config() 改变通道的定时器。

总结

对于LED PWM的控制中也可以使用其他函数来更改PWM的设置,如

ledc_timer_set()
ledc_timer_rst()
ledc_timer_pause()
ledc_timer_resume()

对于中断来说,可以在, ledc_channel_config_t 中选取参数 ledc_intr_type_t ,在渐变完成时触发中断。
要注册处理程序来处理中断,可调用函数 ledc_isr_register()。

附上代码:
PWM初始化:
在这里插入图片描述
主函数:
在这里插入图片描述
完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值