背景
ESP32想做个typeC充电时呼吸灯的应用,看了开发手册发现带有个LED PWM控制器,可以无需处理器干预实现硬件的PWM脉宽的自由步进,从而实现呼吸灯渐变的效果,主要参考了官方的资料,把调试的过程记录下来
如有异议,欢迎留言指正
概述
LED PWM 控制器主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。LED_PWM控制器总共有16路通道,分为8路高速通道和8路低速通道,可以产生独立的波形来驱动 RGB LED 设备等。
LED PWM控制器最大可生成40MHz的频率,此时占空比分辨率为1,也就是50%固定脉宽;20Mhz时,占空比分辨率为3
LED PWM 控制器的高速通道和低速通道均支持硬件渐变功能【高低速定时器】,可在无需 CPU 干预的情况下自动改变 PWM 信号的占空比,也可由软件改变 PWM 信号的占空比,实现亮度和颜色渐变。此外,低速通道在 Sleep 模式下仍可运行。
架构
LED_PWM架构:4个高速定时器与4个低速定时器分别对应8个高速通道与8个低速通道

LED_PWM通道图

-
时钟源选择器可以选择两个时钟源,分别是APB_CLK
【由CPU_CLK产生】和REF_TICK【由APB_CLK分频产生】,下一期会单独讲下ESP32系统时钟树 -
时钟通过18bit的分配器进行分频,计算公式LEDC_DEV_CLK = A*B/256,A代表高10bit整数部分,B代表低8位小数部分

-
分配器的输出时钟作为计数器的基准时钟,计数器最大有效位为20bit,计数达到2^ LEDC_HSTIMERx_DUTY_RES – 1时,会产生溢出中断;溢出后计数值回滚到0,这也就决定了PWM通道的频率
-
输出频率的计算公式【由分频系数、计数器参与决定】

低速通道与高速通道有两个区别
- 高速定位器的时钟源采用了 REF_TICK 或 APB_CLK,低速定位器采用了 REF_TICK 或 SLOW_CLOCK。置位 LEDC_APB_CLK_SEL 寄存器,SLOW_CLOCK 的频率为 80 MHz,否则为 8 MHz。
- 当软件修改了高速通道计数器的最大值或分频系数的话,输出信号的更新将会在下一次溢出中断之后生效。而低速通道在置位LEDC_LSTIMERx_PARA_UP 之后,立刻更新计数器的计数范围参数和分频器的分频系数。
通道
从通道图中不难发现,每个通道都有两个比较器,分别为high_level_comparator与low_level_comparator
- high_level_comparator:比较值是hpoint,当计数器的值达到hpiot时,输出高电平
- low_level_comparator:比较值是lpoint,当计数器的值等于lpiot时,输出低电平

寄存器
- LEDC_CONF_REG:用于设置 SLOW_CLK 的频率【0 - 8MHz】【1 - 80MHz】
- LEDC_HSCHn_CONF0_REG:选择高速定时器【0 - 3】与使能通道控制
- LEDC_HSCHn_CONF1_REG:高速通道递增递减的占空比与步进的步长值
- LEDC_HSCHn_DUTY_REG:控制输出占空比,配置LPOINT与HPOINT
- LEDC_HSTIMERx_CONF_REG:选择高速时钟APB_CLK或REF_TICK与计数范围、分频系数
- LEDC_DUTY_CHNG_END_LSCHn_INT: 低速通道上的占空比渐变结束触发中断

本文详细介绍了ESP32的LEDPWM控制器,包括其架构、工作原理及如何利用控制器实现呼吸灯效果。LEDPWM控制器可生成高达40MHz的PWM信号,并支持硬件渐变功能,无需CPU干预即可自动改变PWM信号的占空比。
最低0.47元/天 解锁文章
9457

被折叠的 条评论
为什么被折叠?



