本文章是筆者整理的備忘筆記。希望在幫助自己溫習避免遺忘的同時,也能幫助其他需要參考的朋友。如有謬誤,歡迎大家進行指正。
一、ADC誤差校準引言
MCU 片內 ADC 模塊的誤差總包括了 5 個靜態參數 (靜態失調,增益誤差,微分非線性誤差 (DNL),積分非線性誤差(INL),絕對精度誤差) 和 5 個動態參數 (信噪比,信噪失真比,無雜 散動態范圍,有效位,總諧波失真) 。其中, 靜態失調和增益誤差是可以利用微控制器 MCU 進行修正, 可以通過軟件算法, 也可以通過硬件固化的方式進行補償。本文提供一種兩點法 ADC 模塊誤差校正并結合硬件計算的方式來完成 ADC 的誤差補償。 ADC 靜態失調被定義為第一次理想編碼跳變與第一次實際編碼跳變之間的偏差。第一次理想編碼跳變發生在 0.5 LSB 處。如果輸入電壓小于 0.5 LSB 時輸出代碼大于零,則 ADC 產生正失調誤差。如果輸入電壓大于 0.5 LSB 時發生第一次輸出編碼跳變,則 ADC 產生負失調誤差,參考如下
圖1?ADC靜態失調圖
ADC增益誤差被定義為補償失調誤差后理想 ADC 傳輸的最后一步中點與實際 ADC 的最后一步中點的偏差,參考如下圖 2所示。
圖2?ADC增益誤差圖
為理解ADC靜態失調和ADC增益誤差(文中將以Offset error和Gain error指代),通過下圖3來進行說明。
圖3?ADC模塊Offset error(左圖)和Gain error(右圖)
如圖3(左)所示,在理想的ADC轉換中,數字輸出為000時理想的模擬電壓輸入范圍應為0~0.5LSB,而實際模擬輸入在0~2LSB時數字輸出均為000,那么此時的Offset error即為1.5LSB。如圖3(右)可知,當輸入模擬信號為8LSB時實際數字輸出比理想輸出小1LSB,即Gain error為1LSB并且是負向error。MCU的Datasheet中可以查找到如下圖4 ADC誤差電氣參數特性,可以看到在使用內部電壓參考時Gain error為±45LSB,這在精密應用場景可能會帶來不小的影響。同時除了被重點關注的Gain error和offset error,ADC可能還會存在INL error(積分非線性誤差)、DNL error(微分非線性誤差)共同決定了實際采樣轉換的非線性度。
圖4 ADC誤差電氣參數(摘自F2800137數據手冊)
二、ADC模塊誤差校準方案
1.?傳統單點法校準失調和增益誤差的方案
單點ADC校準方案通常是外部提供一個固定的電壓參考點(在全域輸入電壓范圍內選取),使用一個采樣通道定時對該參考點進行采樣,計算出該點誤差后直接同步校準到整個電壓輸入域。
該方案的劣勢在于單點的誤差無法完全反應全域的誤差,單純使用單點的誤差狀態推廣到全域進行校準,會存在無法達到預期校準精度的可能,如下圖5所示。
圖 5. 單點ADC誤差校準
2.?使用兩點法校準失調和增益誤差的方案
實際上ADC在全域輸入模擬電壓范圍內每一個點的Offset error和Gain error是不盡相同的,并且是非線性的,但出于性價比考慮這邊提出一種實現成本最優的ADC兩點動態校準法,如下圖6所示:
圖6. 雙點ADC誤差校準
如上圖 6?所示,兩點校準法需要在全域模擬輸入內選取兩個點 AinA(Vref1)和 AinB(Vref2)進行曲線 擬合、校準。
具體實施過程:
1. 本案例在當 ADC 輸入模擬電壓大于 0.4432V 左右時執行誤差校準程序(Note:在低電壓 0~0.4432V 范圍 ADC 轉換誤差較小);
2. 計算 Gain error 比(實質就是斜率之比)
3. 計算各點的 Offset error:
a) 計算 A 點的 Offset error: CalOffsetA = AoutA_idea ? (AoutA_actual ? CalGain)
b) 計算 B 點的 Offset error: CalOffsetB = AoutB_idea ? (AoutB_actual ? CalGain)
c) 計算兩點的平均 Offset error: CalOffsetAve = (CalOffsetL + CalOffsetH)/ 2
4. 設定一個非線性的誤差補償比:
a) 計算當前點之于非線性起始點的偏移量:CalNonP = ADCOUT_actual / AoutA_idea (其中ADCOUT_actual 為當前采樣輸出的 AD 值,AoutA_idea為非線性補償段的起始點,此處以 A 點代指,此值不固定、應以實際調試為準);
b) 計算補償值:CalOffsetNonL=(CalNonP * CalOffsetAve)/x (其中 x 為常量, 手動調節的補償放大比例);
由于 ADC 誤差實際表現的非線性,為得到更為精確的補償,本案例將校準分為兩段式補償:低區 誤差補償(AinS ~ AinA 段,如上圖 6 所示)、高區誤差補償(AinA ~ AinB 段)。 將計算所得參數帶入輸出誤差校準公式:
低區誤差補償公式:CaliAout = ADCOUT_actual ? CalGain + CaiOffsetA
高區誤差補償公式:CaliAout = ADCOUT_actual ? CalGain + CaiOffsetAve + CalOffsetNonL 注:實際應用中為提高動態特性,需在特定時間內調用一次誤差補償程序以實時更新補償量。
圖7. 兩點校準實施實例
三、校準中常見的問題
如圖 8?所示,C2000 產品 ADC 模塊有不同靜態誤差特性,利用上述誤差補償的算法來實現 ADC 誤差校準。針對單點方案, 無論是參考電壓源或高精度電阻, 對參考器件特性要求很高。 針對兩點方案, ADC 校準效果取決于參考點選擇, 以及校準算法,要求實時性。然而, F28P65x 新一代 Type-4 ADC 模塊硬件計算模塊可以保證校準實時性, 同時減小 CPU 的帶寬。
圖8. 不同 C2000 產品系列 ADC 誤差特性(左圖-校準前;右圖-校準后)
四、總結
本案例通過實驗驗證 ADC 兩點校準的有效性,同時在 C2000 系列芯片中導入應用(包含但不限 于 F280013x/F28002x/F28003x/F28004x/F28P6x/F28P5x)。若進一步優化算法, ADC 高精度可 進一步提升,實際應用中可根據使用場景進行適配。但需注意的是確保兩個輸入參考點的穩定、 準確。此外,最新一代 C2000 F28P65 ADC 模塊的全新特性(求和、平均、求最大/小值)在 ADC 誤差校準過程中可以提供更高效的處理過程,使得 ADC 動態校準具備了實際可行的可能性。