使用pwm進行呼吸燈的設計


本文源碼已經上傳至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上回輸出打印信息。

 

 

 

 

 

 

 

 

相關知識:LED Control相關函數的API接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM