太秀了!單片機內置ADC實現高分辨率採樣?

關注、星標嵌入式客棧,精彩及時送達

[導讀] 相信ADC的應用或多或少都會用到,在很多場合都有分辨率要求,要實現較高分辨率時,第一時間會想到採用一個較高位數的外置ADC去實現。可是高分辨率外置ADC往往價格都不便宜,這就帶來一對矛盾:高指標與低成本。其實利用單片機片上的ADC利用過採樣技術就能很好的解決這樣一對矛盾體,本文來聊聊這個話題。

什麼是過採樣?

在信號處理中,過採樣是指以明顯高於奈奎斯特速率的採樣頻率對信號進行採樣。從理論上講,如果以奈奎斯特速率或更高的速率進行採樣,則可以完美地重建帶寬受限的信號。奈奎斯特頻率定義爲信號帶寬的兩倍。過採樣能夠提高分辨率和信噪比SNR,並且通過放寬抗混疊濾波器的性能要求,有助於避免混疊和相位失真。

在很多項目應用中,需要測量信號的動態範圍較大,且需要參數的微小變化。例如,ADC需要測量很大的溫度範圍(比如工業中甚至要求從-200℃~500℃),但仍要求系統對小於1度的變化做出響應。常見的單片機片上ADC位數爲12位,如要實現高於12位分辨率要怎麼做呢?我們知道奈奎斯特-香農採樣定理可知:

其中:

  • 爲輸入待採樣信號最高頻率

  • 爲奈奎斯特頻率。

如果實際採樣頻率高於奈奎斯特頻率 ,即爲過採樣。那麼低於奈奎斯特採樣頻率進行採樣就稱爲欠採樣,如下圖:

或許你會問,常規的應用都是過採樣,怎麼也沒見分辨率提高了呀?如果僅僅過採樣,要實現更高分辨率顯然是不夠的,那麼要怎麼利用過採樣實現更高的分辨率呢?要知道所採用的ADC硬件核分辨率是固定的,難道還會變不成?

過採樣提高分辨率

如果對一模擬信號,採用過採樣,然後再進行一定的軟件後處理,理論上是可以得到更高分辨率的:

爲增加有效位數(ENOB :effective number of bits),對信號進行過採樣,所需的過採樣率可以由下面公式確定(省略理論推導,過於枯燥):

其中:

  • 爲過採樣頻率

  • 產品所需實際採樣頻率

  • W爲額外所需增加的分辨率位數

假設系統使用12位ADC每100 ms輸出一次採樣值也即(10 Hz)。爲了將測量的分辨率提高到16位,我們按上述公式計算過採樣頻率:

因此,如果我們以 f對信號進行過採樣,然後在所需的採樣週期內收集足夠的樣本以對它們進行平均,現在可以將16位輸出數據用於16位測量。

具體怎麼做呢?

  • 首先將256個連續採樣累加

  • 然後將總數除以16(或將總數右移4位)。該過程通常稱爲抽取,也即將速率採樣。

  • 在類似進行下一次16位樣本處理

注意:用於累積過採樣數據並執行除法抽取數據類型必須具有足夠的字節寬度,以防止溢出和截斷錯誤。比如這裏累積和可以採樣32位無符號整型。

由上面公式可得出一個重要結論:每提高W位分辨率,需要提高採樣率 倍。

過採樣提高ADC的信噪比

ADC測量的SNR理論極限基於量化噪聲,這是基於在沒有過採樣和平滑濾波情況下模數轉換過程中固有的量化誤差所致。而量化誤差取決於ADC分辨率的位數,其中N爲ADC的位數, 爲參考電壓。

SNR理論情況下極限值的計算方式是數據轉換的有效位數,如下所示:

這個公式沒必要去記,用到的時候參考計算一下即可。從公式中可看出,要提升一個模數轉換器的理論SNR的一種可行方案可以通過提升採樣位數,但是需要注意的是這裏的信噪比是度量模數轉換器本身的,就一個真實系統的信噪比還與整個信號鏈相關!

從上式中不難算出,12位ADC的理論SNR極限值爲74dB,而通過過採樣提升4位分辨率後,其SNR理論極限提高至96 dB!

到底怎麼實現呢?

這裏以僞代碼的方式給出編程思路:

void init_adc(void)
{
    /*配置ADC的採樣率爲過採樣率連續中斷模式*/
}

void start_adc(void)
{
   /*控制ADC啓動採樣*/
}

/*不同的開發平臺中斷函數寫法略有差異,比如51需要指定向量   */
/*OVERSAMPLE_FACTOR=4^RSHIFT_BITS 下面兩個宏一起修改 */
#define RSHIFT_BITS        (4)
#define OVERSAMPLE_FACTOR  (256)
static unsigned short adc_result=0U;
void adc_isr(void)
{
    static unsigned short adc_index = OVERSAMPLE_FACTOR;
    static unsigned int accumulator = 0U;
    
    /*ADC_REG ADC轉換結果寄存器,不同平臺名稱不同*/ 
    accumulator += ADC_REG; 
    adc_index--;
    if( adc_index==0 )
    {
        /* 加和按因子抽取 */
        adc_result  = accumulator>>RSHIFT_BITS;
        accumulator = 0;
        adc_index   = OVERSAMPLE_FACTOR;
    }
}

該方案有一個缺陷,就是每次ADC中斷都需要CPU參與,在過採樣率很高的情況下,上述方案消耗很多CPU資源,那麼如果單片機內存資源足夠的情況下可以考慮採用DMA模式,採集很多數據並將數據暫存下來,然後再做累加平均抽取。這是空間換時間的策略的體現。這個編代碼也很容易,只需要申請一片內存區,內存區的大小可以定爲256的倍數,這是因爲在提升4位分辨率情況下,一個16位的輸出樣本需要256個12位樣本。

總結一下

在成本受限的情況下,可以通過單片機片內ADC過採樣以及累積抽取的技術來提升採樣分辨率,這種技術的特點:

  • 可以使用過採樣和平均來提高測量分辨率,而無需增加昂貴的片外ADC。

  • 過採樣和加和抽取將以提高CPU利用率和降低吞吐量爲代價來提高SNR和測量分辨率。

  • 過採樣和加和抽取可以改善白噪聲的信噪比。

END

往期精彩推薦,點擊即可閱讀

▲Linux驅動相關專輯 

手把手教信號處理專輯

片機相關專輯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章