在做一款消費電子產品時,需要采集電池電壓(3.3V-4.2V),同時在休眠的時候希望盡量減小待機電流。電池電壓采集電路采用兩個1%的300K電阻進行分壓,由該電路引起的待機電路為4.2/(300+300)mA=7uA.此時比較合理(整機的待機電流要求30uA以內)。
初始設計電路如下:
在編程采集數據時發現測試電壓與實際電壓有偏差,測試值總比實際值偏小一點。在軟件上做補償,把值修正了。
但是換一個板子測試的時候發現測試的電壓又不准了,此時知道通過軟件補償這種方法行不通。那么只能從硬件找原因。
查找datasheet發現AD的輸入阻抗最大只有50KΩ。
圖中RAIN:外部輸入阻抗,STM32芯片中這個值最大為50KΩ;
RADC:采樣開關電阻,最大值為1KΩ;
CADC:內部采樣和保持電容,最大值為8pF.
在ADC數據采集的時候需要有電流流入,那么RAIN會產生一個壓降。阻容網絡中的RADC和CADC上,對電容的充電由RADC控制。隨着源電阻(RADC)的增加,對保持電容的充電時間也相應增加。
對CADC的充電由RAIN+RADC控制,因此充電時間常數為tc = (RADC + RAIN) × CADC。如果時間過短,ADC轉換的數值會小於實際值。
通過以上數據知道,采集精度跟采集時間和輸入阻抗有關。但是通過計算得知,如果輸入阻抗為300KΩ,那么充電時間約為2.4uS。在軟件上把采樣周期調到最大(ADC_SampleTime_239_5Cycles,頻率為12M,時間19.9uS),還是存在誤差。說明此時跟周期不是主要原因。
問題出在輸如阻抗大於IC里ADC允許的最大阻抗。充電時電流分兩路,一路經過R1到R2到地,還有一路經過R1流入MCU的AD接口。(不知是不是IO口會有一定的漏電流到地,IL)此時相當於在R2旁邊並了一個電阻到地,檢測點的電壓不是標准的1/2Vbat.
那么為了更准確地檢測電池電壓,那么只好把電阻改小。如果選兩個50K的電阻,那么此處帶來的電流會后42uA.所以在電路上做了個調整:
原來接地的地方改接到一個IO口,在需要檢測的時候輸出低電平,不需要的時候輸出高電平。然后分壓電阻使用兩個30K的問題得到解決,電壓檢測誤差小於0.02V,待機電流比原來的還小了幾個微安。