现在很多单片机都有ADC功能了,10位或者12位的,使用ADC测量电压是很方便的,测量电阻阻值的话可以使用欧姆定律进行分压然后测量分压后的电压即可计算出电阻阻值,最简单的电阻测量电路如下图:
这时候测量点的电压计算公式为:Vo=R2 / (R1 + R2) * Uref。
这是最简单的测量计算方法。但是因为简单也会导致不少小问题,比如如果R1取值为2K,Uref为5V,而R2的阻值范围在5到10欧姆左右,那么R2分得的电压Vo=0.01247到0.02488,电压变化的范围过小,如果ADC是12位的,ADC的参考电压为3.3V,这时候ADC的采集值的范围在15到30,也就是AD值的变化范围有30-15=15个,而电阻的变化范围为10-5=5欧姆,也就是5欧姆的变化范围用15个AD值的变化来计算,那么AD测量的精度就是:5欧姆 / 15个 = 0.33欧姆,也就是AD值加1,计算得到的电阻值就要加0.33欧姆,这精度着实让人接受不了。
再比如R1和Uref的值不变,而R2的阻值范围在1K到2K之间,同样的计算方法得到R2的分压值Vo=1.1到1.65伏,AD值的范围为1365到2048,AD的测量精度为:1K/(2048-1365)=1.46。奇怪的是为什么AD值的范围这么大了,精度反而更很差劲呢?因为电阻的取值范围很宽,导致精度降低了。
怎么办?我想要测量一个比较精密的电阻的阻值R2,该怎么办?下面的方法是网上的电桥测量电阻的方法,我为了测量方便有所修改。电阻网络电路如下图:
R2的电阻阻值大约在100到200欧姆,我们取一个参考电阻R3为100欧,R1和R3阻值相同为2K。这样得到了U1和U2两个分压值,U2为固定电压U2=100 / (100+2000) * Uref。U1的值根据R2的变化而改变:U1=R2 / (R2+2000) * ref。得到了U1和U2之后可以计算压差:
△U=U1-U2,将这两个电压输入到运算放大器中去进行合理放大,使得得到的输出电压范围在ADC参考电压范围内尽可能的宽,这样使用ADC就能更加精确地测量到电压值。使用运放进行放大的电路如下图:
在R5=R6,R7=R8的情况下,运放的放大倍数m=R7 / R5。电路中的放大倍数为m=20。经运放放大后得到了Uo送到单片机系统的ADC中去进行AD采样。那么我们可以计算一下ADC测量得到的AD值和电阻R2之间的关系。
现在假定ADC系统的参考电压为Uadc,ADC采样位数为12位,ADC的测量值为A,那么Uo的计算公式如下:
Uo = A / 4096 * Uadc
而Uo也是运放的输出电压,根据电桥网络和运放进行计算可以得到:
Uo = (U1-U2) * m = ( (R2/(R1+R2) - R4/(R3+R4) ) * Uref * m
也就是说:
( (R2/(R1+R2) - R4/(R3+R4) ) * Uref * m = A / 4096 * Uadc ----------------------------①
上式中R1、R3、R4、m、Uref、Uadc都是已知的,那么根据ADC测量得到的值A’就可以轻松计算出来电阻R2的阻值。
上面说的是理论上的计算方式,的确是这样的,但是往往现实都比较残酷,由于电阻都有误差而且运放也不是绝对精密,那么已知的R1、R3、R4、m、Uref、Uadc几个参数都是和真实值有微小差别的,例如电阻R1的标称电阻为2K,误差为1%,万用表测量得到的阻值为1980欧姆,显然误差是有的,直接带入式子进行计算是不可行的。那怎么办呢?
解决办法总是有的。前面公式①中是根据ADC的测量值和几个已知参数来求电阻R2的阻值,那么我们就反过来,使用若干组已知的固定阻值的R2电阻接入电阻网络并测量出AD值A,来计算R1、R3、R4、m、Uref、Uadc几个参数,但是这几个参数有点多,6个未知参数需要6组式子才能解出来,非常的费劲,那么我们就简化一下计算方式。
我们将R4设为0欧姆,也就是U2接到GND,U2=0,这样式子①就能简化成:
R2/(R1+R2) * Uref * m = A / 4096 * Uadc ----------------------------②
这不简单多了!好,现在我们要求出式子中的R1的阻值和放大倍数m,两个未知数我们就需要两组已知的点(R2,A)来求出参数R1和m。这样取第一个点的测试电阻为R21,AD值为A1,第二个点的测试电阻为R22,AD值为A2,带入到式子②中去得到:
R21/(R1+R21) * Uref * m = A1 / 4096 * Uadc
R22/(R1+R22) * Uref * m = A2 / 4096 * Uadc
上面的式子除以下面的式子可以得到:
(R21/(R1+R21)) / (R22/(R1+R22)) = A1 / A2
进过整理之后得到:
R1=(R21 * R22) * (A2 - A1) / (R22A1 - R21 * A2)
这就求出来了R1的阻值了。
然后我们再求m的值,根据式子②可以得到m的计算公式为:
m = (A / 4096 * Uadc) / (R2/(R1+R2) * Uref)
我们将电阻网络的电源和ADC系统的参考电源连接到一起,也就是说Uref=Uadc,我们要保证电源的稳定性,可以使用TL431或者REF3030等高精度稳压芯片生产稳定电压源为电阻网络和ADC系统供电。由于Uref=Uadc,这样的话上面的式子得到了简化:
m = (A / 4096) / (R2/(R1+R2))
整理得到:
m = A(R1+R2) / (4096 * R2) ----------------------------③
式子③中R1在前面已经算出来了,那么m也求出来了。
到这里我们已经求出来了R1和m的值,后面就能根据这两个参数和测量出来的AD值求出来待测电阻R2的值了。由于Uref=Uadc,式子②变成:
R2/(R1+R2) * m = A / 4096
整理得到:
R2 = A * R1 / (4096*m - A) ----------------------------④
式子④已经简单到只需要A、R1、m就能计算出来R2的阻值了,并且使用的R1和m都是我们自己计算出来的值,而不是直接使用理论计算出来的值,精度提高了不少。同时我们可以发现由于Uref=Uadc,上面的式子②两端约分了,所有计算竟然和Uref、Uadc没有关系了,也就是说不管Uref、Uadc怎么变动,只要Uref和Uadc一直是相等的,所有参数和阻值的计算都不涉及到Uref和Uadc。但是我们最好要保证Uadc的稳定,不然测量出来的AD值会不准确的。