点击上方[物联网思考],选择置顶,第一时间查看物联网分享!
1、前言
ESP32的PWM功能,官方叫做LEDC(LED PWM Controller module),主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。该控制器有 8 路高速通道和 8 路低速通道,可以产生独立的波形来驱动 RGB LED 设备等。
2、API说明
与ledc功能相关API的位于components/driver/ledc对应的.c和.h文件。
2.1、LEDC timer配置结构体变量
ledc_timer_config_t
:LEDC timer配置结构体,用于配置速度、频率、时钟等。
2.2、LEDC timer配置
代码语言:javascript复制esp_err_t ledc_timer_config(const ledc_timer_config_t* timer_conf);
timer_conf
:LEDC timer配置结构体指针,也就是2.1中的变量指针;
esp_err_t
:返回值,ESP_OK
表示成功。
2.3、LEDC通道配置结构体变量
ledc_channel_config_t
:LEDC 通道配置结构体,用于配置引脚、通道、占空比等参数。
2.4、LEDC通道配置
代码语言:javascript复制esp_err_t ledc_channel_config(const ledc_channel_config_t* ledc_conf);
ledc_conf
:LEDC 通道配置结构体指针,也就是2.3中的变量指针;
esp_err_t
:返回值,ESP_OK
表示成功。
2.5、安装LEDC渐变功能
代码语言:javascript复制esp_err_t ledc_fade_func_install(int intr_alloc_flags);
intr_alloc_flags
:用于分配中断的标志,使用这个函数会占用LEDC模块的中断;
esp_err_t
:返回值,ESP_OK
表示成功。
2.6、LEDC渐变步长
代码语言:javascript复制esp_err_t ledc_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_num);
speed_mode
:LECD速度;
channel
:通道;
target_duty
:目标占空比;
scale
:增加或者减少的步长;
cycle_num
:
esp_err_t
:返回值,ESP_OK
表示成功。
2.7、开启LEDC渐变功能
代码语言:javascript复制esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode);
speed_mode
:LEDC速度;
channel
:通道;
fade_mode
:是否阻塞模式。
3、代码实现
设置两个通道,一个用于输出固定占空比的pwm,用led亮灭来指示, 一个输出渐变的pwm,用led呼吸形式指示。
代码语言:javascript复制void app_main(void)
{
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_10_BIT, // resolution of PWM duty
.freq_hz = 1, // frequency of PWM signal
.speed_mode = LEDC_HIGH_SPEED_MODE, // timer mode
.timer_num = LEDC_TIMER_0, // timer index
.clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock
};
ledc_timer_config(&ledc_timer);
ledc_timer.timer_num = LEDC_TIMER_1, // timer index
ledc_timer.duty_resolution = LEDC_TIMER_8_BIT,
ledc_timer.freq_hz = 200,
ledc_timer_config(&ledc_timer);
ledc_channel_config_t ledc_channel[2] = {
{
.channel = LEDC_CHANNEL_0,
.duty = 512,
.gpio_num = 25,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.hpoint = 0,
.timer_sel = LEDC_TIMER_0
},
{
.channel = LEDC_CHANNEL_1,
.duty = 128,
.gpio_num = 26,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.hpoint = 0,
.timer_sel = LEDC_TIMER_1
}
};
// Set LED Controller with previously prepared configuration
for (int ch = 0; ch < 2; ch ) {
ledc_channel_config(&ledc_channel[ch]);
}
// Initialize fade service.
ledc_fade_func_install(0);
while (1) {
ledc_set_fade_with_step(ledc_channel[1].speed_mode,
ledc_channel[1].channel,
256,
2,
1);
ledc_fade_start(ledc_channel[1].speed_mode,
ledc_channel[1].channel, LEDC_FADE_WAIT_DONE);
ledc_set_fade_with_step(ledc_channel[1].speed_mode,
ledc_channel[1].channel,
0,
2,
1);
ledc_fade_start(ledc_channel[1].speed_mode,
ledc_channel[1].channel, LEDC_FADE_WAIT_DONE);
}
}
4、现象
——————END——————