文章目录
- 功能概览
- 定时器配置
- 通道配置
- 改变`PWM`信号
- 使用软件改变`PWM`占空比
- 使用硬件改变`PWM`占空比
- 改变`PWM`频率
- 控制`PWM`的更多方式
- 中断相关的
- 高速低速模式
- 官方新`API`
功能概览
设置
LEDC
通道在高速模式或低速模式下运行,需要进行如下配置:
- 定时器配置指定
PWM
信号的频率和占空比分辨率。- 通道配置绑定定时器和输出
PWM
信号的GPIO
。- 改变
PWM
信号输出PWM
信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。另一个可选步骤是可以在渐变终端设置一个中断。
定时器配置
要设置定时器,可调用函数
ledc_timer_config()
,并将包括如下配置参数的数据结构ledc_timer_config_t
传递给该函数:
#define LEDC_TIMER LEDC_TIMER_0 // 使用哪个定时器0-3
#define LEDC_MODE LEDC_HIGH_SPEED_MODE// 模式(分为高速,低速)
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT, // PWM占空比分辨率(1`15)
.freq_hz = 5000, // PWM信号频率
.speed_mode = LEDC_MODE, // 定时器模式
.timer_num = LEDC_TIMER, // 定时器序号
// .clk_cfg = LEDC_AUTO_CLK, // 自动选择源时钟
};
ledc_timer_config(&ledc_timer);
频率和占空比分辨率相互关联。
PWM
频率越高,占空比分辨率越低,反之亦然。
通道配置
定时器设置好后,请配置所需的通道(
ledc_channel_t
之一)。配置通道需调用函数ledc_channel_config()
。 通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体ledc_channel_config_t
。
#define LEDC_TOTAL_NUM 1 // LED个数,可以多个
#define LEDC_GPIO 4 // LED控制器通道对应GPIO
#define LEDC_CHANNEL LEDC_CHANNEL_0 // LED控制器通道号
ledc_channel_config_t ledc_channel[LEDC_TOTAL_NUM] = {
{
.channel = LEDC_CHANNEL, //选择通道
.duty = 0, //设置占空比
.gpio_num = LEDC_GPIO, //选择引脚
.speed_mode = LEDC_MODE, //设置速度模式
.timer_sel = LEDC_TIMER //设置定时器
},//若还有引脚另起一个
};
// 配置LED控制器
for (int ch = 0; ch < LEDC_TOTAL_NUM; ch++) {
ledc_channel_config(&ledc_channel[ch]);
}
此时,通道会按照
ledc_channel_config_t
的配置开始运作,并在选定的GPIO
上生成由定时器设置指定的频率和占空比的PWM
信号。在通道运作过程中,可以随时通过调用函数ledc_stop()
将其暂停。
改变PWM
信号
通道开始运行、生成具有恒定占空比和频率的
PWM
信号之后,有几种方式可以改变该信号。驱动 LED 时,主要通过改变占空比来变化光线亮度。
使用软件改变PWM
占空比
调用函数
ledc_set_duty()
可以设置新的占空比。之后,调用函数ledc_update_duty()
使新配置生效。要查看当前设置的占空比,可使用函数ledc_get_duty()
。传递给函数的占空比数值范围取决于选定的
duty_resolution
(占空比分辨率),应为 0 至(2^duty_resolution) - 1
。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 0 至 1023。此时分辨率为 ~0.1%。
使用硬件改变PWM
占空比
LED
PWM
控制器硬件可逐渐改变占空比的数值。要使用此功能,需用函数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
频率
LED
PWM
控制器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()
在后台运行,在定时器配置后启动。
中断相关的
配置 LED
PWM
控制器通道时,可在ledc_channel_config_t
中选取参数ledc_intr_type_t
,在渐变完成时触发中断。要注册处理程序来处理中断,可调用函数
ledc_isr_register()
。
高速低速模式
高速模式的优点是可平稳地改变定时器设置。也就是说,高速模式下如定时器设置改变,此变更会自动应用于定时器的下一次溢出中断。而更新低速定时器时,设置变更应由软件显式触发。LED
PWM
驱动的设置将在硬件层面被修改,比如在调用函数ledc_timer_config()
或ledc_timer_set()
时
官方新API
使用一下函数必须提前调用
ledc_fade_func_install(0)
函数
esp_err_t ledc_set_duty_and_update(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty, uint32_t hpoint);
esp_err_t ledc_set_fade_time_and_start(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t max_fade_time_ms, ledc_fade_mode_t fade_mode);
esp_err_t ledc_set_fade_step_and_start(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_num, ledc_fade_mode_t fade_mode);