[nRF51822] 12、基礎實驗代碼解析大全 · 實驗19 - PWM


 

一、PWM概述:

  PWM(Pulse Width Modulation):脈沖寬度調制技術,通過對一系列脈沖的寬度進行調制,來等效地獲得所需要波形。

  PWM 的幾個基本概念:

  • 1) 占空比:占空比是指在一個周期內,信號處於高電平的時間占整個信號周期的百分比,方波的占空比是50%。
  • 2) 調制頻率:周期的倒數。
  • 3) 脈沖寬度:信號處於高電平的時間。

 

二、nRF51822的PWM產生:

  NRF51822 通過Timer、PPI 和GPIOTE 的配合實現PWM 的功能,由Timer 產生一個事件,PPI 捕獲這個事件並把這個事件轉化為任務傳遞給GPIOTE, GPIOTE 模塊根據傳遞過來額任務執行操作。NRF51822 實現PWM 的原理框圖如下圖所示:

 

  由上圖可以看出,實現PWM 功能,需要使用2 個CC 通道,通過設定CC[0]和CC[1]通道的比較值,讓他們在不同的時間產生比較值匹配事件,從而觸發GPIOTE 模塊控制管腳在設定的時間點輸出高電平和低電平,這樣,就可以產生不同脈沖寬度的輸出信號,即PWM 輸出信號。

 

三、代碼解析:

main:

 1 int main(void)
 2 {
 3     ret_code_t err_code;
 4 
 5     /* 2-channel PWM, 200Hz, output on DK LED pins. */
 6     app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_2CH(5000L, BSP_LED_0, BSP_LED_1);//PWM參數配置  7 
 8     /* Switch the polarity of the second channel. */
 9     pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH;
10 
11     /* Initialize and enable PWM. */
12     err_code = app_pwm_init(&PWM1, &pwm1_cfg, pwm_ready_callback);//PWM初始化(核心在這個里面,本次不講) 13     APP_ERROR_CHECK(err_code);
14     app_pwm_enable(&PWM1);//使能PWM 15 
16     uint32_t value;
17     while(true)
18     {
19         for (uint8_t i = 0; i < 40; ++i)
20         {
21             value = (i < 20) ? (i * 5) : (100 - (i - 20) * 5);
22 
23             ready_flag = false;
24             /* Set the duty cycle - keep trying until PWM is ready... */
25             while (app_pwm_channel_duty_set(&PWM1, 0, value) == NRF_ERROR_BUSY);//設置PWM1的0通道的值
26 
27             /* ... or wait for callback. */
28             while(!ready_flag);
29             APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, value));//設置通道1 30             nrf_delay_ms(25);
31         }
32     }
33 
34 }

 

注:PWM參數配置宏定義如下

1 /**@brief PWM instance default configuration (2 channels). */
2 #define APP_PWM_DEFAULT_CONFIG_2CH(period_in_us, pin0, pin1)                           \
3 {                                                                                  \
4     .pins            = {pin0, pin1},                                               \
5     .pin_polarity    = {APP_PWM_POLARITY_ACTIVE_LOW, APP_PWM_POLARITY_ACTIVE_LOW}, \
6     .num_of_channels = 2,                                                          \
7     .period_us       = period_in_us                                                \
8 }

 

注:PWM回調函數如下

1 static volatile bool ready_flag;            // A flag indicating PWM status.
2 
3 void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
4 {
5     ready_flag = true;
6 }

 

 

@nRF51822基礎實驗系列:


[nRF51822] 7、基礎實驗代碼解析大全(前十)

[nRF51822] 8、基礎實驗代碼解析大全 · 實驗11 - PPI

[nRF51822] 9、基礎實驗代碼解析大全 · 實驗12 - ADC

[nRF51822] 10、基礎實驗代碼解析大全 · 實驗15 - RTC

[nRF51822] 11、基礎實驗代碼解析大全 · 實驗16 - 內部FLASH讀寫


 

 

@beautifulzzzz - 物聯網&普適計算實踐者
e-mail:beautifulzzzz@qq.com 
i-blog:blog.beautifulzzzz.com 

 


免責聲明!

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



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