1. 为什么选恒流源测电阻:方案对比与整机思路
电阻测量看着是最基础的活儿,但真要做到量程覆盖四个数量级、读数稳定不跳、误差能说清楚,坑比想象的多。我做这个基于51单片机的电阻测量(恒流源方案)小项目时,最初的动机很朴素:手上那台万用表测 10Ω 以下的电阻时读数飘得厉害,测 100kΩ 以上又慢又跳,想自己搭一个能自动换档、读数稳定的测量模块,顺便把恒流源这套东西吃透。这篇就把从方案选型到电路落地、从参数计算到校准排错的全过程摊开讲,适合有 51 基础、想练手模拟电路和采样电路的朋友,也适合正在做课程设计或测量类小项目的同学抄作业。
1.1 三种测阻方式的横向对比
电阻测量的主流做法有三种:分压法、恒压串接法、恒流源法。分压法最简单,一个已知电阻和被测电阻串联,测中间节点电压反推阻值;恒压串接法本质上是分压法的变种,只是把已知电阻换成了稳压输出加采样电阻。这两种方案的共同问题是被测电阻上的电流随阻值变化,10Ω 上跑 0.5A、100kΩ 上只剩 50µA,前者烧器件后者信噪比惨不忍睹。恒流源法的核心优势就是把这个变量钉死:无论负载多大,流过它的电流恒定,于是电压和阻值就成了严格的线性关系,标定简单、误差模型清晰、量程切换只靠换电流档位就能实现。
我用表格把三者的实际表现列一下,方便横向判断:
| 方案 | 线性度 | 量程切换 | 器件成本 | 主要短板 |
|---|---|---|---|---|
| 分压法 | 差(非线性) | 换已知电阻 | 极低 | 换算公式带除法,单片机开销大 |
| 恒压串接法 | 中 | 换采样电阻 | 低 | 小阻值电流过大、大阻值信号过小 |
| 恒流源法 | 好(严格线性) | 换电流档 | 中 | 需要额外基准与恒流电路 |
从工程角度看,恒流源法多花的钱就是一颗精密基准、一颗好一点的运放、几颗低温漂电阻,换来的是整个量程内误差特性一致,这在后面对齐校准系数时能省下大量麻烦。所以这个项目最终定的是恒流源方案。
1.2 恒流法的工作模型与误差来源拆解
恒流法的数学模型非常干净:R = V_meas / I。这个式子看着没毛病,但实际误差全藏在两个量的获取方式里。V_meas由 ADC 采样得到,误差来自 ADC 的分辨率、参考电压精度、零点失调和噪声;I由基准电压 Vref 和采样电阻 Rs 决定,I = Vref / Rs,误差来自基准温漂、Rs 的精度和温漂、运放的输入失调电压。把这些串起来:
R = (code / 2^n) × Vref_adc × Rs / Vref_src
其中 code 是 ADC 读数,n 是位数。从这个展开式能一眼看出关键点:Vref_adc 和 Vref_src 如果是同一个基准,它们直接约掉,整条链路的基准漂移当场消失,只剩 Rs 和 ADC 的量化误差。这个发现直接决定了后面硬件架构怎么走——ADC 参考和恒流源参考共用一路 2.5V,整套系统的温度稳定性一下子提上来一个档次。
另一个容易被忽略的误差项是运放输入失调电压 Vos。它等效成基准电压的一个固定偏移,在大量程档位上占比很小,但在小阻值档位就是个灾难。简单算一下:100Ω 档位跑 25mA,如果运放 Vos 是 7mV,等效到被测电阻上就是7mV / 25mA = 0.28Ω的固定偏移,测 1Ω 的电阻相对误差接近 30%。所以小阻值档位必须做零点补偿,或者干脆换用低失调的精密运放。
1.3 整机结构与器件清单
整机分成四块:恒流源电路、量程切换网络、ADC 采样前端、51 主控与人机交互。信号流向是:单片机选通某个电流档 → 恒流源向被测电阻输出恒定电流 → 被测电阻上产生压降 → 前端缓冲与钳位保护 → ADC 采样 → 单片机滤波换算 → 显示。供电用 12V 单电源给运放和恒流源,再用一路 5V 给单片机和数字部分,2.5V 精密基准同时喂给恒流源同相端和 ADC 参考端。
下面是我实际的器件清单,都是市面上容易买到的通用件:
| 功能模块 | 器件 | 关键参数 | 备注 |
|---|---|---|---|
| 主控 | 51内核单片机(40脚DIP封装) | 11.0592MHz 晶振 | IO 口够用即可 |
| 恒流控制 | 通用双运放 | 单电源 12V 供电 | 原型用通用款,正式版换低失调 |
| 调整管 | 逻辑电平 N 沟道 MOS | Vgs(th) ≤ 2V | 别用普通高压 MOS |
| 基准 | 可调精密基准源 | 2.5V 输出 | 同时供 ADC 参考 |
| 采样电阻 | 金属膜 0.1% / 25ppm | 100Ω、1k、10k、100k | 四档 |
| ADC | 12 位串行 ADC | SPI 三线接口 | 8 位分辨率不够用 |
| 档位切换 | 5V 小型信号继电器 ×4 | 接触电阻 <100mΩ | 见 2.3 的取舍分析 |
| 显示 | 1602 字符型液晶 | 并口 4 线驱动 | 省 IO |
| 存储 | I2C 型 E2PROM | 2Kbit | 存校准系数 |
| 电源 | 12V 适配器 + 7805 | 加 LC 滤波 | 模拟数字分开走线 |
清单里有两处是刻意的选择:ADC 用 12 位而不是 8 位,档位切换用继电器而不是模拟开关。理由后面两章会详细展开,先记住结论。
2. 恒流源核心电路怎么搭、参数怎么算
恒流源是这个项目的心脏,做不好后面全是白搭。我见过不少资料把它画得玄乎,其实核心就一句话:用一个运放强迫采样电阻上的压降等于基准电压,反馈环路自动调节调整管的导通程度,让流过负载的电流稳定在Vref/Rs。
2.1 运放加 MOS 的低边恒流拓扑
我选的是低边采样、N 沟道 MOS 调整的拓扑。连接方式是:12V 电源 → 被测电阻 → MOS 漏极 → MOS 源极 → 采样电阻 Rs → 地。运放的同相端接 2.5V 基准,反相端接 MOS 源极(也就是 Rs 上端),运放输出接 MOS 栅极。整个回路形成一个负反馈:假设电流偏大,Rs 上的压降升高,反相端电压超过同相端,运放输出下降,MOS 栅压降低,电流回落;电流偏小时反过来。
为什么选低边而不是高边?三个实际理由。第一,被测电阻一端接地,两线制表笔接起来最方便,测量时不用考虑共模电压。第二,低压侧采样对运放的共模输入范围要求很低,同相端就 2.5V,反相端 0~2.5V 波动,普通运放在 12V 单电源下都能覆盖。第三,栅极驱动简单,运放输出 3~10V 就能让逻辑电平 MOS 充分导通,不需要额外的自举或电荷泵电路。
调整管用 N 沟道 MOS 而不是 NPN 三极管,是因为三极管有基极电流:Ic = Ie - Ib,基极电流会从采样电阻那一路偷走一部分,虽然 β 大时误差只有千分之几,但既然是做测量设备,这千分之几没理由留着。MOS 只有栅极漏电流,纳安级,可以忽略。这里有个必须注意的点:一定要选逻辑电平(Logic Level)的 MOS,Vgs(th) 在 1~2V 之间。普通高压 MOS 的 Vgs(th) 常到 3~4V,配上 2.5V 采样压降,运放输出得跑到 6V 以上才勉强导通,在小电流档位会直接失控。
2.2 采样电阻与档位电流的取值计算
档位设计是整个项目最需要动笔算的地方。我先定了一个前提:基准电压和 ADC 参考都用 2.5V,这样满量程时被测电阻上的压降正好是 2.5V,于是有:
R_max = Rs(因为V_meas = I × R = (Vref/Rs) × R,当V_meas = Vref时R = Rs)
这个结论让档位设计变得极其干净:想要多大量程,就配多大的采样电阻。四档具体取值:
| 档位 | Rs | 恒流值 I = 2.5V/Rs | 量程上限 | 满量程时被测电阻功耗 |
|---|---|---|---|---|
| 1 | 100Ω | 25mA | 100Ω | 62.5mW |
| 2 | 1kΩ | 2.5mA | 1kΩ | 6.25mW |
| 3 | 10kΩ | 250µA | 10kΩ | 0.6mW |
| 4 | 100kΩ | 25µA | 100kΩ | 6.3µW |
相邻档位电流比是 10,正好一个数量级,量程衔接处留了重叠区。实际测量时不会正好卡在量程边界,靠自动换档逻辑往中间靠,读数精度最有保障。
再验证一下 12 位 ADC 的分辨能力。2.5V 满量程、4096 个码,1 个 LSB 对应2.5/4096 = 0.61mV。换算成阻值分辨率就是0.61mV / I:
- 100Ω 档:0.61mV / 25mA = 0.024Ω,分辨率约 0.024% 满量程
- 1kΩ 档:0.61mV / 2.5mA = 0.244Ω
- 10kΩ 档:0.61mV / 250µA = 2.44Ω
- 100kΩ 档:0.61mV / 25µA = 24.4Ω
四档的相对分辨率都是 1/4096,一致。这就是恒流法的漂亮之处——换成 8 位 ADC,相对分辨率只有 1/256,测 100Ω 电阻时误差接近 0.4Ω,测 1Ω 的电阻会有 40% 的量化误差,所以这个项目里 8 位 ADC 是不合格的,必须上 12 位。
采样电阻的功率也要核一下:25mA 跑过 100Ω,功耗I²R = 0.0625W。选 1/4W 的金属膜电阻有 4 倍余量,稳妥。但要注意自热引起的阻值漂移,25ppm/℃ 的电阻在温升 10℃ 时漂移 250ppm,也就是 0.025%,对四位数显示来说刚好卡在末位,能接受但不能再差了。所以 100Ω 这一档我用了两颗 200Ω 并联而不是单颗 100Ω,功率分摊后温升明显降低,这是实测下来的小技巧。
2.3 档位切换:继电器还是模拟开关
多档切换最直觉的做法是用模拟开关,比如常见的多路模拟开关芯片,导通电阻几十欧。问题就出在这个几十欧上:它串在采样电阻的回路里,直接加到 Rs 上。100Ω 档位如果串进 50Ω 的开关电阻,实际采样电阻变成 150Ω,电流算错 33%,这还怎么玩。而且模拟开关的导通电阻随温度和信号电压变化,想靠标定去补偿都补不准。
所以低阻档(100Ω、1kΩ)我用了小型 5V 信号继电器,接触电阻标称小于 100mΩ,串到 100Ω 支路里误差 0.1%,可以接受。10kΩ 和 100kΩ 两档对串联电阻不敏感——100kΩ 支路里串 50Ω 才 0.05% 的误差——这两档可以用模拟开关省钱,但我图省事,四个档位统一用继电器了。继电器的驱动用一颗达林顿驱动阵列或者四个 S8050 加续流二极管,单片机 IO 出高电平导通。这里必须加的续流二极管千万别省,我第一版省了,结果继电器断开瞬间的反电动势把驱动三极管打穿了两颗,排查了半天才想到。
继电器切换还有个副作用要处理:机械触点抖动和建立时间。切档之后不能立刻采样,程序里至少延时 20ms 让触点稳定,再延时 10ms 让运放环路建立,然后才开始读 ADC。这个延时看着是浪费时间,但省掉它读数的第一帧必然是垃圾值。
2.4 基准与供电的余量核算
恒流源要正常工作,运放和 MOS 得有足够的电压余量。算一下最坏情况:被测电阻满量程 100kΩ、电流 25µA、被测电阻上压降 2.5V,采样电阻上再来 2.5V,MOS 的 Vds 至少留 0.5V 才在饱和区,加起来 5.5V。12V 供电看着富余得很,但别忘了运放输出要驱动栅极:MOS 源极电压最高 2.5V,栅极得跑到2.5 + Vgs,逻辑电平 MOS 在 25mA 时 Vgs 大约 2V,栅压需要 4.5V。通用运放在 12V 单电源下输出摆幅能到 10V 左右,驱动没问题。
真正需要留意的是基准源的负载能力。可调精密基准源在 2.5V 输出时通常能拉 1~100mA,看起来够,但它驱动的是运放同相端,输入阻抗极高,实际电流只有纳安级,完全没有压力。反过来说,如果基准还要同时给 ADC 参考引脚供电,就得看 ADC 参考引脚的输入阻抗了,有些 ADC 的参考输入是开关电容结构,需要并一颗 0.1µF 加 10µF 的去耦电容,否则采样瞬间的电荷注入会把基准拉塌。这个细节我踩过:不加电容时读数末位一直在跳,加上之后立刻稳定。
3. 采样、调理与 51 单片机的接口
恒流源把电阻变成了电压,接下来的活儿是把这路电压干净地送进 ADC。这一段看着简单,实际是整个系统里最容易出问题的地方,因为 51 单片机的 IO 是准双向口,抗干扰能力也一般,稍不注意读数就开始蹦。
3.1 保护电路与输入调理
被测电阻那头是完全开放的,用户可能拿表笔去戳带电的电路,也可能测一个带大电容的板子。所以输入端必须做保护:表笔两端并一颗双向 TVS,串联一颗自恢复保险丝(PTC),再在 ADC 输入脚前加两级钳位二极管到 5V 和地。这里有个权衡——串了 PTC 之后,PTC 的几十欧电阻会串进测量回路,对 100Ω 档位是致命的。解决办法是把 PTC 放在被测电阻和恒流源之间靠电源那一侧,让它不在采样回路上,这样既保护了电路又不影响测量精度。
输入调理还有一个容易被忽略的问题:ADC 输入端的 RC 滤波。被测电阻上可能出现几十毫伏的工频干扰,尤其是测高阻值时表笔线像天线一样。我在 ADC 输入前加了 10kΩ 串联电阻加 0.1µF 到地,截止频率大约 160Hz,对 50Hz 干扰能压到 1/3 左右。但这个串联电阻不能太大,因为 ADC 采样时会有电荷注入,电阻大建立时间就长。10kΩ 配 12 位 ADC 的采样周期,实测建立时间是够的,再往上加就会读到上一帧的残留值。
3.2 ADC 的选型与 51 的接口时序
51 内核没有内置 ADC,必须外挂。外挂有两条路:并行 ADC 和串行 ADC。并行 ADC 快,但要占 8 个 IO 加控制线,51 的 32 个 IO 一下子去掉一半;串行 ADC 只占 3~4 个 IO,速度慢一点但对电阻测量这种低频应用完全够。我选串行,用 IO 口模拟 SPI 时序。
51 的 IO 口是准双向结构,做输出时能拉低也能拉高(拉高是弱上拉),做输入时必须先写 1。模拟 SPI 读数据的时候,MISO 那根线要先把端口寄存器置 1,让它处于弱上拉状态,然后才能读外部器件的输出。这一步很多新手会漏,结果读出来全是 0xFF,以为是 ADC 坏了,其实是被自己的端口锁死了。
下面是读一次 ADC 的核心代码,用的是 12 位、三线接口的通用串行 ADC:
sbit ADC_CS = P1^0; sbit ADC_CLK = P1^1; sbit ADC_DIN = P1^2; sbit ADC_DOUT= P1^3; unsigned int adc_read(void) { unsigned char i; unsigned int val = 0; ADC_CS = 0; /* 片选拉低,开始一帧 */ ADC_CLK = 0; for (i = 0; i < 12; i++) { ADC_CLK = 1; /* 上升沿,ADC 输出一位 */ val <<= 1; if (ADC_DOUT) val |= 1; /* DOUT 口已置 1,可直接读 */ ADC_CLK = 0; } ADC_CS = 1; /* 释放片选 */ return val & 0x0FFF; }注意ADC_DOUT在初始化时要写 1,否则读到的永远是 0。另外不同型号的串行 ADC 时序细节不一样,有的在下降沿输出、有的在上升沿,写代码前一定要对着手册把时序图看两遍,别照抄别人的代码。
3.3 比率测量:让基准漂移自动抵消
前面提过,R = code × Rs / 4096,前提是 ADC 参考和恒流源基准共用同一路 2.5V。这个做法叫比率式测量,它的价值在于:基准电压随温度漂移、随时间老化,只要两路同时漂,比值不变,测量结果就稳。我用的是同一颗基准芯片,通过一颗运放缓冲后分别送给恒流源同相端和 ADC 参考脚,两路的走线尽量靠近,让它们处在同一个温度场里。
这招的效果我实测过:把整机放进恒温箱做 10℃ 到 40℃ 扫描,没有用比率法(ADC 用 5V 供电做参考)时读数漂了 0.6%,改成共用 2.5V 基准后漂移降到 0.05% 以内,基本就是采样电阻本身的温漂了。所以这个改动虽然只改了两根线,收益却是数量级的。
4. 手把手实操:分步搭建与调试记录
电路图看懂了不等于能焊出能用的板子。我按自己的调试顺序写一遍,这个顺序是刻意安排的——先让恒流源单独工作,再接采样,最后接显示,每一步都能独立验证,出问题好定位。
4.1 上电前的静态检查与分阶段调试
焊接完成后第一件事不是上电,是用万用表二极管档量三件事:电源对地有没有短路、运放正负电源脚有没有接反、MOS 的三个脚有没有焊错。这三项里最容易错的是 MOS 的引脚顺序,不同封装(TO-92、SOT-23、TO-252)引脚定义完全不同,我至少见过两次因为封装搞混导致上电就冒烟的情况。
确认无误后分段上电。第一步只焊运放、MOS、采样电阻和基准,不接单片机和 ADC。上电后用万用表电流档串在负载位置,测实际恒流值。100Ω 档位应该读到 25mA 左右,如果读到 0,先量运放同相端是不是 2.5V,再量运放输出是不是在 4~5V 附近,最后量 MOS 源极电压——正常应该是 2.5V(因为反馈把源极钉在同相端电压上)。源极 0V 说明运放没输出或者 MOS 没导通,源极接近 12V 说明反馈断了。
第二步接上 ADC,把被测端接一个已知的 0.1% 精密电阻,读原始码值。这时候不看换算结果,只看码值稳不稳。手靠近表笔线时码值跳 10 个字以上,说明屏蔽或滤波没做好;码值稳定但和理论值差得远,说明基准或者 Rs 有问题。
第三步接显示和按键,把换算和人机交互跑通。这个顺序的核心逻辑是:任何一步出问题,前面已经验证过的部分就可以排除,不用在整机上瞎猜。
4.2 两点校准与系数写入
校准是这个项目能不能出精度的关键。理论公式算出来的系数受 Rs 实际值、运放失调、ADC 增益误差影响,直接用会差得离谱。正确做法是每档做两点校准:
- 零点:把表笔短接,读一组码值
code0,理论上对应 0Ω; - 满度点:接一颗 0.1% 精密电阻,比如 100Ω 档用 100Ω 标准电阻,读
code1; - 斜率
k = R_std / (code1 - code0),截距b = -k × code0; - 换算公式变成
R = k × code + b。
四个档位各标一组,总共 8 个系数,存进 E2PROM。上电时读出来,根据当前档位选对应的一组。这个做法把运放失调和 Rs 误差一起吃掉了,代价是需要一套精密电阻做标准件。我用的是 0.1% 金属膜电阻,四档共 4 颗,成本十几块钱,换来的是全量程误差压到 0.2% 以内。
要提醒一句:校准用的标准电阻的精度就是你的测量精度上限。用 1% 的电阻去校准,别指望测出来是 0.1% 的准确度。另外校准环境温度要记录,因为采样电阻的温漂在 25ppm/℃ 量级,10℃ 的温度差就是 0.025% 的偏差,虽然不大,但如果你追求四位半的显示,这个偏差是能看出来的。
4.3 显示与按键交互的实现
显示用 1602 字符液晶,4 线驱动省 IO。第一行显示阻值和单位,第二行显示当前档位和原始码值——原始码值这行是给调试用的,正式版可以换成别的信息。按键我用三个:一个是量程手动锁定,一个是校准模式,一个是零点补偿。量程锁定挺有用,自动换档在测量中途跳档会导致读数突变,做对比测量时手动锁定更舒服。
液晶刷新的节奏要控制一下。整屏刷新一次大约需要 1~2ms,如果每采一次样就刷一次屏,屏幕会明显闪。我的做法是采 9 次算出一个结果,然后只更新数字部分,不重刷整屏,刷新间隔控制在 200ms 左右,看起来就稳了。另外液晶的数据线要和 ADC 的时钟线离远点,我第一版把两者排在相邻的排针上,液晶一刷新 ADC 读数就抖,把它们分开走线之后才解决。
5. 软件算法:滤波、换档与换算
硬件做得再干净,原始码值里总是会混进噪声。软件这边的活儿有这么几件:把噪声压下去、把档位自动选对、把码值换算成阻值。
5.1 中值平均滤波与代码实现
滤波算法有很多种,滑动平均、一阶惯性、中值滤波各有适用场景。电阻测量这种场景的特点是:偶发的脉冲干扰(继电器切换、液晶刷新、外部静电)比连续噪声更常见,所以中值滤波比纯平均更合适。我用的是中值加平均的组合:连续采 9 次,排序后去掉最大最小的各 2 个,剩下 5 个求平均。这样既抗脉冲又降随机噪声,9 次采样的时间开销在 51 上大约几毫秒,完全可以接受。
/* 中值平均滤波:采 9 次,排序后取中间 5 个求平均 */ unsigned int filter_adc(void) { unsigned int buf[9], t; unsigned char i, j; unsigned int sum = 0; for (i = 0; i < 9; i++) { buf[i] = adc_read(); } /* 冒泡排序,9 个数完全够用 */ for (i = 0; i < 8; i++) { for (j = i + 1; j < 9; j++) { if (buf[j] < buf[i]) { t = buf[i]; buf[i] = buf[j]; buf[j] = t; } } } for (i = 2; i < 7; i++) { sum += buf[i]; } return sum / 5; }这里有个细节:9 个数排序用冒泡是 36 次比较,在 11.0592MHz 的 51 上大概几百微秒,不算负担。如果你要更快,可以改成插入排序只维护中间 5 个,但我觉得没必要为了省这点时间牺牲可读性。
换算部分直接用校准系数:
/* 根据校准系数换算阻值,返回单位为 0.01Ω 的整数,避免浮点 */ unsigned long calc_resistance(unsigned int code, unsigned char range) { long delta; delta = (long)code - (long)cal_zero[range]; /* cal_k[range] 单位是 0.01Ω/LSB,预先算好存 E2PROM */ return (unsigned long)((delta * cal_k[range]) / 100); }51 上尽量别用浮点,一个 float 运算要几百个周期,而且链接进来会撑爆 4K 的代码空间。系数全部预乘成整数,最后统一除,误差控制在 1 个 LSB 以内。
5.2 自动换档的判据与防抖
自动换档的逻辑核心是判断当前码值落在量程的哪个区间。我的判据是:码值低于满量程的 8% 就升档(换到更小的 Rs,跑更大的电流),高于满量程的 90% 就降档,中间区域保持不动。8% 和 90% 这两个值不是拍脑袋定的,8% 对应 12 位 ADC 的 330 个码,此时相对量化误差 0.3%,再往下就明显影响精度了;90% 留出 10% 的余量防溢出。
防抖一定得加,否则在档位边界附近读数会在两个档之间来回跳。我的做法是连续 3 次采样都满足换档条件才真正切换,切换后延时 50ms 重新采样,并且把前两次采样结果丢弃。另外换档期间把显示冻住,避免用户看到一闪而过的错误数字。
还有一个实际问题:被测电阻如果是热敏电阻或者应变片这类对电流敏感的东西,大电流档位会把它加热,阻值就变了。所以自动换档的时候要优先从大电阻档往小电阻档试,也就是先用小电流试测,只有确认阻值确实小才升到大电流档,尽量减少大电流的施加时间。这个顺序和直觉相反,但用起来更安全。
5.3 四线制测量与零点补偿
两线制测量有一个绕不过去的误差:表笔线电阻和接触电阻。标准的表笔线每根大约 0.2~0.5Ω,两根加起来接近 1Ω,测 10Ω 电阻就是 10% 的误差。所以对于 100Ω 以下的测量,要么做零点补偿,要么改四线制。
零点补偿的做法简单:测之前把两根表笔短接,按下校准键,程序记下此时的码值作为该档的零点,后续测量都减掉这个值。这个做法对固定的线电阻有效,但接触电阻每次都不一样,效果有限。四线制(开尔文接法)是正解:用两根线走电流,另外两根线取电压,电压线上几乎不流电流,所以线电阻和接触电阻上的压降不会被采到。代价是要多两根表笔线,接线也麻烦一些。
我实际的做法是保留两线制作为默认,另外在 PCB 上留了四线的焊盘,需要高精度时手动切换。这个折中方案用起来还行,日常测个电阻不需要那么讲究,真要测 1Ω 级别的再上四线。
6. 常见故障排查速查与避坑心得
这套电路我已经反复搭过几版,遇到的问题基本能归成几类。把这部分单独拎出来写,是因为很多问题在教科书上看不到,只有真正焊过、调过才知道。
6.1 典型现象对照表
按下表对照,能覆盖八成以上的故障:
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 读数恒为 0 | 恒流源没工作 | 量运放同相端是否 2.5V,量运放输出是否正常 |
| 读数恒为满量程 | 采样端开路或反馈断 | 量 Rs 两端压降,检查 MOS 源极连线 |
| 短接表笔读数不为 0 | 运放失调或零点未校准 | 做零点校准,检查 Vos 指标 |
| 读数随档位不一致 | Rs 精度差或切换串阻 | 逐档用标准电阻核对,量开关接触电阻 |
| 读数末位乱跳 | 基准去耦不足或地线干扰 | 加 0.1µF+10µF 去耦,模拟地单点汇接 |
| 大电阻读数偏低 | 运放偏置电流或 PCB 漏电 | 换 CMOS 输入运放,清洗板面助焊剂 |
| 切换档位后首帧异常 | 建立时间不足 | 切换后延时 50ms 再采样 |
| 长时间使用读数漂移 | 采样电阻自热 | 增大电阻功率余量或并联分流 |
表里我最想强调两条。第一条是"短接表笔读数不为零",这几乎是必然出现的,任何运放都有失调,短接时读到 0.3Ω 或者 -0.5Ω 都正常,关键是程序里要有零点补偿。第二条是"大电阻读数偏低",PCB 上的助焊剂残留、手指的油污、空气湿度都会在 100kΩ 以上形成漏电通路,读数会莫名其妙偏低几个百分点。我用无水乙醇把板子彻底洗了一遍再烘干,100kΩ 档的读数立刻回到了正常范围。
6.2 精度上不去的几个隐形原因
有几个原因特别隐蔽,我在不同阶段都栽过,写出来给后来者省点时间。
第一个是地线的走法。恒流源的采样电阻下端是整条回路的参考点,这个点必须和 ADC 的接地参考是同一个物理点。如果采样电阻的地通过一段走线才连到 ADC 的地,这段走线上 25mA 的电流产生的压降会被算进测量结果。25mA 跑过 10mΩ 的走线电阻就是 0.25mV,对应 100Ω 档的 0.01Ω,看着小,但在追求四位显示时就是末位的跳动。做法是从采样电阻的接地点单独拉一根线到 ADC 的 AGND,单点汇接,不和其他数字地混。
第二个是运放的共模输入范围。通用双运放的同相端输入上限是Vcc - 1.5V左右,12V 供电时能到 10.5V,看着够。但反相端接的是 MOS 源极,某些档位下源极电压会接近 0V,而通用运放的下限是 0V 附近,理论上没问题,实际上由于内部结构的限制,输出会有一个几十毫伏的死区,导致小电流时环路增益不足,电流偏低。换成轨到轨输入输出的运放就没这个毛病了。
第三个是继电器切换的瞬间。继电器吸合时线圈会产生反电动势,同时触点弹跳会在采样回路上产生尖峰。我原来的做法是切换后立刻采样,结果偶尔会读到明显偏大的值。后来改成切换后延时 50ms,并且在软件里丢弃前两次采样,问题就没了。这 50ms 的等待时间在自动换档时会累积,但换来的是读数不跳,值。
6.3 后续可以怎么玩
这套东西搭起来之后,实际上就有了一个"能把电阻变成数字"的通用前端,后面能接的东西不少。接一颗 NTC 热敏电阻,配上阻值到温度的换算表,就是一个温度计,精度能做到 0.1℃ 级别,因为阻值测量的分辨率上去了。接应变片做的小称重传感器,配合 24 位 ADC,能做电子秤。接一段长导线,通过测量回路电阻能粗估导线长度和接触质量。
我个人后续准备加的是自动识别被测元件类型:测之前先用小电流试一下,如果压降不随电流线性变化,那多半是二极管或者半导体结;如果读数随时间缓慢变化,可能是电容在充电。加上这个判断逻辑,测量仪就能自己决定用哪个档、要不要等稳定,用起来更省心。这部分思路不难,主要是多采几组数据做判断,有兴趣的可以在这个基础上继续往下做。