我們經常會使用STM32 ADC功能測試外部電壓,在一些精度不高的場合,我們一般就用3.3V作為參考電壓來計算測到的電壓值。不過,這種情況很少見,可能只有單片機學習板才會這樣使用。因為我們使用的3.3V穩(wěn)壓芯片,很少有標準的3.300V輸出,有可能是3.270V,也可能是3.345V,而且,還存在個體差異,這個板子上的電壓是3.294V,另外一個板子上面,就可能是3.312V。如果我們都用3.300來計算的話,同樣的電壓,測出來的結果就會存在mV級別的差異。
在實際使用中,我們一般使用外部基準電壓芯片,例如,100腳的STM32一般都有VREF引腳,就是用來接外部基準電壓芯片,例如REF3133,輸出的電壓是標準的3.300V。
為什么不用基準電壓芯片作為電源供電芯片?
因為基準電壓芯片的輸出電流都是小于25mA的,對于一般的電路板應用,這么點輸出電流不足以讓電路板工作。
不同的STM32 如何使用基準電壓芯片?
對于100腳及其以上的芯片,把基準電壓芯片連接到VREF芯片即可。
對于100腳以下的芯片,STM32沒有把VREF引腳引出來,所以,我們只能把基準電壓芯片連接到VDDA引腳。注意,STM32單片機上面有好多電源引腳,其中有若干VDD引腳,只有一個VDDA引腳,VDDA引腳就是模擬供電引腳。不過,需要注意,VDDA的電壓不是隨便定義的。例如,STM32F051系列單片機就規(guī)定,VDDA必須要大于或者等于VDD才可以正常工作,所以這時候,最好是給單片機3.0V供電,再給VDDA采用一個3.3V的基準電壓芯片供電。
不用電壓基準電壓芯片可以嗎?
如果在你的應用中,VDDA引腳和VDD引腳連在一起,都是由電源芯片供電,這時候,如果你能知道VDDA的實際電壓,也可以得到精確的ADC結果。例如,你可以用萬用表測到VDDA電壓,例如,是3.286V,你就可以使用3286來計算。不過,這也只能是在實驗的時候,在實際使用中,如果你做了1萬個板子,然后需要用萬用表量1萬個板子的電源電壓,然后再給每個板子修改程序,顯示是不可能的。
所以,STM32給我們又一個解決方案,STM32在內部都有一個參考電壓引腳,可以通過配置,把這個腳連接到ADC輸入引腳,是內部連接。然后再計算實際的VDDA值。不過,STM32也存在個體差異,所以,它并沒有在手冊上給出我們這個參考電壓是多大。而是用出廠時調教好的校準值和得到的參考電壓值一起使用。如下圖:
VREFINT_CAL是校準值,這個值,每個單片機都不一樣,被存儲到了0X1FFFF7BA和0X1FFFF7BB,使用的時候,需要先讀出來。
說多了都是眼淚,不說了,給你個程序看吧,程序當中,有讀取VREFINT_CAL和VREFINT_DATA值的語句。你可以看個究竟。這個程序已經實踐驗證過了,不會有問題,下面是實驗結果:
我把測到的VDDA值,發(fā)送到了串口查看。然后我用萬用表測了一下實際的VDDA值,由于我的萬用表精度有限,只能測到小數點后2位數字,萬用表得到的是3.32V和3.31V之間跳動。串口發(fā)送的值,小數點后第三位四舍五入之后,結果也是3.32V和3.31V。結果是一致的。說明這種方法也是可取的。