在作一款消費電子產品時,須要採集電池電壓(3.3V-4.2V),同時在休眠的時候但願儘可能減少待機電流。電池電壓採集電路採用兩個1%的300K電阻進行分壓,由該電路引發的待機電路爲4.2/(300+300)mA=7uA.此時比較合理(整機的待機電流要求30uA之內)。編程
初始設計電路以下:網絡
在編程採集數據時發現測試電壓與實際電壓有誤差,測試值總比實際值偏小一點。在軟件上作補償,把值修正了。測試
可是換一個板子測試的時候發現測試的電壓又不許了,此時知道經過軟件補償這種方法行不通。那麼只能從硬件找緣由。spa
查找datasheet發現AD的輸入阻抗最大隻有50KΩ。設計
圖中RAIN:外部輸入阻抗,STM32芯片中這個值最大爲50KΩ;blog
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,待機電流比原來的還小了幾個微安。