现在很多单片机都有 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 值会不准确的。 关注公众号“优特美尔商城”,获取更多电子元器件知识、电路讲解、型号资料、电子资讯,欢迎留言讨论。