在作一款消费电子产品时,须要采集电池电压(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,待机电流比原来的还小了几个微安。