緣起
??最近專案中用到了終端在僅有電流的情況下啟動并正常作業的需要,此時需要先給系統充電,充電時間是毫秒級別,而 MCU 在 2V 基本就可以作業了,此時的 ADC 的基準電壓也在 2V(使用的基準電壓芯片只能保證在 2.5V ~ 3.3V 內是準確的),這就造成了 ADC 在這段時間內作業采樣資料不準確,問題就是想搞明白此時基準電壓低了,采樣值會如何變化?
知其然,也要知其所以然!
國內基本找不到太有效的講解 ADC 原理的資料(至少我是沒找到),在 TI、ADI 等公司官網倒是有不少資料可供參考!
基本原理
??STM32 微控制器中內置的 ADC 使用 SAR(Successive Approximation Register,逐次逼近)原則,分多步執行轉換,SAR ADC 的作業原理基本都是一樣的,下圖左側是 ST 給出的 ADC(以 10 位為例) 的基本原理圖,右側是專用 16 位高精度 SAR ADC 基本原理圖:

- VIN / IN+:很多專用 ADC 手冊都是都是標注為 VIN,這個就是 ADC 的輸入引腳
- VREF / REF:這個就是 ADC 的參考電壓,部分手冊標注為 Vref
- REFGND 和 IN- 在 ST MCU 的實際使用中,多數都是直接接系統地的,因此,左側圖中,地都是一樣的,
- 注意以上電容容量一共是 2C:
C / 2 + C / 4 + C / 8 + C / 16 + C / 32 + C / 64 + C / 128 + C / 256 + C / 512 + C / 512 = C,C + C = 2C,這在下面轉換時需要用到,
LSB:Least Significant Bit,最低有效位
MSB:Most Significant Bit,最高有效位
ADC 輸入電壓的最小可檢測增量變化用 LSB 表示,1LSB = VREF / 2n,n 表示 ADC 的有效位數,例如,上圖 10 位 ADC,VREF 為 3.3V 時:1LSB = 3.3 / 210 = 0.0032226V = 3.222mV = 322.2uV
轉換步驟
??SAR ADC 的轉換步驟數等于 ADC 轉換器中的位數,每個 ADC 時鐘產生一個資料位,轉換步驟可以大體上劃分為 采樣 -> 保持 -> 逐次轉換 這三步,下面我們來具體看看這三步是怎么來執行的,
- 采樣狀態: 開關 Sa 切換至 VIN,采樣期間開關 Sb 閉合,電容充電至電壓 VIN,

- 保持狀態: 開關 Sb 打開,然后開關 S1 ~ S11 切換至接地且 Sa 切換至 VREF,輸入斷開,電容保持輸入電壓,保持狀態僅僅是個臨時態,實際在這個階段就開始進行轉換,

- 轉換: 每個 ADCCLK 執行一步,每一步 ADC 輸出一位數,首先來看下圖:

其實,看上面的電容值就可以看出來,對比程序就是簡單的二分法進行逐次逼近到 ADC 指定的精度(位數),就是個二叉樹,如下圖所示的分解圖:

??有了以上原理之后,很容易得出 ,對于一個有 10 位有效位的 ADC 來說,其可能步驟有 210 = 1024 個可能的步驟,ADC 轉換的數值 = (VIN x 1024) / VREF,通用公式:ADCsrc = VIN * 2n / Vref,n 為 ADC 的有效位數 ,
轉換時間
??搞明白了以上作業原理之后,我們再來看看 ST 手冊中給出的 ADC 采樣時間公式:每個通道總的轉換時間 = TSampling + Tconversion
- TSampling :這個是我們在配置 ADC 時指定的,該值需要和外部電路的輸入阻抗匹配,這一步就是保證在采用階段,采樣保持電容有足夠的時間充電,

- Tconversion :取決于轉換精度,這個也是在配置 ADC 時指定的,具體取值如下:
精度 TConversion 12 bits 12 * ADCCLK 10 bits 10 * ADCCLK 8 bits 8 * ADCCLK 6 bits 6 * ADCCLK
??因此,每個通道總的轉換時間就是:Ttotal = (SMP + RES) * ADCCLK,其中,SMP 是采樣時間,需要和外部輸入阻抗搭配;RES 是轉換精度,降低精度可提高速度;ADCCLK 是 ADC 模塊作業時鐘
外部輸入阻抗和采樣時間
??上面我們說道,TSampling 需要和外部輸入阻抗相匹配,那么,這個外部輸入阻抗具體怎么來計算,或者說如何進行確定呢?首先,來看一下 ST 給出的下圖:

