在此我們簡要總結一下ADC的各種指標如何理解,以及從硬體到軟體都有哪些可以採用的手段來提高ADC的轉換精度。
1.ADC指標
除了解析度,速度,輸入範圍這些基本指標外,衡量一個ADC好壞通常會用到以下這些指標:失調誤差,增益誤差,微分非線性,積分非線性,信噪比,信納比,有效位數,總諧波失真。讓我們以下圖為例來看一下這些指標的意義。
LSB
參數中經常用LSB作為單位,比如說差分非線性為2 LSB。這究竟是多大一個值呢?為了簡單起見,我們以一個3bit解析度,滿量程為5V的ADC為例。1個LSB對應的電壓大小為5V/7=714mV。如果是8bit解析度,那麼1個LSB對應5/255=19mV。
圖中橫軸為輸入電壓Vin增長方向,縱軸為數字輸出。理想情況下輸入電壓每增長1LSB(714mV),那麼輸出會向上跳變一次,對應虛線L1所在轉換曲線。但實際電路往往會引入偏差,轉換曲線往往如 L2 所對應曲線。
失調誤差(Offset Error)
電壓從0開始增大時,引起輸出第一次跳變的電壓值,與理論上應該引起第一次跳變的電壓值(0.5 LSB)的差值。衡量小電壓時的轉換精度。如圖中,理論上應該在0.5 LSB處跳變,實際電壓增大到1 LSB時才跳變,所以Offset Error是 1–0.5 = 0.5 LSB。
增益誤差(Offset Error)
可以理解為實際轉換曲線偏離理想曲線的程度。用最接近滿量程時跳變點電壓值和理論跳變點電壓值的差表示。
差分非線性 DNL(Differential Non-Linearity)
理論上每增加或減少1 LSB 的電壓,都會引起輸出對應的一次跳變。但實際情況可能如圖中a,b處所示,電壓的步距大於或小於1個LSB的理論步距。
a 處 DNL = 1.5 – 1 = 0.5 LSB;
b 處 DNL = 0.5 – 1 = -0.5 LSB;
積分非線性 INL(Integral Non Linearity)
差分非線性累積起來造成的對實際轉換曲線的最大偏離就是INL。如圖中所示,需要注意的是INL不能表徵對理想轉換曲線的偏離程度。
總不可調整誤差 TUE(Total Unadjusted Error)
實際轉換曲線與理想轉換曲線之間最大的偏離。在最糟糕的一點,我們通過ADC得到的電壓,與實際電壓的差值。通俗講就是最不準的一點差多少。
思考一下,如果 DNL 和 INL 都非常好,那麼是不是說明 TUE 就非常好?
對,還真不一定。即使線性度非常好,如果增益誤差大,還是會導致最終結果大的偏差。
信噪比 SNR(Signal-to-Noise Ratio)
有用信號與噪聲的能量比。我們總是期望信噪比越大越好。對於一個 N-Bit 解析度的ADC來說,如果輸入是一個滿量程的正弦信號,在只考慮量化噪聲的情況下,可以推導出一個有用的公式:
SNR = 6.02N + 1.76dB
推導過程見參考文檔 ADI: MT-001
此公式直觀的表明了ADC解析度和信噪比之間的量化關係。
信納比 SINAD (Signal-to-Noise-and-Distortion Ratio)
實際ADC是無法達到理想狀態的,它的輸出除了會引入噪聲,還會引入輸入信號的諧波。SINAD是有用信號能量,與諧波(Distortion)加噪聲(Noise)能量的比,它更能體現現實世界中的ADC性能。
SINAD = 20log(S/(N+D))
*而SNR = 20log(S/N)
有效位數 ENOB(Effective Number of Bits)
體現ADC實際性能相當於多少位。可以從SINAD推出:
ENOB = (SINAD–1.76)/6.02
*和理想情況下的位數對應:NOB =(SNR - 1.76)/6.02。
總諧波失真 THD(Total Harmonic Distortion)
有用信號能量與諧波能量的比。
THD = 20log(S/D)
2.如何提高轉換精度
模擬電源(VDDA)和電壓參考(VREF)
有的單片機ADC模塊會引出單獨的電源引腳和電壓參考引腳,最好用LDO給這些引腳供電,或者用磁珠和濾波電容把這部分電源從數字部分隔離出來。
輸入信號的輸出阻抗
下圖是ADC採樣簡化等效電路。ADC採樣和保持電路的等效輸入電阻電容Radc,和Cadc,手冊中都會給出。在採樣期間,開關SW會接通外部的信號輸入電路,給採樣電容Cadc充電至和輸入信號相等(接近),之後SW斷開,ADC對採樣電容上的電壓進行轉換。如果採樣時間過短,或者輸入信號的輸出阻抗過大,將導致採樣電壓不準。在信號源輸出阻抗過高時,可以考慮增加一級運放。
高頻串擾
如果與模擬輸入引腳靠近的IO上有高頻翻轉的信號,或者PCB上有與輸入信號長距離的平行走線,串擾將幹擾輸入信號。應避免ADC引腳臨近信號高頻翻轉。在ADC輸入布線和臨近的走線之間用地線隔離開也可以避免ADC精度下降。
Wait,Stop模式
如果ADC在Wait和Stop模式下還可以工作,在此種模式下可以最大限度的降低MCU電源的波動,提高ADC的轉換精度。
過採樣(Oversampling)
如果採樣頻率為fs,那麼對於fs/2以內的信號頻率既可以獲得完整信息。過採樣是用遠高於所需的採樣頻率去採樣,這樣噪聲就會均攤在整個採樣頻帶內。我們用數字濾波器可以濾除有用信號頻帶之外的噪聲,從而使頻帶內的信噪比提高,獲得更高的解析度。對多次轉換結果進行平均也可以提高結果的精度。
晶片內部校正
很多單片機內部都有校正機制(Calibration),每次上電後執行一次Calibration,可以以提高ADC的精度。
溫度的影響
ADC受溫度影響比較大,特別是失調誤差和增益誤差。如果晶片工作溫度範圍很寬,可以在不同的溫度下預先測量,按溫度做出查找表以在實際工作時做校正。
混入白噪聲
這種方法對提高直流信號的解析度很有用。如果輸入信號接近直流而且很穩定,那麼輸出就不會產生跳變,比如輸出一直是0x15A,我們無法確認輸入電平是更接近0x159,還是更接近0x15B。那麼我們可以人為地把白噪聲混入信號,使信號產生小的波動從而輸出產生跳變,然後再通過數學平均得出一個精度更高的數值。實際操作中可以用GPIO產生一個方波然後通過阻容耦合進輸入信號引腳。
參考資料:
ADI: Data Converter Introduction
ADI: MT-001 TUTORIAL Taking the Mystery out of the Infamous Formula,
"SNR = 6.02N + 1.76dB," and Why You Should Care
ST: AN1636 UNDERSTANDING AND MINIMISING ADC CONVERSION ERRORS
ST: AN2834 Application note How to get the best ADC accuracy in STM32 microcontrollers
NXP: How to Increase the Analog-to-Digital Converter Accuracy in an Application
NXP: Cookbook for SAR ADC Measurements