一、本實驗ADC 配置 解析度:10 位。 輸入通道:5,即使用輸入通道AIN5 檢測電位器的電壓。 ADC 基準電壓:1.2V。 二、NRF51822 ADC 管腳分佈 NRF51822 的ADC 共有8 個輸入通道,對應的管腳分佈入下圖: 三、NRF51822 ADC 原理 NRF51822 的 ...
一、本實驗ADC 配置
- 解析度:10 位。
- 輸入通道:5,即使用輸入通道AIN5 檢測電位器的電壓。
- ADC 基準電壓:1.2V。
二、NRF51822 ADC 管腳分佈
NRF51822 的ADC 共有8 個輸入通道,對應的管腳分佈入下圖:
三、NRF51822 ADC 原理
NRF51822 的ADC 比較簡單,如下圖所示。
3.1、ADC 通道及預分壓繫數
NRF51822 的ADC 共有8 個輸入通道,在使用ADC 時,要設定ADC 的輸入通道。本實驗中,因為連接電位器的管腳是P0.04,所以,選擇輸入通道AIN5。
3.2、基準電壓
基準電壓有4 種選擇,分別是:
- 1) 內部1.2V。
- 2) CONFIG. EXTREFSEL 中設定的外部基準。
- 3) 1/2 VDD,僅適用於VDD 工作在1.7 V - 2.6 V 電壓範圍內。
- 4) 1/3 VDD,僅適用於VDD 工作在2.5 V - 3.6 V 電壓範圍內。
3.3、解析度
NRF51822 的ADC 可以作8、9、10 位轉換,本實驗中,選擇最高解析度:10 位。需要註意的是:NRF51822 的ADC 自身僅支持單次轉換,每次轉換時都需要觸發STARTtask。當然,我們可以藉助NRF51822 強大的PPI 功能,通過定時器時間來觸發ADC 的STARTtask,從而進行連續轉換。
四、代碼解析:
main函數:
1 int main(void) 2 { 3 nrf_gpio_cfg_output(LED_1);//配置P0.21~P0.24為輸出驅動LED指示燈D1~D4 4 nrf_gpio_pin_set(LED_1); //LED初始狀態為熄滅 5 6 adc_config(); 7 uart_config(); 8 nrf_adc_start();//每次調用這個函數就會觸發ADC一次採樣,當採樣完畢後會觸發ADC_IRQHander,下麵ADC_IRQHander內部獲取採樣值並保存在adc_sample中,同時最後又調用start函數,進行下一次採樣 9 10 while (true) 11 { 12 nrf_delay_ms(200); 13 printf("V%d", (int)adc_sample); 14 nrf_gpio_pin_toggle(LED_1); 15 16 __SEV(); //設置事件 17 __WFE(); //進入睡眠,等待事件喚醒 18 __WFE(); 19 } 20 }
ADC初始化:
1 void adc_config(void) 2 { 3 const nrf_adc_config_t nrf_adc_config = NRF_ADC_CONFIG_DEFAULT; 4 5 // Initialize and configure ADC 6 nrf_adc_configure( (nrf_adc_config_t *)&nrf_adc_config); 7 nrf_adc_input_select(NRF_ADC_CONFIG_INPUT_5); 8 nrf_adc_int_enable(ADC_INTENSET_END_Enabled << ADC_INTENSET_END_Pos); 9 NVIC_SetPriority(ADC_IRQn, NRF_APP_PRIORITY_HIGH); 10 NVIC_EnableIRQ(ADC_IRQn); 11 }
ADC事件中斷:
1 /** 2 * @brief ADC interrupt handler. 3 */ 4 void ADC_IRQHandler(void) 5 { 6 nrf_adc_conversion_event_clean(); 7 adc_sample = nrf_adc_result_get(); 8 // trigger next ADC conversion 9 nrf_adc_start();// 10 }
@nRF51822基礎實驗系列:
[nRF51822] 8、基礎實驗代碼解析大全 · 實驗11 - PPI
@beautifulzzzz - 物聯網&普適計算實踐者
e-mail:[email protected]
i-blog:blog.beautifulzzzz.com