“深入探究ESP32学习笔记(3):LEDC(PWM)技术”

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

文章目录

  • 前言
  • 一、LEDC介绍
  • 二、使用步骤
  • 1.定时器配置
  • 2.通道配置
  • 3.改变PWM信号
  • 总结

  • 前言

    控制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初始化:

    主函数:

    完整代码

    物联沃分享整理
    物联沃-IOTWORD物联网 » “深入探究ESP32学习笔记(3):LEDC(PWM)技术”

    发表评论