天天看點

【玩轉ESP32】17、PWM調光

系列文章:

【玩轉ESP32】1、開發環境搭建

【玩轉ESP32】2、開發參考資料

【玩轉ESP32】3、點亮LED,Blink,blink,blink

【玩轉ESP32】4、ESP32驅動DHT11

【玩轉ESP32】5、i2c-tools通路i2c裝置

【玩轉ESP32】6、驅動i2c裝置—0.96 OLED

【玩轉ESP32】7、ESP32連接配接wifi

【玩轉ESP32】8、ESP32 Guru Meditation Error報錯分析

【玩轉ESP32】9、ESP32 作為TCP用戶端連接配接伺服器(非阻塞接收)

【玩轉ESP32】10、建立使用者分區表,資料讀寫存儲

【玩轉ESP32】11、編譯報錯:esp_bt.h:No such file or directory

【玩轉ESP32】12、esp32序列槽使用

【玩轉ESP32】13、軟體定時器esp_timer使用

【玩轉ESP32】14、esp32 mqtt基礎

【玩轉ESP32】15、esp32 mqtt client

【玩轉ESP32】16、esp32擷取rssi,輔助判斷硬體是否異常

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配置

timer_conf

:LEDC timer配置結構體指針,也就是2.1中的變量指針;

esp_err_t

:傳回值,

ESP_OK

表示成功。

2.3、LEDC通道配置結構體變量

ledc_channel_config_t

:LEDC 通道配置結構體,用于配置引腳、通道、占空比等參數。

2.4、LEDC通道配置

ledc_conf

:LEDC 通道配置結構體指針,也就是2.3中的變量指針;

esp_err_t

:傳回值,

ESP_OK

表示成功。

2.5、安裝LEDC漸變功能

intr_alloc_flags

:用于配置設定中斷的标志,使用這個函數會占用LEDC子產品的中斷;

esp_err_t

:傳回值,

ESP_OK

表示成功。

2.6、LEDC漸變步長

speed_mode

:LECD速度;

channel

:通道;

target_duty

:目标占空比;

scale

:增加或者減少的步長;

cycle_num

esp_err_t

:傳回值,

ESP_OK

表示成功。

2.7、開啟LEDC漸變功能

speed_mode

:LECD速度;

channel

:通道;

fade_mode

:是否阻塞模式。

3、代碼實作

設定兩個通道,一個用于輸出固定占空比的pwm,用led量滅來訓示,

一個輸出漸變的pwm,用led呼吸形式訓示。

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、現象

【玩轉ESP32】17、PWM調光
【玩轉ESP32】17、PWM調光
【玩轉ESP32】17、PWM調光

繼續閱讀