【玩转ESP32】15、PWM调光

2021-07-23 14:19:32 浏览数 (1)

点击上方[物联网思考],选择置顶,第一时间查看物联网分享!

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_numesp_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——————

0 人点赞