Nordic52810入門篇-ADC模數轉換

一、前言

Nordic52810使用的是逐次逼近式模擬數字轉換器(SAR),在每一次轉換過程中,通過遍歷所有的量化值並將其轉爲爲模擬值,將輸入信號與其逐一比較,最終得到輸出的數字信號(百度百科)
ps:如有錯誤,請留言指正,謝謝

二、工作原理

功能特點

  • 支持8位/10位/12位分辨率,過採樣支持14位分辨率
  • 支持8個輸入通道(單端輸入與差分輸入)
  • 可以配合PPI主動觸發採樣任務(低功耗模式下,RTC定時喚醒後進行採樣)
  • 支持EasyDMA進行數據採樣
  • 採樣電壓值範圍(0 ~ VDD)
  • 支持連續循環採樣模式
  • 可配置內部輸入負載阻抗,可檢測採樣值門限

共享資源

  • 外設COMP也使用模擬輸入引腳AIN0-AIN7,爲了防止出現衝突,不建議配置到同一個模擬輸入引腳

原理框圖

ADC默認配置爲單端輸入模式,此時負極輸入內部會接地。但是由於芯片引腳會存在電感電容等寄生參數,會造成地彈噪聲,測量數據會存在偏差,對採樣數據有要求的情況下可以使用差分輸入模式
在這裏插入圖片描述

數字輸出
輸出結果主要由CH[n].CONFIGRESOLUTION寄存器來設置,公式如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bIyBt6dz-1573728834529)(en-resource://database/2647:1)]

  • :正極輸入電壓
  • 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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章