本文源碼已經上傳至csdn:
程序源碼如下;
1 #define LEDC_IO_0 (2) 2 3 esp_err_t app_main() 4 { 5 ledc_timer_config_t ledc_timer = { 6 //set timer counter bit number 7 .bit_num = LEDC_TIMER_13_BIT, 8 //set frequency of pwm 9 .freq_hz = 5000, 10 //timer mode, 11 .speed_mode = LEDC_HIGH_SPEED_MODE, 12 //timer index 13 .timer_num = LEDC_TIMER_0 14 }; 15 ledc_timer_config(&ledc_timer); 16 17 ledc_channel_config_t ledc_channel = { 18 //set LEDC channel 0 19 .channel = LEDC_CHANNEL_0, 20 //set the duty for initialization.(duty range is 0 ~ ((2**bit_num)-1) 21 .duty = 0, 22 //GPIO number 23 .gpio_num = LEDC_IO_0, 24 //GPIO INTR TYPE, as an example, we enable fade_end interrupt here. 25 .intr_type = LEDC_INTR_FADE_END, 26 //set LEDC mode, from ledc_mode_t 27 .speed_mode = LEDC_HIGH_SPEED_MODE, 28 //set LEDC timer source, if different channel use one timer, 29 //the frequency and bit_num of these channels should be the same 30 .timer_sel = LEDC_TIMER_0 31 }; 32 //set the configuration 33 ledc_channel_config(&ledc_channel); 34 35 //initialize fade service. 36 ledc_fade_func_install(0); 37 38 while(1) { 39 printf("LEDC fade up\n"); 40 ledc_set_fade_with_time(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 1000, 2000); 41 ledc_fade_start(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT); 42 vTaskDelay(3000 / portTICK_PERIOD_MS); 43 44 printf("LEDC fade down\n"); 45 ledc_set_fade_with_time(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0, 2000); 46 ledc_fade_start(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_NO_WAIT); 47 vTaskDelay(3000 / portTICK_PERIOD_MS); 48 49 /*printf("LEDC set duty without fade\n"); 50 ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 1000); 51 ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); 52 vTaskDelay(2000 / portTICK_PERIOD_MS); 53 54 printf("LEDC set duty without fade\n"); 55 ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); 56 ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); 57 vTaskDelay(2000 / portTICK_PERIOD_MS);*/ 58 } 59 }
esp_idf中提供 了LEDC來產生pwm信號,LEDC主要是用來做燈控的,因為其比pwm功能更加豐富,說以esp-idf並沒有提供pwm相關的模塊。
1、5-15行設置一個LEDC計時器,bit_num設置定時器位數,freq_hz設置定時器平率,speed_mode設定工作模式(目前只能設定高速),timer_num表示使用的定時器號(esp32有四個通用的定時器,號數為0~3) 。我們通過調用ledctimerconfig()來完成這一工作,
2、17-33行設置LEDC通道,值得注意的是,esp32有16個通道可以產生脈沖信號,其中通道0~通道7是高速通道,通道8~通道15是低速通道,目前只支持高速通道。duty設置pwm占空比,intr_type設置中斷方式。最后通過ledc_channel_config()完成,
3、while循環中是循環輸出打印信息,並控制pwm由0~100或者控制pwm由100~0。,其中ledc_set_fade_with_time有四個參數,分別為
(1)speed_mode:目前只支持高速模式,即LEDC_HIGH_SPEED_MODE.
(2)channel:上面定義使用的通道號,0~7。
(3)target_duty:目標占空比,燈亮度的調節靠調節占空比實現,該參數表示占空比將從當前值逐漸變化到該設定值。
(4)max_fade_time_ms:漸變時間。表示等占空變化到設定值所用的時間,單位是ms。
實驗現象:
LED等連接到GPIO 2,可以看到LED燈從暗到亮變化,在從亮到暗變化,每次變化時長為2s,並且轉換時,minicom上回輸出打印信息。