單片機外圍模塊漫談之二,如何提高ADC轉換精度這篇文章,介紹過如何提高ADC的轉換精度。關于ADC的參考電壓,我發(fā)現有不少工程師了解的并不是很清楚。尤其是對于比如電池直接給MCU供電,用到ADC的場景。本篇文章對此做個簡單總結。
以經典的STM32F103為例,ADC的參考電壓是通過外部引腳VREF+/VREF-輸入的。對于部分64pin及以下型號,VREF+在芯片內部與VDDA信號線相連,沒有引出到片外,此時ADC參考電壓就是VDDA。
當ADC參考電壓穩(wěn)定不變時,正常采集和計算就可以。但是當參考電壓發(fā)生變化時,由于無法直接獲取變化后的參考電壓值,如果還使用之前的參考電壓就會引起測量誤差。
這種情況下該怎么辦?可以利用芯片內部參考電壓VREFINT,它是一個相對固定的電壓,典型值為1.20V。
它內部連接著ADC通道17,如果對ADC測量精度要求不是很高,可認為VREFINT就是固定的1.2V。這時可通過讀取該通道的值REFINT_DATA,反推出當前ADC的參考電壓值。因為1.2V=VREF_ADC*REFINT_DATA/FULL_SCALE
所以VREF_ADC=1.2V* FULL_SCALE/ REFINT_DATA,其中FULL_SCALE為4095(ADC分辨率12bit)
利用反推出的這個參考電壓值,再去計算實際ADC測量值。
Vchx = VREF_ADC*ADCHX_DATA/ FULL_SCALE =1.2V * (ADCHX_DATA/REFINT_DATA)。
但實際上每個芯片個體之間VREFINT會有差異,若需更高精度,可采用校準的方法:
在VDDA穩(wěn)定為3.3V時,通過ADC采集VREFINT通道的值,記為REFINT_CAL。這樣就可以得到每一顆芯片的準確VREFINT電壓。實際使用中需要將REFINT_CAL保存在MCU Flash里,以供后續(xù)使用。之后再按照上述方法(即先讀取ADC通道17反推出當前ADC實際參考電壓,再讀取實際需要采集的通道值)去計算ADC測量值。
Vchx =(3.3V *REFINT_CAL/ FULL_SCALE) *(ADCHX_DATA/REFINT_DATA)。
該方法對于用戶來說增加了一定的工作量,因為STM32F103是很多年前的老產品,沒有做出廠校準,后面出的產品如STM32F030,出廠時其實已經做了上述校準的工作,用戶直接使用即可。
說到這里大家可能會好奇這個內部的參考電壓到底是什么,它其實叫Bandgap電壓。MCU的 Bandgap 電壓(帶隙基準電壓)是一種高度穩(wěn)定的電壓基準源,通常由集成電路內部的 帶隙基準電路(Bandgap Reference Circuit)生成。Bandgap電路利用雙極性晶體管的正負溫度系數相互抵消,生成一個幾乎不隨溫度變化的電壓(典型值約為 1.2V,具體值因工藝和設計而異)。
說了這么多,內部的這個Bandgap電壓其實并不是ADC的直接參考電壓源。只不過利用了它去反推出實際的參考電壓值。使用這個方法也是有一定的局限性,因為它需要ADC先采集Bandgap通道電壓,后采集實際通道電壓,如果恰好在這個采集過程中參考電壓出現了劇烈的變化,那么轉換出來的值也是不準確的,因為反推出的參考電壓已經變了,當然這種情況出現的幾率相對較小,對于大部分場景這么用是沒問題的。
還有一些MCU,內部是帶有電壓基準源的,比如STM32L5,叫做VREFBUF。
它可以支持2種電壓2.048V和2.5V,這個電壓是可以直接作為ADC參考電壓的。
其基準源仍來自Bandgap電壓,通過分壓電路生成不同檔位輸出。從下圖框圖可以看到因運放的虛短特性,運放的負向輸入端與正向輸入端(Bandgap基準電壓)電壓相等,通過右側分壓電阻調節(jié)分壓比例使 VREFBUF 輸出電壓達到設定檔位。使用這個功能時注意要占用Vref+引腳,并且要接對地的電容,否則是產生不了這個參考電壓的。
VREFBUF的偏差是比較小的,手冊中有描述:
使用VREFBUF就方便很多了,只需要采集需要的通道即可,需要注意采集的電壓值不能超過VREFBUF電壓值,比如采集的電壓值是3V,那么就需要做分壓后采集。
當然如果系統(tǒng)里ADC的外部參考電壓本身就很穩(wěn)定,以上介紹的這些就都用不到了。
掃碼加入嵌入式交流群: