太秀了!單片機(jī)內(nèi)置ADC實現(xiàn)高分辨率采樣?
什么是過采樣?
在信號處理中,過采樣是指以明顯高于奈奎斯特速率的采樣頻率對信號進(jìn)行采樣。從理論上講,如果以奈奎斯特速率或更高的速率進(jìn)行采樣,則可以完美地重建帶寬受限的信號。奈奎斯特頻率定義為信號帶寬的兩倍。過采樣能夠提高分辨率和信噪比SNR,并且通過放寬抗混疊濾波器的性能要求,有助于避免混疊和相位失真。
在很多項目應(yīng)用中,需要測量信號的動態(tài)范圍較大,且需要參數(shù)的微小變化。例如,ADC需要測量很大的溫度范圍(比如工業(yè)中甚至要求從-200℃~500℃),但仍要求系統(tǒng)對小于1度的變化做出響應(yīng)。常見的單片機(jī)片上ADC位數(shù)為12位,如要實現(xiàn)高于12位分辨率要怎么做呢?我們知道奈奎斯特-香農(nóng)采樣定理可知:
其中:
- 為輸入待采樣信號最高頻率
- 為奈奎斯特頻率。
如果實際采樣頻率高于奈奎斯特頻率 ,即為過采樣。那么低于奈奎斯特采樣頻率進(jìn)行采樣就稱為欠采樣。
或許你會問,常規(guī)的應(yīng)用都是過采樣,怎么也沒見分辨率提高了呀?如果僅僅過采樣,要實現(xiàn)更高分辨率顯然是不夠的,那么要怎么利用過采樣實現(xiàn)更高的分辨率呢?要知道所采用的ADC硬件核分辨率是固定的,難道還會變不成?
過采樣提高分辨率
如果對一模擬信號,采用過采樣,然后再進(jìn)行一定的軟件后處理,理論上是可以得到更高分辨率的。
為增加有效位數(shù)(ENOB :effective number of bits),對信號進(jìn)行過采樣,所需的過采樣率可以由下面公式確定(省略理論推導(dǎo),過于枯燥):
其中:
- 為過采樣頻率
- 產(chǎn)品所需實際采樣頻率
- W為額外所需增加的分辨率位數(shù)
假設(shè)系統(tǒng)使用12位ADC每100 ms輸出一次采樣值也即(10 Hz)。為了將測量的分辨率提高到16位,我們按公式計算過采樣頻率。
因此,如果我們以 f對信號進(jìn)行過采樣,然后在所需的采樣周期內(nèi)收集足夠的樣本以對它們進(jìn)行平均,現(xiàn)在可以將16位輸出數(shù)據(jù)用于16位測量。
具體怎么做呢?
- 首先將256個連續(xù)采樣累加
- 然后將總數(shù)除以16(或?qū)⒖倲?shù)右移4位)。該過程通常稱為抽取,也即將速率采樣。
- 在類似進(jìn)行下一次16位樣本處理
注意:用于累積過采樣數(shù)據(jù)并執(zhí)行除法抽取數(shù)據(jù)類型必須具有足夠的字節(jié)寬度,以防止溢出和截斷錯誤。比如這里累積和可以采樣32位無符號整型。
由上面公式可得出一個重要結(jié)論:每提高W位分辨率,需要提高采樣率 倍。
過采樣提高ADC的信噪比
ADC測量的SNR理論極限基于量化噪聲,這是基于在沒有過采樣和平滑濾波情況下模數(shù)轉(zhuǎn)換過程中固有的量化誤差所致。而量化誤差取決于ADC分辨率的位數(shù),其中N為ADC的位數(shù), 為參考電壓。
SNR理論情況下極限值的計算方式是數(shù)據(jù)轉(zhuǎn)換的有效位數(shù),如下所示:
這個公式?jīng)]必要去記,用到的時候參考計算一下即可。從公式中可看出,要提升一個模數(shù)轉(zhuǎn)換器的理論SNR的一種可行方案可以通過提升采樣位數(shù),但是需要注意的是這里的信噪比是度量模數(shù)轉(zhuǎn)換器本身的,就一個真實系統(tǒng)的信噪比還與整個信號鏈相關(guān)!
從上式中不難算出,12位ADC的理論SNR極限值為74dB,而通過過采樣提升4位分辨率后,其SNR理論極限提高至96 dB!
到底怎么實現(xiàn)呢?
這里以偽代碼的方式給出編程思路:
void init_adc(void) { /*配置ADC的采樣率為過采樣率連續(xù)中斷模式*/ } void start_adc(void) { /*控制ADC啟動采樣*/ } /*不同的開發(fā)平臺中斷函數(shù)寫法略有差異,比如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轉(zhuǎn)換結(jié)果寄存器,不同平臺名稱不同*/ accumulator?+=?ADC_REG;?
????adc_index--; if(?adc_index==0 )
????{ /*?加和按因子抽取?*/ adc_result??=?accumulator>>RSHIFT_BITS;
????????accumulator?= 0;
????????adc_index???=?OVERSAMPLE_FACTOR;
????}
}
該方案有一個缺陷,就是每次ADC中斷都需要CPU參與,在過采樣率很高的情況下,上述方案消耗很多CPU資源,那么如果單片機(jī)內(nèi)存資源足夠的情況下可以考慮采用DMA模式,采集很多數(shù)據(jù)并將數(shù)據(jù)暫存下來,然后再做累加平均抽取。這是空間換時間的策略的體現(xiàn)。這個編代碼也很容易,只需要申請一片內(nèi)存區(qū),內(nèi)存區(qū)的大小可以定為256的倍數(shù),這是因為在提升4位分辨率情況下,一個16位的輸出樣本需要256個12位樣本。
總結(jié)一下
在成本受限的情況下,可以通過單片機(jī)片內(nèi)ADC過采樣以及累積抽取的技術(shù)來提升采樣分辨率,這種技術(shù)的特點:
-
可以使用過采樣和平均來提高測量分辨率,而無需增加昂貴的片外ADC。
-
過采樣和加和抽取將以提高CPU利用率和降低吞吐量為代價來提高SNR和測量分辨率。
-
過采樣和加和抽取可以改善白噪聲的信噪比。
-END-
來源 | 嵌入式客棧
作者 | 逸珺
|?整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有 |
| 如有侵權(quán),請聯(lián)系刪除 |
【1】嵌入式研發(fā)10多年,工程師悟出這些道理
【2】當(dāng)談起嵌入式工程師,究竟在談些什么
【3】嵌入式工程師出路之我見:就業(yè),技術(shù),行業(yè)...
【4】為什么嵌入式工程師會對8位MCU有誤解?
【5】嵌入式工程師結(jié)合經(jīng)歷聊硬件工程師和軟件工程師哪個更有前途?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!