MCU的ADC前端接电阻分压电路,往往有坑,电阻值选取不当容易造成误差偏大。
乙方提供的工装底板到货了,固件调试时候发现ADC_H和ADC_L之间电压差有问题。外围电路如下所示,单片机选用的是STM32F103。下面的电路中有个0.91R的电阻,串在高边供电通路中,是一个采集电流的一个方案。是一个节省成本的方案。其实对于我们来说,我们要求的是稳定,当初不如就让上电流感应放大器之类的电路稳妥。
作者的本意是想先利用MCU的ADC取到电压VAdc_H和VAdc_L,再根据电阻的比例关系:Vadc=Vr*Rdown/(Rdown+Rup),分别求出电阻0.91R两个端点的电压Vr和Vr’,之后两值做差得到Vshut=Vr-Vr',最后根据欧姆定律可以很容易的求出通过0.91R电阻的电流。
这个电路的问题点就是没有重视STM32内部的ADC输入阻抗,若考虑ADC的内部电阻,那么实际电路图应该是下面这种情形:
图上的电路主要是对分压电阻的取值进行了重新选取,因为两边是对称关系,所以只看半边电路分析,下臂电阻R3与R5+ADC0 形成了并联关系,R并=(11K*1K)/11K+1K=11/12=917Ω,这个值更接近于R3的1K ,这就是电阻并联的特点,两只电阻并联,并联后的取值更接近于偏小的那只电阻。
所以开头的那个电路更符合那种ADC输入阻抗非常高的电路,最好这个阻抗比100K高出10倍的关系,也就是说有1000K既1M,而一般MCU的ADC输入阻抗并没有那么高,STM32手册中有的型号提到输入阻抗最大50K,那么在这种情况下输入阻抗也只有100*50/(100+50)=5000/150=33.3K。而STM32F103ZET6的输入阻抗有如下关系
那么可以根据固件中的参数进行相应的求证,反推这个输入阻抗。这个是我今晚想到的偏差原因,
明天上班时候再做进一步的验证吧!
两步骤:
- 问下固件人员是如何配置的Ts(cycles),查上表,正向推导
- 同时再根据万用表实测值,反推并联电阻,根据并联公式反推输入电阻
对了,补充一句,这种问题有一个很明显的现象,就是用万用表测试分压电阻中点的电压值时,再根据原理图中的比例关系计算V上臂电阻输入值,和用万用表实际测量值会出现明显的偏差!
因为是工装测试用的底板,功耗要求不高,所以此例中将下臂电阻选小,这样并联后的阻值也更接近选择值,所以影响会变小。但是不好的地方是通过分压电阻会分走一部分能量。
如果成本不在乎,也可以有其他变通方法,比如说加入一级运放做电压跟随器做阻抗变换;或者加一个电流感应放大器做高边电流检测,单端ADC输出,精度高,计算简单,成本提高不少;变通的电路应该不只这些,也欢迎高手们留言讨论。