不同 ADC 配置下允許的最大外部輸入阻抗計算公式如下 :

- K:采樣周期
- N:轉換精度
- fADC:取決于作業電壓
- CADC 和 RADC:這個是設計 ADC 的固有引數,位置見上圖,具體數值參考資料手冊
舉個例子,在 30MHz 的 ADC 時鐘;12 位轉換精度;3 個周期采樣的配置下,允許的最大外部輸入阻抗 RAIN = [ ( 3 - 0.5 ) / ( 30M * 4 * 14 * ln2 ) ] – 1.5KΩ = 0.65KΩ,注意,這里的 CADC 和 RADC 的值取自于 STM32Fx 的資料手冊,
參考電壓
??為 VREF 提供電壓的源的穩定性是影響 ADC 精度的一個重要因素,電源或電壓調節器的輸出可能會因溫度或負載波動等原因而變化,下圖表示了 ADC 的參考電壓在不同值時導致輸出變化的關系,

??當 ADC 輸入電壓超出基準電壓,哪怕只有很短的一段時間,它也會向基準電壓源注入電流,因此基準電壓源必須要能吸取一定量的電流,基準電壓源可集成具有足夠驅動電流的緩沖器,也可采用適當的運算放大器作為緩沖器,下圖是一個典型的精密逐次逼近型 ADC 基準電壓源電路:

??ADC 基準電壓輸入端的開關電容具有動態負載,因此基準電壓源電路必須能夠處理與時間和吞吐速率相關的電流,為避免轉換誤差,特定吞吐速率下所需的平均電流不應使基準電壓下降超過 ? LSB,
ADC 誤差
??前面說了,基準電壓會影響 ADC 的精度,在使用了合適的基準電壓芯片之后,參考電壓的誤差我們暫且不考慮,ADC 本身也會有很多原因造成誤差,非理想 ADC 的直流誤差主要是偏置電壓誤差和增益誤差,下圖是一個三位 ADC 帶有偏移和增益誤差的理想和實際ADC 轉換對比圖,

??偏移誤差是第一次實際轉換和第一次理想轉換之間的偏移造成的誤差,第一次轉換發生在數字 ADC 輸出從 0 變為 1 時,引入了偏移誤差之后,原來 ADC 采樣值的公式就可以表示為:ADCsrc = (VIN - Voffsef) * 2n / Vref,n 為 ADC 的有效位數
??增益誤差等于從零到滿刻度的理想斜率與從零到滿刻度的實際斜率之間的差,再引入了增益誤差之后,原來 ADC 采樣值的公式就可以表示為:ADCsrc = (VIN - Voffsef) * 2n / ( Vref ( 1 - GEADC)),n 為 ADC 的有效位數,GEADC = (實際增益 - 理想增益) / 實際增益
除了以上兩個誤差之外,ST 還列舉了以下一些誤差:
- 微分線性誤差:微分線性誤差(DLE)為實際步進和理想步進之間的最大偏離,
- 積分線性誤差:積分線性誤差為任何實際轉換和端點相關線間的最大偏離,
- 總未調整誤差:總未調整誤差(TUE)為實際和理想傳輸曲線間的最大偏離,
關于每個誤差的解釋以及對應的處理,ST 給出的手冊中有很詳細的說明,這里就不多說,具體參見 《AN2834 Application note How to get the best ADC accuracy in STM32 microcontrollers》
參考
- https://www.analog.com/cn/analog-dialogue/articles/precision-successive-approximation-adcs.html
- https://www.st.com/resource/en/application_note/cd00211314-how-to-get-the-best-adc-accuracy-in-stm32-microcontrollers-stmicroelectronics.pdf
- http://news.eeworld.com.cn/mcu/article_2017021933866.html
- https://www.ti.com/lit/an/slyt331/slyt331.pdf?ts=1631704840654&ref_url=https%253A%252F%252Fwww.google.com%252F
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301326.html
標籤:其他
上一篇:蘋果這波是要偷家啊。。
