文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 概述
- 功能概览
- 一、程序编写
- 1.引入库
- 2.定义宏
- 2.主函数
- 1.定时器配置
- 2. 通道配置
- 3.改变 PWM 信号 输出
- 3.1 使用硬件渐变改变 PWM 信号
- 3.2 使用软件渐变改变 PWM 信号
- 总结
概述
LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。
该控制器有 6 路通道,可以产生独立的波形来驱动 RGB LED 等设备。
LED PWM 控制器可以用于生成六路独立的数字波形,具有如下特性:
- 波形的周期和占空比可配置,占空比精确度可达 18 位
- 多种时钟源选择,包括 APB 总线时钟、外置主晶振时钟
- 可在 Light-sleep 模式下工作
- 支持硬件自动步进式地增加或减少占空比,可用于 LED RGB 彩色梯度发生器
功能概览
设置 LEDC 通道分三步完成。
注意,与 ESP32 不同,ESP32-C3 仅支持设置通道为低速模式。
- 定时器配置 指定 PWM 信号的频率和占空比分辨率。
- 通道配置 绑定定时器和输出 PWM 信号的 GPIO。
- 改变 PWM 信号 输出 PWM 信号来驱动 LED。
可通过软件控制或使用硬 件渐变功能来改变 LED 的亮度。
一、程序编写 1.引入库
代码如下(示例):
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "esp_err.h"
2.定义宏
代码如下:
#if CONFIG_IDF_TARGET_ESP32C3
#define LEDC_LS_TIMER LEDC_TIMER_1
#define LEDC_LS_MODE LEDC_LOW_SPEED_MODE
#define LEDC_LS_CH0_GPIO (12)
#define LEDC_LS_CH0_CHANNEL LEDC_CHANNEL_0
#define LEDC_LS_CH1_GPIO (13)
#define LEDC_LS_CH1_CHANNEL LEDC_CHANNEL_1
#endif
#define LEDC_TEST_CH_NUM (2)
#define LEDC_TEST_DUTY (4000)
#define LEDC_TEST_FADE_TIME (3000)
2.主函数 1.定时器配置
要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构 ledc_timer_config_t 传递给该函数:
//1.定时器配置 指定 PWM 信号的频率和占空比分辨率。
/*
* Prepare and set configuration of timers
* that will be used by LED Controller
*/
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT, // resolution of PWM duty
.freq_hz = 5000, // frequency of PWM signal
.speed_mode = LEDC_LS_MODE, // timer mode
.timer_num = LEDC_LS_TIMER, // timer index
.clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock
};
ledc_timer_config(&ledc_timer);
频率和占空比分辨率相互关联。
PWM 频率越高,占空比分辨率越低,反之亦然。
定时器设置好后,请配置所需的通道(ledc_channel_config_t)。
配置通道需调用函数 ledc_channel_config()。
通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t 。
此时,通道会按照 ledc_channel_config_t 的配置开始运作,并在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。
在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。
//2.通道配置 绑定定时器和输出 PWM 信号的 GPIO。
/*
* Prepare individual configuration
* for each channel of LED Controller
* by selecting:
* - controller's channel number
* - output duty cycle, set initially to 0
* - GPIO number where LED is connected to
* - speed mode, either high or low
* - timer servicing selected channel
* Note: if different channels use one timer,
* then frequency and bit_num of these channels
* will be the same
*/
ledc_channel_config_t ledc_channel[LEDC_TEST_CH_NUM] = {
#if CONFIG_IDF_TARGET_ESP32C3
{
.channel = LEDC_LS_CH0_CHANNEL,
.duty = 0,
.gpio_num = LEDC_LS_CH0_GPIO,
.speed_mode = LEDC_LS_MODE,
.hpoint = 0,
.timer_sel = LEDC_LS_TIMER
},
{
.channel = LEDC_LS_CH1_CHANNEL,
.duty = 0,
.gpio_num = LEDC_LS_CH1_GPIO,
.speed_mode = LEDC_LS_MODE,
.hpoint = 0,
.timer_sel = LEDC_LS_TIMER
},
#endif
};
// Set LED Controller with previously prepared configuration
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_channel_config(&ledc_channel[ch]);
}
// Initialize fade service.
ledc_fade_func_install(0);
3.改变 PWM 信号 输出
3.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() 关闭。
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_fade_with_time(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
}
3.2 使用软件渐变改变 PWM 信号
调用函数 ledc_set_duty() 可以设置新的占空比。
之后,调用函数 ledc_update_duty() 使新配置生效。
要查看当前设置的占空比,可使用 get 函数 ledc_get_duty()。
- ledc_set_duty()
- ledc_update_duty()
- ledc_get_duty()
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_TEST_DUTY);
ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel);
}
总结
完整例程:https://download.csdn.net/download/tengyihong/85142299
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)