ADC檢測實際電壓值方法 最近學習STM32單片機的基礎部分,之前一直用的是STC系列的8位單片機,比如STC8A8K64S4A12,一款STC公司高性能單片機,可以滿足跑個小型RTOS(Small RTOS)。于是學習之余,在B站看到一位大佬用STC8芯片加0.96寸oled屏幕制作一款簡易的示波器,突然心中一動,正好手中缺一款對精度和功能都要求不高的檢測裝置(其實是囊中羞澀,好的示波器一款的上千,現實面前不得不低頭。每梢栽O計出來用于簡單的為后續實驗檢測設計提供保障,果斷買原件來制作。 在制作期間,研究了大佬的電壓演算過程,發現很是奇怪,不知道其中奧妙,具體列舉下:Vx = (uint32)BGV_ADR * ADCx * lsb / ADCbg / 100,其中BGV_ADR定值為65015,lsb是浮動校準值,范圍0-600,ADCx為實際STC8單片機的AD采樣值,基于12bit,所以范圍是0-4095,ADCbg是單片機第十六通道,也就是內部基準電壓值(VREF非常重要)的采樣值。就是這樣一個奇葩的公式,Vx為采集到的當前電池電壓。其中電池接入電壓為3.7v左右,外部串聯了2個電阻分壓用。
7c16e0b652300007cb6fce42f1ad7374.png (7.01 KB, 下載次數: 80)
下載附件
2020-9-27 02:13 上傳
圖1.1 簡單分壓電路圖 下面我們就用初中學過的分壓公式:Vc=VCC*(R4/(R4+R3)),大致計算一下值因該為0.617v,如果此時我們的輸入電壓利用3.3v(單片機電源輸入電壓),則計算值為0.55v左右。那么接下來,把它接到單片機的一路12bitADC采樣端,基準電壓值VREF為2.5v,為此我們來采用通常的電池電壓采樣方式計算一下:Vc=VREF*(采樣值/4096)[此處特別強調:ADC采樣時數字量的大小取決于基準電壓,而不是輸入的VCC,這是個重大誤區,此處經統計采樣值為1600-1800之間,那么Vc取中點值1700計算為1.0375v,咦,咋和0.55v不等呢,說明此時有問題,這樣的方式計算的結果是不對的。
c6175c484d206d7e83dea5c28f12f22c.png (13.48 KB, 下載次數: 95)
下載附件
2020-9-27 02:13 上傳
圖1.2 proteus仿真結果
那么,這個時候疑問就來了,為什么會出現這樣的結果呢?難道說是公式不對嗎?這樣的計算方式不是在很多例子中最常用的嗎?比如說之前的PCF8591、STM32ADC檢測電壓值等等。我要說的是這樣的計算公式使用范圍是有限制的,重點突出的是ADC的采樣功能,而對采集計算的到的電壓值是存在誤差的,當然有些簡易電路也是適用的,不如說可調電位器,簡單的2分壓電路,所以到這里你就會發現,1.0375v/2=0.5187是接近0.55v的,但是也僅僅是接近而已,誤差很明顯的。為此我通過以上幾種方式總結出一種比較精準的方法,那就是如果我們在接了外部電阻,且采樣端電阻值已知的情況下,我們可以得到公式:Vc=VREF*(ADC采樣值/(4096*R4)),也就是在原來的基礎上加入了一個分壓電阻值2K,為了使得到的電壓值更加精準,在VREF的定值上在加入浮動校準值最好是按照每100,0.02V增長規律即可(此處電壓校準值僅限于上述電路,不同分壓電路,請以實際計算值為準)。到這里我們比較精準的電壓計算公式就有了。這里還是要特別提醒,ADC采樣值在多次求取平均值時會有100-300的誤差,比如開路時單次值為4095,而去多次平均值后變為了43xx(這個本人估計是在采樣期間受到單片機供電電流、電壓影響,對此采樣在延時和程序語句執行中時間長短可能會影響),可見誤差顯現,這個是在STC8中發現的問題,在STM32上沒有試過。
以上圖文word格式:
關于ADC檢測實際電壓值.docx
(31.47 KB, 下載次數: 109)
2020-9-26 23:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|