系列文章:
【玩轉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);
}
}