一、前言
Nordic52810使用的是逐次逼近式模擬數字轉換器(SAR),在每一次轉換過程中,通過遍歷所有的量化值並將其轉爲爲模擬值,將輸入信號與其逐一比較,最終得到輸出的數字信號(百度百科)
ps:如有錯誤,請留言指正,謝謝
二、工作原理
功能特點
- 支持8位/10位/12位分辨率,過採樣支持14位分辨率
- 支持8個輸入通道(單端輸入與差分輸入)
- 可以配合PPI主動觸發採樣任務(低功耗模式下,RTC定時喚醒後進行採樣)
- 支持EasyDMA進行數據採樣
- 採樣電壓值範圍(0 ~ VDD)
- 支持連續循環採樣模式
- 可配置內部輸入負載阻抗,可檢測採樣值門限
共享資源
- 外設COMP也使用模擬輸入引腳
AIN0-AIN7
,爲了防止出現衝突,不建議配置到同一個模擬輸入引腳
原理框圖
ADC默認配置爲單端輸入模式,此時負極輸入內部會接地。但是由於芯片引腳會存在電感電容等寄生參數,會造成地彈噪聲,測量數據會存在偏差,對採樣數據有要求的情況下可以使用差分輸入模式
數字輸出
輸出結果主要由CH[n].CONFIG和RESOLUTION寄存器來設置,公式如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bIyBt6dz-1573728834529)(en-resource://database/2647:1)]
- V§:正極輸入電壓
- V(N):負極輸入電壓
- GAIN:增益
- REFERENCE:參考電壓
三、工作模式
ADC可配置成三種工作模式:單次模式、連續模式、掃描模式
- 單次模式(One hsot mode):僅配置了一個有效的採樣通道
- 連續模式(Continuous mode):連續採樣主要是通過內部定時器進行定時採樣,也可配合PPI觸發採樣
- 掃描模式(scan mode):當有效通道大於1個時,通過掃描模式進行逐個有效通道的採樣
四、寄存器
- INTEN:中斷控制寄存器,寫1使能中斷,寫0禁用中斷(按位配置中斷)
- INTENSET:中斷使能寄存器,寫1有效
- INTENCLR:中斷禁用寄存器,寫1有效
- STATUS:狀態寄存器,讀取到0爲ADC空閒(當前未在轉換),讀取到1位ADC忙(轉換過程中)
- ENABLE:ADC外設使能寄存器,寫1使能,寫0禁用;使能前必須確認輸入引腳已經被配置
- CH[0-7].PSELP:選擇通道0-7中正極輸入引腳
- CH[0-7].PSELN:選擇通道0-7中負極輸入引腳
- CH[0-7].CONFIG:配置寄存器,可配置爲輸入模式(差分、單端)、增益、參考電壓與轉換速率
- CH[0].LIMIT:門限監控事件配置,高於門限或低於門限可觸發事件中斷
五、相關接口
SAADC的驅動目錄在modules\nrfx\drivers\src\nrfx_saadc.c中
- nrfx_saadc_init:初始化saadc,主要配置分辨率與過採樣
- nrfx_saadc_channel_init:配置採樣模式(單端、差分),通道與關聯引腳
- nrfx_saadc_buffer_convert:觸發adc轉換,形參爲adc轉換的緩存與需要轉換的緩存大小
六、實例代碼
saadc初始化
實例使用的工程目錄爲examples\peripheral\saadc saadc.eww,使用通道0,引腳爲PIN2,可以修改channel_config結構修改參數
void saadc_init(void)
{
ret_code_t err_code;
nrf_saadc_channel_config_t channel_config =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
err_code = nrf_drv_saadc_init(NULL, saadc_callback);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_channel_init(0, &channel_config);//通道0
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_IN_BUFFER);//接收緩存
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
}
主函數
int main(void)
{
uint32_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_DEFAULT_BACKENDS_INIT();
ret_code_t ret_code = nrf_pwr_mgmt_init();
APP_ERROR_CHECK(ret_code);
saadc_init();
saadc_sampling_event_init();
saadc_sampling_event_enable();
NRF_LOG_INFO("SAADC HAL simple example started.");
while (1)
{
nrf_pwr_mgmt_run();
NRF_LOG_FLUSH();
}
}