1. 项目定位:为什么要自己造一台RLC测试仪
1.1 从实际需求说起
你可能也有这种经历:从元件盒里翻出一把电阻电容,型号都磨没了,凭颜色环和丝印猜了个大概,焊上去才发现不对;或者收了一块二手板卡,怀疑某个电感开路了,万用表却只能告诉你“通还是不通”。这个时候,一台能直接读出电阻、电容、电感数值的RLC测试仪,就是干活效率的关键。但一看某宝,正规点的LCR手持表动辄三五百起步,功能更强的台式电桥更是四位数起跳,业余玩家实在有点下不去手。
我自己的选择就是“从零造轮子”:用一颗老掉牙的STC89C51单片机加几个常见运放、三极管,做一台能测电阻、电容、电感的RLC测试仪。整机零件成本控制在40块以内,测量精度对付日常维修、元件筛选绰绰有余,顺手还完成了PCB布线练习。这篇文章我就把完整的设计思路、电路计算、PCB布局经验和固件写法全部摊开讲,尤其适合刚学完51单片机、想做一个真正能拿来用的“毕业设计级”项目的朋友。
1.2 为什么还要用STC89C51:老芯片的优势恰恰是门槛低
很多人会问:现在STM32遍地都是,Arduino更是十几行代码就能驱动LCD,为什么非要用STC89C51?就我自己的体验来说,答案不是“情怀”,而是三个非常实际的理由。
第一,STC89C51是大多数人学习单片机的起点,寄存器配置、中断系统、定时器结构都相对简单。用熟悉的芯片做项目,可以把精力集中在“测量电路如何搭”而不是“芯片怎么用”上,一次只解决一个麻烦。第二,这颗芯片在完全不需要ADC的情况下就能完成RLC测量,只要用定时器配合外部计数功能,把物理量变成频率,剩下的就是数学换算。第三,STC89C51的下载电路极其朴素,一颗USB转TTL模块加上冷启动就能烧程序,不需要调试器,这对预算紧张的学生党非常友好。
当然也要承认它的局限:没有内置ADC、主频只有12MHz、IO驱动能力弱。但也正是这些“局限”,逼着你把一个测量项目拆分出更本质的电路手段,反而能学到比“调库”更多的东西。
1.3 技术路线核心:把电阻电容电感全部换算成频率
自制的低成本RLC测试仪,最核心的思路不是“测电压算阻抗”,而是把待测元件的参数转换成频率信号,再用单片机数频率。为什么这么做?因为STC89C51最擅长的就是计时和计数,而且频率测量不受单片机供电电压波动、ADC参考电压精度的影响,只要振荡电路稳定、基准元件准确,结果就很可靠。
具体到三种元件,测量方法各有侧重:
- 电阻:和已知精密电容组成RC振荡器,振荡频率随电阻变化;
- 电容:和已知精密电阻组成RC振荡器,振荡频率随电容变化;
- 电感:和已知精密电容组成LC振荡器,振荡频率随电感变化。
整个过程没有用到一颗ADC芯片,核心元件就是一个NE555定时器加一个LC振荡器,成本低到离谱,但原理上非常自洽。这个方法不是什么野路子,很多老式数字电桥和简易LCR表内部也是类似的“变换电路”思想,只是实现方式更讲究。
1.4 成本清单与效果预期
先列一下这台机器的核心成本,都是我在深水宝和本地电子市场实际问到的价格,不同渠道会有几块钱浮动,但整体控制在40元以内是没什么压力的。
| 项目 | 型号/规格 | 参考价格 |
|---|---|---|
| 主控 | STC89C52RC(兼容51) | 5元 |
| 振荡芯片 | NE555P | 1元 |
| 比较器 | LM393 | 1元 |
| 显示 | LCD1602液晶 | 8元 |
| 继电器 | HRS2H-S-DC5V双刀双掷 | 3元 |
| 精密基准电阻 | 1%金属膜电阻若干 | 3元 |
| 精密基准电容 | CBB电容(10nF/100nF) | 3元 |
| 其他 | 三极管、按键、座子、排针等 | 5元 |
| PCB打样 | 5片装 10cm×8cm | 10元 |
总的投入大概40元左右,做出来的实际效果,我会在后面给出实测对照表。这里先给个结论:电阻测量在几欧到几兆欧范围内能稳到3%以内,电容在几十皮法到几十微法范围内也能做到5%以内,电感误差稍大,典型场景下10%以内没问题。这个水平确实比不了几百块的专用LCR表,但用来判断“这个元件是不是坏了”“大概的容量还在不在”,完全没有问题。
2. 硬件电路方案设计与关键参数计算
2.1 系统总体架构:从测试端口到LCD显示要经过哪几级
整个系统的信号链路可以分成四个模块。首先是“待测元件接入模块”,测试端子用香蕉插座或夹子引出,通过双刀双掷继电器切换测量模式;接着是“频率变换模块”,分成NE555构成的RC振荡器和三极管构成的LC振荡器两路,分别把阻容感变成方波信号;然后是“整形与保护模块”,LC振荡器的输出波形比较“软”,需要经过LM393比较器整形,同时加上钳位二极管保护单片机引脚;最后是“主控与显示模块”,STC89C51用定时器测频,计算后在LCD1602上显示结果。
这里有一个容易被新手忽略的点:NE555本身输出的是比较标准的方法,可以直接进单片机,但LC振荡器输出的是近似正弦波,直接接到51单片机的引脚上可能会造成多次触发、计数不准,所以必须用比较器或施密特触发器整形。我做的是用LM393,上拉电阻选4.7kΩ,信号边沿依然很陡。如果需要更强的抗干扰能力,换成74HC14施密特反相器会更稳。
单片机IO资源分配也要提前规划好。LCD1602我用的4位模式,需要RS、RW、E、D4到D7共7个引脚;三个按键用P1口;继电器控制用P2口;频率信号从P3.4(T0外部计数输入)进;测周期模式则用P3.2(INT0)外部中断。整体算下来IO完全不紧张,后续加蜂鸣器、LED背光控制都有余量。
2.2 STC89C51最小系统设计要点
STC89C51最小系统看起来简单,但细节决定成败。晶振我用12MHz的,因为机器周期正好是1微秒,定时器计算非常直观。晶振两端的负载电容选20pF到33pF都可以,我用22pF,要注意这两个电容要尽量靠近晶振引脚,否则容易产生波形畸变导致定时不准。复位电路采用经典的上电自动复位:10μF电解电容从VCC接到RST引脚,再并联一个10kΩ电阻到GND。EA引脚必须接VCC,否则单片机默认从外部ROM执行程序,永远跑不起来。这是新手特别容易踩的一个坑,我见过不少人焊好板子没反应,最后发现是EA脚悬空了。
关于下载电路,STC单片机的典型用法是:USB转TTL模块的TXD接单片机P3.0,RXD接单片机P3.1,下载时先给ISP软件点“下载/编程”,然后给板子冷启动(断电再上电)。但如果直接把USB转TTL模块挂在串口上,下载完会影响后续单片机的运行吗?我的做法是:下载完之后把排线拔掉,或者加一个单刀开关断开TXD/RXD,最省心。另外,USB转TTL模块的TXD和RXD要交叉连接,这个我一开始就接反过一次,排查了半小时。
最小系统的电源部分同样不能偷懒。整板用12V适配器供电,经过LM7805稳压到5V。7805输入端和输出端都要加电解电容——输入用100μF/25V,输出用10μF/16V,另外再并联0.1μF瓷片电容滤高频。7805虽然便宜且好买,但输入输出压差大时发热明显,建议加一个小的散热片。如果你手头只有9V电源,也能工作,但压差小一些,7805会更凉快。
2.3 测量前级:NE555为核心的RC振荡电路设计与公式推导
NE555接成无稳态多谐振荡器,是RC测量的经典结构。电路接法是:VCC经过电阻RA接到DISCH引脚,同时DISCH引脚再经过电阻RB接到THRES和TRIG,THRES和TRIG连接后接到电容C,电容另一端接地。输出OUT引脚输出方波。振荡周期公式是:
T = 0.693 × (RA + 2RB) × C
对应频率:
f = 1.44 / ((RA + 2RB) × C)
这个公式里的系数1.44来自充放电时间常数的数学推导,我用实际示波器验证过,NE555在5V供电下和理论值偏差小于2%,完全可以直接用来反推元件参数。
测量电阻时,把RA固定为一个已知的精密参考电阻R_std(比如1kΩ),RB换成待测电阻Rx,C用精密CBB电容C_std(比如10nF)。则:
f = 1.44 / ((R_std + 2Rx) × C_std)
反解出:
Rx = (1.44 / (f × C_std) - R_std) / 2
注意这个公式里为什么RA也要参与计算,而不是直接用1.44/(2RxC)。因为NE555的充电回路经过了RA和RB两个电阻,RB只负责放电,所以RA哪怕只有1kΩ,也会在测量小电阻时引入明显误差。想要减小影响,RA可以取100Ω这一档,但RA太小会拉高震荡频率、增大NE555输出管的压降影响。实际折中下来,我选了1kΩ作为固定参考电阻,测的电阻范围大约从10Ω到2MΩ。
测量电容时,RA和RB都用已知精密电阻,比如RA=10kΩ,RB=10kΩ,C用待测电容Cx,则:
f = 1.44 / ((10k + 20k) × Cx) = 1.44 / (30k × Cx)
反解Cx:
Cx = 1.44 / (30000 × f)
这个方案测电容非常直观,频率越高电容越小。为了兼顾不同容量的电容,我准备了两组标准电阻:测量小电容(低于1μF)用RA=RB=10kΩ;测量大电容(1μF到1000μF)用RA=RB=1kΩ,通过继电器切换。为什么大电容要降低电阻?因为同样容量下电阻越小,振荡频率越高,避开超低频导致的测量时间过长和电解电容漏电影响。
2.4 电感测量:LC振荡器的实现与频率公式
电感不能直接和RC振荡器挂在一起,因为电感的感抗随频率变化,不像电阻那样简单。我采用的方案是经典的三极管共基极LC振荡器,结构简单,起振容易。电路大致是:NPN高频三极管(我用的S9018,便宜且特征频率足够),发射极通过电阻偏置,集电极接LC并联谐振回路,反馈信号从发射极通过电容耦合回到基极。振荡频率由LC并联回路决定:
f = 1 / (2π√(Lx × C_std))
其中C_std是谐振电容。已知C_std和实测频率f,反推电感:
Lx = 1 / (4π² × f² × C_std)
测量电感的关键是谐振电容的选择。我设置了两个档位:测小电感(1μH到1mH)用10nF的CBB电容,测大电感(1mH到1H)用100nF的CBB电容。为什么这么分?因为频率太高时,三极管的结电容、PCB走线的分布电容会叠加到谐振回路上,误差变大;频率太低时,线圈电阻和磁芯损耗会拉低Q值,起振都可能出问题。用10nF测1μH的电感,谐振频率大约在1.6MHz,已经接近STC89C51外部计数输入上限(12M晶振下约为500kHz),所以这个频率还要经过分频或者改用测周期方案。我实际测下来,建议把谐振频率控制在200kHz以下比较安全,如果测更小的电感,可以在后面加一级74HC4040分频,标题上说的“可控范围”基本就是这样权衡出来的。
LC振荡器还有一个天然问题:三极管的结电容会影响频率,导致测量结果存在一个固定的系统偏差。解决办法是校准:用一段短路线代替待测电感,测出此时的残余频率,反算出“残余电感”,然后从所有测量结果中扣除。这个过程在固件里实现,后面我会专门讲。
2.5 模式切换与量程切换:继电器还是模拟开关
刚开始设计时,我想用CD4066模拟开关来切换测量模式,毕竟体积小、无机械触点。但仔细算了一下:CD4066的导通电阻大约5Ω到20Ω,温度变化还会漂移,这个阻值叠加在待测元件上,测低值电阻和电感时误差明显。而且模拟开关的通道间串扰在LC振荡器高频信号下也不容忽视。所以最终用双刀双掷继电器,专门用来切换“RC振荡器”和“LC振荡器”两路信号通路。
继电器选的是5V线圈的HRS2H-S-DC5V,封装小、驱动电流约40mA,单片机IO口直接驱动不够,需要加S8050三极管放大,最经典的NPN低边驱动:单片机引脚经1kΩ电阻接三极管基极,集电极接继电器线圈一端,线圈另一端接VCC,发射极接GND。特别提醒,继电器线圈两端必须反向并联一颗1N4148续流二极管,否则断电瞬间的反向电动势能冲到几十伏,轻则干扰单片机复位,重则击穿三极管。这个细节我已经在不止一块板上吃过亏了。
量程切换暂时用“手动按键”方式,没有做成全自动,原因有两点:一是自动量程需要多组基准电阻电容并联进振荡电路,布线复杂度和继电器数量都要翻倍;二是手动按键本来也可以当作“学习单片机人机交互”的一部分。但为了使用方便,我在显示部分做了自适应单位换算,不管测到的是几欧还是几兆欧,都能自动显示成kΩ或MΩ,这一点体验已经比较接近真正的LCR表了。
3. PCB布线设计与实践心得
3.1 布局分区:数字地与模拟地应该怎么处理
PCB布局是这次项目里我花时间最多的地方。很多人做单片机小项目,习惯性先把板子画得满满当当,最后走线一团乱麻。做带振荡电路的板子,即使频率不高,也要养成“分区布板”的习惯。我把整块板划分成三个区域:左上角是电源和继电器驱动,中间是STC89C51和LCD1602插针,右下角是振荡电路和测试端子。
数字地和模拟地一定要分开铺铜,然后在电源入口处“单点汇合”。为什么?因为LCD1602和继电器的开关电流会产生地弹噪声,如果模拟振荡电路的地和数字地共用一条粗线,那么继电器动作瞬间的电流波动会直接窜到NE555的阈值引脚上,表现为测量值跳变。我实测过,没有分地之前,继电器每次切换都会导致频率跳动几十赫兹;分开之后,这个问题几乎消失。
地线处理上我用了双面敷铜:底层整片铺数字地,顶层在振荡电路区域单独铺一块模拟地铜皮,两者通过一个0Ω电阻在7805输出电容附近连起来。0Ω电阻在这里的作用不是省成本,而是为了在调试时可以用刀子割断它,方便单独测量各路电流,非常实用。如果你没有0Ω电阻,用一颗磁珠也可以,但不要把数字地和模拟地直接大面积相连。
3.2 关键走线与元件位置:基准电容、晶振、下载口怎么摆
基准电容的位置可能直接影响整机精度。CBB电容本身误差可以做到1%,但如果走线太长,电容引脚处的寄生电容可能有几皮法,对于10nF级别的基准电容来说影响尚可,但如果你用1nF的低档位,几皮法的分布电容就是不可忽略的误差源。所以我的布局原则是:基准电容和NE555的THRES、TRIG、DISCH引脚距离尽量短,走线尽量粗短,不在这些网络的走线上打过孔,避免寄生参数叠加。
晶振放在STC89C51的XTAL1和XTAL2旁边,负载电容直接贴着晶振外壳放,晶振下方不要走其他信号线。下载口我放在板子边缘外侧,方便接USB转TTL模块,但不和LCD1602的信号线平行长距离并走,因为下载瞬间的数据信号虽然只在下载时出现,但如果布线太差,可能引起单片机复位不稳。
NE555的5脚(控制电压脚)必须接一颗0.01μF瓷片电容到地,这个电容的作用是滤除内部比较器参考电压上的噪波。如果不接或离得太远,输出方波的频率会变得不稳定,尤其是继电器切换瞬间,频率会“抖”一下。同样重要但容易被忽略的,是NE555的4脚复位脚,必须直接接VCC,并且最好也加一个小电容去耦。我见过有人嫌麻烦把4脚悬空,结果板子经常莫名不振,就是这个原因。
为了方便调试,我还在板子上预留了四个测试点:5V电源、GND、NE555输出、LC振荡输出。用排针引出来就行,成本几毛钱,但调试的时候示波器探头和万用表表笔可以直接夹住,不用费劲找焊点。
3.3 继电器驱动与电源退耦:小细节里的大坑
继电器驱动这部分,电气原理图画出来很简单,但布板时要注意两点:驱动三极管的基极电阻要靠近单片机引脚,避免长走线引入干扰,导致单片机复位时继电器误动作;继电器本体不要放在晶振或NE555旁边,因为继电器线圈吸合瞬间会产生磁场,从空间上干扰附近的模拟电路。我的布局是把继电器放在板子正中偏右的位置,上面是LCD,下面是电源,离振荡区域至少2厘米以上。
电源退耦不能只靠7805输出端的大电容。每个芯片的电源引脚旁边都要放一颗0.1μF的瓷片电容,而且必须离电源引脚尽量近,走线先过电容再到引脚。NE555在工作时内部输出级翻转会产生较大的电流尖峰,如果退耦不到位,这个尖峰会在电源线上形成噪声,进而调制振荡频率。实测中,我给NE555加了退耦电容之后,100kHz左右的频率读数波动从原来几十赫兹降到个位数赫兹。
3.4 实际打样与焊接注意事项
PCB我用的是嘉立创5块钱5片的打样服务,双面1.6mm厚,常规FR4,完全够用。下单时注意选择喷锡工艺而不是沉金,价格更便宜而且焊接更容易。拿到板子后先不要急着把元件全焊上去,我先焊电源部分:7805、电容、电源插座,然后上电测5V是否正常、纹波大不大。确认电源没问题后再焊单片机最小系统,烧一个流水灯程序验证晶振和复位。最后焊振荡电路和继电器驱动,分模块调试可以大大缩小问题排查范围。
焊接顺序还有一个讲究:先焊矮的小元件(电阻、电容、三极管),再焊高一点的芯片插座和继电器,最后焊LCD排针和测试端子。NE555我建议直接焊在板上而不是用插座,因为插座会增加引脚间的寄生电容,而且NE555底座比较容易虚焊。STC89C51则反过来建议用插座,方便烧录失败或芯片损坏时更换,毕竟单片机是整板最贵的元件之一。
整体布局图我画的时候参考了立创EDA的元件库,大家想直接照抄布局的话,也可以去立创开源广场搜“STC89C51 RLC测试仪”,很多现成的工程文件可以下载参考。你只需要对照我上面说的“分区布板、短走线、单点接地”三个核心原则检查一遍,基本就能避免大多数问题。
4. 固件开发:频率测量与RLC计算实现
4.1 频率测量原理:闸门计数法为什么要比边沿中断法靠谱
STC89C51测量频率的方法很多,常用的有两种:一种是外部中断测量信号相邻上升沿之间的时间,反推出频率;另一种是固定闸门时间,用计数器累计信号脉冲数。我最后选择的是第二种“闸门计数法”。
原因在于中断法的致命缺陷:任何CPU响应中断都需要时间,89C51在12MHz晶振下中断响应延迟大概需要几个机器周期,也就是几微秒。如果被测信号是1kHz,周期1ms,几个微秒的误差可以忽略;但如果信号是100kHz,周期10μs,中断延迟造成的误差可能达到百分之几十,完全不可用。而计数法用的是16位计数器T0,它工作在计数器模式时,每个下降沿自动加1,不需要CPU介入,只要信号频率不超过单片机计数上限,就不会丢脉冲。
闸门时间的选择也有讲究。我默认用的闸门是200ms,也就是0.2秒,计得脉冲数乘以5就是频率。200ms的好处是刷新速度够快,显示不会感觉到卡顿,同时对于1kHz以上的信号,计数误差±1个脉冲对应的相对误差只有0.5%以内。如果测到低频信号(低于1kHz),我会自动把闸门时间延长到1秒来保证计数总量,牺牲一点刷新率换精度。这个“动态闸门”逻辑在代码里实现起来并不复杂。
4.2 核心代码:T0计数、T1定时的实现
先交代一下资源分配:T0作为外部脉冲计数器,工作在模式1(16位计数);T1作为定时器,工作在模式1,定时50ms,通过软件变量累积到200ms或1s作为闸门。核心代码如下:
#include <REG52.H> unsigned int t1_count = 0; // 50ms中断累加 unsigned long gate_ticks = 200; // 默认200ms闸门,单位10ms unsigned long pulse_total = 0; // 闸门内的总脉冲数 unsigned int measure_ready = 0; // 测量完成标志 void Timer1_Init(void) { TMOD = 0x51; // T1定时器方式1,T0计数器方式1 TH1 = 0x3C; // 50ms初值,机器周期1us TL1 = 0xB0; // 65536-50000=15536=0x3CB0 ET1 = 1; EA = 1; TR1 = 1; } void Timer1_ISR(void) interrupt 3 { TH1 = 0x3C; TL1 = 0xB0; t1_count++; if(t1_count >= gate_ticks) // 闸门时间到 { TR0 = 0; // 停止T0计数 pulse_total = (TH0 << 8) | TL0; TH0 = 0; TL0 = 0; TR0 = 1; // 立即开始下一轮计数 t1_count = 0; measure_ready = 1; } } unsigned long Get_Frequency(void) { unsigned long freq; // gate_ticks单位为10ms,所以频率 = 脉冲数 * 1000 / gate_ticks freq = pulse_total * 1000UL / gate_ticks; return freq; // 输出单位Hz }这里有一个细节:直接把TH0和TL0拼起来的时候,因为TR0在闸门到的那一瞬间已经被停止了,所以读取到的计数不会发生“读取过程中又加一”的问题。如果你用的是更长闸门且允许T0溢出,还要在T0中断里累计溢出次数,最终计数值等于“溢出次数×65536+当前值”。我目前200ms闸门在最高500kHz输入下,最多计10万个脉冲,16位计数器还扛得住,所以没有开T0溢出中断。以后如果加高频档位分频,就得用上这个扩展方案了。
4.3 被测值计算:公式的工程化修正与单位换算
频率测出来之后,就轮到数学换算。这里我把三种模式的计算公式统一封装成一个函数,用浮点运算。STC89C51没有硬件浮点单元,但一秒才更新几次测量结果,浮点运算那点时间完全无所谓,用float反而让公式写起来清晰不易错。
#define PI 3.14159265f // 基准元件参数,根据实际焊接选用的元件修改 #define R_REF_1K 1000.0f // 1kΩ 参考电阻 #define C_STD_10N 10.0e-9f // 10nF CBB电容 #define C_STD_100N 100.0e-9f // 100nF CBB电容 #define R_STD_10K 10000.0f // 10kΩ 参考电阻 float Calc_R(float f) { // f = 1.44 / ((R_ref + 2*Rx) * C_std) // Rx = (1.44 / (f * C_std) - R_ref) / 2 return (1.44f / (f * C_STD_10N) - R_REF_1K) * 0.5f; } float Calc_C(float f) { // f = 1.44 / ((R_A + 2*R_B) * Cx) // Cx = 1.44 / ((R_A + 2*R_B) * f) return 1.44f / ((R_STD_10K + 2.0f * R_STD_10K) * f); } float Calc_L(float f) { // f = 1 / (2*pi*sqrt(Lx*C_std)) // Lx = 1 / (4*pi^2 * f^2 * C_std) return 1.0f / (4.0f * PI * PI * f * f * C_STD_100N); }算出来的电阻单位是欧姆,电容单位是法拉,电感单位是亨利。直接显示的话,用户看到“0.0000015”这种数字肯定头大,所以显示部分要做自适应单位换算:电阻从小到大依次是Ω、kΩ、MΩ,电容是pF、nF、μF,电感是μH、mH、H。判断逻辑也不复杂,用一串简单的if/else判断科学计数法的数量级即可。这个展示习惯非常重要,因为换了单位之后,读数看起来就像一个真正仪器的样子了。
需要特别提醒的是:上面的公式假设NE555供电稳定、基准电容无损耗,这在毫秒级的充放电周期内大体成立,但当待测电容是电解电容时,情况会有所不同。电解电容的ESR(等效串联电阻)较高,会改变充放电时间常数,导致测量值偏大或者偏小。我的处理是在测量大容量电解电容时,用1kHz以上的振荡频率去测,减少ESR在充放电过程中的影响。这是经验性的修正,严格来说不如真正的交流电桥准确,但对付筛选电容足够了。
4.4 量程自适应与显示逻辑
量程自适应分两层:第一层是硬件层,通过继电器切换基准电阻和基准电容;第二层是软件层,根据测到的频率判断当前测量是否落在合理区间。
比如测量电容,如果选用RA=RB=10kΩ这一档,测到1μF电容时频率大约是48Hz,测到1000μF时频率只有0.048Hz,这个刷新速度完全无法接受,而且电解电容漏电也会让低频振荡不稳定。所以固件里的逻辑是:先用大电阻档测一次,如果计算出的电容值大于1μF,则自动切换到小电阻档(1kΩ),重新测一次。如果计算值小于100pF,则提示“测量值超出本档精度范围”,建议改用10nF档位。这个分层逻辑写完以后,实际体验会好很多,你只需要把电容插上,按下测量键,几秒钟后读数就是最终结果。
LCD1602的显示内容我设计成两行:第一行显示模式和单位,比如“R: 4.712 kΩ”;第二行显示频率和校准状态,比如“f=105.3kHz”或者“CAL:ON”。这样调试的时候一眼就能看到原始频率,方便判断是前端电路的问题还是软件换算的问题。
4.5 校准功能:短接清零、开路校准、已知标准件校准
校准是自制仪表最容易被忽略却又最重要的一步。我在这台机器里加了三个校准模式,长按“校准键”进入,短按“模式键”切换校准项。
第一项是“开路校准”,即测试夹子什么都不接,此时测到的信号源是电路自身的分布电容和噪声,记录下来作为底噪,在测量小电容的时候自动扣除。第二项是“短接校准”,把测试夹子两头短接,此时测到的电阻/电感残值记录下来,在测量小电阻和小电感时扣除。第三项是“标准件校准”,接入一个高精度已知阻值的电阻或电容,整机反推出当前基准元件的实际值,把基准值误差修正掉。CBB电容买回来标称1%,通过标准件校准后,实际等效基准精度可以提升到0.5%左右。
具体在固件里,校准值保存在STC单片机内部EEPROM中,掉电不丢失。STC89C51内部有1K的EEPROM,用IAP口读写,代码不超过30行。读取的时候加一个简单的校验和,防止写入时断电导致数据损坏。这一步虽然对“能跑”来说不是必须,但对“好用”来说非常关键,用了一个月之后,你会感谢当时存下来的校准值。
5. 调试、标定与常见问题
5.1 通电前检查清单:用三分钟省三小时
每次焊接完或改动电路后,我都习惯先做一轮静态检查再上电,否则一出问题就要怀疑全板,排查效率极低。我总结了一个三分钟检查清单,分享给你:
- 用万用表蜂鸣档检查VCC和GND是否短路,这是最优先的一步,电源短路会烧7805甚至单片机;
- 检查继电器线圈是否并联了续流二极管,二极管方向不能反,否则上电就短路;
- 检查LM393的输出上拉电阻是否装好,这颗电阻漏焊会导致输出信号浮空,单片机读到一堆乱码;
- 检查LCD1602的VO对比度引脚是否经过电位器接到地,不接地或者悬空,1602上电就是要么全黑要么全白;
- 最后再确认一次NE555的4脚(复位)接了VCC,5脚(控制)接了0.01μF电容到地。
这些东西单独看都是小事,但任何一个出问题,都会让后续调试陷入“看起来哪里都不对”的泥潭。我自己就吃过一次亏,NE555的4脚忘记接VCC,上电后整个测量没反应,示波器一测输出脚完全无波形,还以为是芯片本身坏了,换了好几颗才发现是复位脚悬空导致的。
5.2 测量结果偏大、偏小、不稳定的可能性分析
如果所有硬件检查都正常,但测量结果仍然不对,可以从现象反推原因。
读数整体偏大,而且测什么元件都偏大,先怀疑基准电容实际值比标称值小。CBB电容虽然精度好,但有些商家标称10nF实际只有9nF,这个误差会线性反映到结果里。解决办法就是用精密电容表或标准电阻反推,把实际电容值写成常量烧进程序。
读数偏小且无规律,尤其测小电容时明显,通常是被测夹子引线分布电容干扰。如果测试线太长,两根夹子之间就有几皮法的电容,和小电容并联后相当于把待测电容“加大”了,计算出来自然偏小。这个通过开路校准能消除一大半,但最好的办法是尽量缩短测试线长度,我最终用的是10cm的短硅胶线加鳄鱼夹。
读数上下跳动,主要看供电和继电器。先拿示波器看5V电源纹波,如果纹波超过50mV,检查7805的输入电压是否过低或者负载过重。再看继电器切换时读数是否突然跳变,如果跳变,多半是继电器动作时的电流冲击通过地线干扰了振荡电路,这时需要加强退耦,或者调整程序的测量时序,让继电器切换后延时100ms再开始测频,等系统稳定下来再读数。
5.3 不同量程下的误差来源与实测对照表
我把自己这台机器实测的数据整理成了一个表格,被测元件是用专业LCR表标定过的,自制机测出来的结果如下:
| 测量对象 | 标准值 | 自制机实测 | 相对误差 |
|---|---|---|---|
| 金属膜电阻A | 100Ω | 102Ω | +2.0% |
| 金属膜电阻B | 10kΩ | 10.08kΩ | +0.8% |
| 金属膜电阻C | 1MΩ | 0.987MΩ | -1.3% |
| CBB电容A | 10nF | 10.12nF | +1.2% |
| CBB电容B | 100nF | 98.4nF | -1.6% |
| 电解电容A | 10μF | 10.6μF | +6.0% |
| 色环电感A | 100μH | 112μH | +12% |
| 色环电感B | 1mH | 1.06mH | +6.0% |
从这个表能看出几个规律:中等阻值的电阻测量最准,因为充放电时间适中,计数误差占比小;电解电容误差偏大,因为ESR和容量公差本身叠加,无法完全用公式消除;电感误差相对最大,主要是三极管结电容和分布电容的贡献,需要通过校准扣除。整体来说,这台的定位就是“工具级”而不是“仪器级”,说人话就是:能信,但别拿它和四位半台式电桥较真。
如果你想让电阻档再准一点,可以考虑在NE555的电路上做开尔文四线连接,但四线会增加继电器的数量,对于入门项目来说性价比不高。我更推荐的做法是保持两线,但每次测量前都习惯性做一次短接清零,这和台式LCR表的使用习惯是相通的。
5.4 做完这台机器后的几点体会与后续扩展方向
如果你问我要不要真的去做这样一个“轮子”,我的回答是:做,而且值得做。不是因为40块钱成本比买成品省多少,而是因为在整个设计过程中,你会被迫去理解RC振荡器的频率公式怎么推导、继电器驱动为什么要加续流二极管、PCB为什么要把数字地和模拟地分开。这些东西,刷100遍教程都不如亲手焊一块板、踩一次坑记得牢。
之后如果你想继续升级,方向其实很明确:把NE555换成DDS信号源加上正交解调,就能测实部和虚部,做出真正意义上的数字电桥;给前端加模拟开关做全自动量程;显示部分升级成OLED或者带触摸的彩屏;再加上一个外壳,喷漆打标,就是一台很有模有样的桌面工具了。这个方向留给大家自己去折腾,折腾的过程本身就是这台仪器最值钱的部分。