☰
基于51单片机的恒流源宽量程电阻测量系统设计
2026/11/2 13:26:57 网站建设 项目流程

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 沟道 MOSVgs(th) ≤ 2V别用普通高压 MOS
基准可调精密基准源2.5V 输出同时供 ADC 参考
采样电阻金属膜 0.1% / 25ppm100Ω、1k、10k、100k四档
ADC12 位串行 ADCSPI 三线接口8 位分辨率不够用
档位切换5V 小型信号继电器 ×4接触电阻 <100mΩ见 2.3 的取舍分析
显示1602 字符型液晶并口 4 线驱动省 IO
存储I2C 型 E2PROM2Kbit存校准系数
电源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量程上限满量程时被测电阻功耗
1100Ω25mA100Ω62.5mW
21kΩ2.5mA1kΩ6.25mW
310kΩ250µA10kΩ0.6mW
4100kΩ25µA100kΩ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,能做电子秤。接一段长导线,通过测量回路电阻能粗估导线长度和接触质量。

我个人后续准备加的是自动识别被测元件类型:测之前先用小电流试一下,如果压降不随电流线性变化,那多半是二极管或者半导体结;如果读数随时间缓慢变化,可能是电容在充电。加上这个判断逻辑,测量仪就能自己决定用哪个档、要不要等稳定,用起来更省心。这部分思路不难,主要是多采几组数据做判断,有兴趣的可以在这个基础上继续往下做。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询