ESP32 学习笔记(十一)LED Control

LED Control

介绍

LED控制(LEDC)模块主要用于控制LED的强度,尽管它也可用于生成PWM信号以用于其他目的。 它有16个通道可以产生独立的波形,可以用来驱动例如 RGB LED设备。

所有LEDC通道中有一半提供高速操作模式。 该模式提供硬件实现,自动和无干扰的PWM占空比改变。 另一半通道在低速模式下运行,其中变化的时刻取决于应用软件。 每组通道也能够使用不同的时钟源,但API中未实现此功能。

PWM控制器还能够逐渐自动增加或减少占空比,允许在没有任何处理器干扰的情况下衰减。

功能概述

让LEDC在高速或低速模式下在特定通道上工作分三步完成:

  • 配置定时器以确定PWM信号的频率和数字(占空比分辨率)。
  • 通过将通道与定时器和GPIO相关联来配置通道,以输出PWM信号。
  • 更改PWM信号,驱动输出以改变LED的强度。 这可以在软件的完全控制下或在硬件衰落功能的帮助下完成。

在可选步骤中,还可以在淡入淡出端设置中断。
这里写图片描述

配置定时器

通过调用函数ledc_timer_config()来完成定时器的设置。 应为此函数提供包含以下配置设置的数据结构ledc_timer_config_t:

  • 定时器号ledc_timer_t和速度模式ledc_mode_t
  • PWM信号的频率和PWM占空比值的分辨率会发生变化。

频率和任务分辨率是相互依赖的。 PWM频率越高,可提供更低的占空比分辨率,反之亦然。 如果您计划将此API用于其他改变LED强度的目的,这种关系可能会变得很重要。 有关更多详细信息,请查看支持的频率范围和占空比分辨率

配置通道

设置定时器后,下一步是配置所选通道(ledc_channel_t中的一个)。 这是通过调用函数ledc_channel_config()来完成的。

以类似的方式,与定时器配置类似,应为通道设置功能提供特定结构ledc_channel_config_t,其中包含通道的配置参数。

此时,通道应开始工作,并开始生成由定时器设置和所选GPIO上的占空比确定的频率PWM信号,如ledc_channel_config_t中所配置。 可以通过调用函数ledc_stop()随时暂停通道操作/信号生成。

改变 PWM 信号

一旦通道工作并产生恒定占空比和频率的PWM信号,有几种方法可以改变这个信号。 在驱动LED时,我们主要改变了改变光强度的职责。 请参阅下面的两部分,了解如何通过软件或硬件衰减来更改占空比。 如果需要,我们也可以更改信号的频率,这将在更改PWM频率部分中介绍。

通过软件更改PWM占空比

通过首先调用专用函数ledc_set_duty()然后调用ledc_update_duty()来使更改生效来完成任务的设置。 要检查当前设置的值,有一个相应的_get_函数ledc_get_duty()

设置占空比和其他一些通道参数的另一种方法是调用上一节中讨论的ledc_channel_config()

输入函数的占空比值的范围取决于所选的duty_resolution,并且应该从0到(2 ** duty_resolution) - 1.例如,如果选择的占空比分辨率为10,则占空比范围为0到1023.这提供了 分辨率为~0.1%。

通过硬件衰落改变PWM占空比

LEDC硬件提供了从一个占空值逐渐淡入另一个值的方法。 要使用此功能,首先使用ledc_fade_func_install()启用淡入淡出。 然后通过调用一个可用的淡入淡出函数来配置它:

  • ledc_set_fade_with_time()
  • ledc_set_fade_with_step()
  • ledc_set_fade()

最后用ledc_fade_start()开始淡出。

如果不再需要,可以使用ledc_fade_func_uninstall()禁用衰落和相关中断。

改变PWM频率

LEDC API提供了几种“动态”改变PWM频率的方法。

  • 其中一个选项是调用ledc_set_freq()。 有一个相应的函数ledc_get_freq()来检查当前设置的频率。
  • 另一种改变频率和占空比分辨率的方法是调用ledc_bind_channel_timer()将其他定时器绑定到通道。
  • 最后,可以通过调用ledc_channel_config()来更改通道的计时器。

更多控制PWM

有几个低级定时器特定功能,可用于提供更改PWM设置的其他方法:

  • ledc_timer_set()
  • ledc_timer_rst()
  • ledc_timer_pause()
  • ledc_timer_resume()
    前两个函数被ledc_channel_config()称为“幕后”,以便在配置后提供“干净”的计时器启动。

使用中断

配置LEDC通道时,在ledc_channel_config_t中选择的参数之一是ledc_intr_type_t,并允许在淡入淡出完成时启用中断。

通过调用ledc_isr_register()来注册处理此中断的处理程序。

LEDC高低速模式

LED PWM控制器中共有8个定时器和16个通道,其中一半专用于高速模式,另一半专用于低速模式。 选择低速或高速“有能力”定时器或通道是通过适用的函数调用中存在的参数ledc_mode_t来完成的。

高速模式的优点是支持h / w,定时器设置无故障切换。 这意味着如果修改了定时器设置,则在定时器的下一个溢出中断后将自动应用更改。 相反,在更新低速定时器时,应特别由软件触发设置更改。 LEDC API正在“幕后”进行,例如, 当调用ledc_timer_config()ledc_timer_set()时。

有关速度模式的更多详细信息,请参阅ESP32技术参考手册(PDF)。 请注意,本手册中提到的对SLOW_CLOCK的支持未在LEDC API中实现。

支持的频率和占空比分辨率范围

LED PWM控制器主要用于驱动LED,并提供宽泛的PWM占空比设置。 例如,对于5 kHz的PWM频率,最大占空比分辨率为13位。 这意味着占空比可以设置在0到100%之间,分辨率为~0.012%(13 ** 2 = 8192 LED强度的离散电平)。

LEDC可以用于以更高的频率提供信号以对其他设备进行计时,例如, 数码相机模块。 在这种情况下,最大可用频率为40 MHz,占空比分辨率为1位。 这意味着税率固定在50%,无法调整。

API用于在尝试设置超出LEDC硬件范围的频率和占空比分辨率时报告错误。 例如,尝试将频率设置为20 MHz且占空比分辨率为3位将导致串行监视器上报告以下错误:

E (196) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=128

在这种情况下,应降低占空比分辨率或频率。 例如,将占空比分辨率设置为2将解决该问题,并提供以25%步长设置占空比的可能性,即25%,50%或75%。

LEDC API还将捕获并报告尝试配置低于支持的最小值的频率/任务分辨率组合,例如:

E (196) ledc: requested frequency and duty resolution can not be achieved, try increasing freq_hz or duty_resolution. div_param=128000000

通常使用ledc_timer_bit_t来设置占空比分辨率。 该枚举涵盖10到15位的范围。 如果需要较小的占空比分辨率(低于10至1),请直接输入等效数值。

应用示例

LEDC改变占空比和衰落控制示例:peripherals/ledc.

API Reference

Header File

猜你喜欢

转载自blog.csdn.net/qq_27114397/article/details/81636903