先交代一下我为什么折腾这个东西。做电子DIY这几年,桌面上攒了一堆电容电阻电感,大部分是拆机件,标称值只能当参考。想测容值感值,普通万用表只能测个大概,稍微准一点的LCR电桥成品动辄几百上千,对学生党来说确实肉疼。正好手头还有几片吃灰的STC89C51,就盘算着能不能用51加上几颗常见运放,自己做一台能测R、L、C三件套的测试仪,顺便把阻抗测量原理彻底搞明白。这篇文章就是我整个从零设计、画板、写码到调试的记录,包括关键参数计算、PCB布线时的取舍,以及几个踩过的坑,希望能给想动手做仪表的朋友少走点弯路。
整机方案用的是很经典的“串联分压+矢量计算”思路。信号源输出正弦波,经过一个已知精度的采样电阻和被测元件串联,然后同时测量元件上的电压、采样电阻上的电压,以及两者之间的相位差,单片机算出阻抗的模和幅角,再分离出实部电阻和虚部电抗,最后换算成R、L、C。这套办法对硬件要求不高,51完全跑得动,而且能顺带显示Q值、ESR这些参数,可玩性比单纯测容值高不少。
1. 设计思路与测量原理解析
1.1 常见的RLC测量方案对比
先说清楚为什么选这个方案。市面上LCR表常见的原理有三种:电桥法、谐振法、伏安法。
电桥法最经典,通过调节已知电阻/电容让电桥平衡,精度可以做得非常高,但需要高精度可调参考元件,自动平衡电桥还需要复杂反馈环路,DIY成本不低。
谐振法适合测高Q值器件,通过扫频寻找谐振点,对信号源频率稳定度和幅度稳定度要求苛刻,测量范围也比较窄。
伏安法就是给被测元件施加已知交流信号,测它两端电压和流过它的电流,通过二者关系算阻抗。这个方法电路结构直观,对单片机算力要求低,只需要准确测量两个电压幅度和一个相位差,最适合51这种性能不算强的平台。
我在伏安法里选了“串联分压”的变体:采样电阻Rr和被测阻抗Zx串联,电压源统一加在这条串联支路上。因为Rr已知,电流的大小可以通过Rr的电压反推,所以Zx的模值就是Rr乘以电压比。剩下的关键就是测相位差,有了模值和相位角,复数阻抗的实部、虚部就全部出来了。
整体精度能达到什么水平呢?我实测下来,电阻误差在1%左右,电容误差大约3%,电感误差约5%,跟廉价商品LCR表处于同一量级。这个精度对日常选料、判断元件好坏完全够了。
1.2 阻抗参数的数学分解
把被测元件看成复数阻抗 (Z_x = R + jX),其中R是等效串联电阻,X是电抗。电抗为正时呈感性,电抗为负时呈容性。
测量时,采样电阻Rr两端电压Ur和电流I同相,被测件两端电压Uz与I的夹角就是阻抗角φ。于是有:
[ |Z_x| = \frac{U_z}{U_r} \times R_r ]
[ \varphi = 2\pi f \cdot \Delta t ]
其中Δt是Uz与Ur两个正弦波之间的时间差,也就是相位差换算成的时间。
再通过三角函数分离:
[ R = |Z_x| \cos\varphi ] [ X = |Z_x| \sin\varphi ]
之后根据X的正负和测试频率f换算:
- 若 (X > 0):呈感性,(L = \dfrac{X}{2\pi f})
- 若 (X < 0):呈容性,(C = \dfrac{1}{2\pi f |X|})
举个例子,我用1kHz频率测一个标称100nF的电容,如果算出来 (|Z_x| = 1.61k\Omega),相位角 (-87.7^\circ),那么 (R = 1.61k \times \cos(-87.7^\circ) \approx 64.6\Omega),(X = 1.61k \times \sin(-87.7^\circ) \approx -1609\Omega),容值 (C \approx 98.9nF)。这就是整套软件计算的底层逻辑。
需要注意,这里默认使用串联等效模型。对电容来说ESR就是串联等效电阻R;对电感来说,绕线铜阻和高频损耗都归入R。实际测量小容量电容、大电阻时,串联模型和并联模型差异明显,软件里可以加一个串并联换算的选项,后面第五节我再细说。
2. 硬件电路设计与关键器件选型
2.1 系统模块划分
整机硬件可以分成六块:正弦信号源、串联测量回路、真有效值转换、相位检测、主控与显示、电源。模块划分和主要器件如下表:
| 模块 | 核心器件 | 说明 |
|---|---|---|
| 正弦信号源 | OP07 + CD4066 | 文氏桥振荡器,输出100Hz/1kHz/10kHz三档 |
| 串联测量回路 | 高精度电阻阵列 + 继电器 | 通过切换采样电阻改变量程 |
| 真有效值转换 | AD736 × 2 | 将Uz和Ur转换为直流电平 |
| ADC采样 | ADS1115 | 16位I2C接口ADC,分时采集两路直流 |
| 相位检测 | LM393 × 2 | 将正弦波整形为方波,送入单片机测沿差 |
| 主控显示 | STC89C51 + LCD1602 | 控制量程切换、计算、显示 |
这里有个容易被新手忽略的点:STC89C51本身没有内置ADC,所以必须外接。我选了ADS1115,16位分辨率,I2C接口,模块便宜而且精度够用。如果想省几块钱也可以换TLC1543,但那是10位SPI接口,读数跳动会明显一些,测量分辨率下降不少。
2.2 文氏桥正弦波发生器:三档频率用CD4066切出来
正弦信号源是整台仪器的“心脏”。一开始我想过用51产生PWM再滤波,但STC89C51的PWM频率不高,滤波后波形阶梯感明显,失真会影响有效值测量精度。最后还是用了文氏桥振荡器,电路简单、波形质量好,而且运放用普通的OP07就能工作。
文氏桥振荡器的正反馈网络由两个电阻和两个电容构成选频电路,振荡频率由公式决定:
[ f = \frac{1}{2\pi R C} ]
我选 (R = 16k\Omega)、(C = 10nF),算出来:
[ f = \frac{1}{2\pi \times 16k \times 10n} \approx 995Hz ]
接近1kHz,够用。
为了实现多档测试频率,我把电容做成了三组:100nF对应100Hz,10nF对应1kHz,1nF对应10kHz,用CD4066模拟开关切换公共端。这样电阻不用动,只换电容,频率切换就完成了。频率越高,对DUT的电容小电感越敏感;频率越低,测大电容越有利。
文氏桥起振后输出幅度容易漂,必须在负反馈环路里加稳幅。最省事的方法是在反馈电阻两端并联两个反接的1N4148,利用二极管导通电阻随幅度变化来压缩增益。这个方案会带来轻微削波失真,但对AD736的真有效值测量影响不大,实测下来比不加稳幅时稳定得多。一个关键心得是:文氏桥的两个R要选同批次温漂小的金属膜电阻,两个C也要配对,否则振荡波形贪官——不,会畸变——应该说波形会明显不对称,直接影响相位测量。
振荡器输出再经过一级OP07缓冲,带载能力就够了。如果需要校准输出幅度,可以在缓冲器反馈电阻里串一个10kΩ多圈电位器。
2.3 串联测量回路与量程切换
被测元件Zx和采样电阻Rr串联,Rr的取值决定了不同量程。我设计了四档:10Ω、1kΩ、100kΩ、10MΩ。
为什么要分这么多档?因为伏安法测量要求采样电阻和被测阻抗不能差太多。理想情况下两者同数量级,这样Uz和Ur的电压都不至于太小或太大。如果被测元件是1Ω的小电阻,你用10MΩ采样电阻,那Uz只有总电压的千万分之一,根本测不准;反过来,测10MΩ大电阻时用10Ω采样电阻,电流太小,Ur也测不到。
判断量程是否合适的软件逻辑很简单:读Uz和Ur,如果Uz/Ur > 8,说明DUT阻抗比当前采样电阻大很多,需要换更大一档;如果Uz/Ur < 0.125,说明DUT阻抗太小,需要换更小一档。程序会自动循环调整,直到比值落在合理区间。
档位切换我一开始想用CD4066模拟开关,后来发现低阻档位根本没法用。CD4066的导通电阻大约几十到几百欧,10Ω档的采样电阻都在这个量级,开关自身电阻就把精度毁了。最终10Ω和1kΩ档用小型5V继电器切换,100kΩ和10MΩ档用CD4066,实际效果很好。继电器线圈驱动用ULN2003,P1口输出高低电平控制,线圈两端记得并续流二极管,这个细节画PCB时必须注意。
采样电阻本身是精度的根基,必须用1%甚至0.1%精度的金属膜电阻。我实际用了0.1%的25ppm低温漂电阻,成本也就几块钱一颗,性价比很高。千万别用普通碳膜电阻,温度一漂读数就跟着飘。
2.4 真有效值转换与ADC采样
有了Uz和Ur的交流电压,还需要把它们变成单片机能够读取的直流电平。二极管整流加滤波是最省钱的方案,但二极管压降非线性严重,小信号下误差大,对波形失真也敏感。我直接用AD736真有效值转换芯片,输入交流,输出直流,直流电平就是有效值。
AD736外围电路非常少,输入侧用10μF电容隔直,输出侧接一个低通电容用于平滑。它带宽足够覆盖100Hz到10kHz,响应时间约10ms,实际使用中等几十毫秒再读数比较稳妥。我做了两路AD736,分别对应Uz和Ur,输出经过CD4052多路开关送给ADS1115。
ADS1115的PGA增益可以设置,我用的是±4.096V量程,16位分辨率下每个LSB约0.125mV,对AD736输出的直流电平来说绰绰有余。它挂在STC89C51的P1.0(SDA)和P1.1(SCL)上,用GPIO模拟I2C协议读取。模拟I2C在51上虽然慢一点,但一次ADC转换也就几十毫秒,整机刷新速度完全够用。
读数稳定性方面,我做了每通道连续采样16次去掉最大最小再平均,ADC噪声基本能被压下去。
2.5 相位差检测电路
相位差是整个方案里最容易翻车的地方。我的做法是把Uz和Ur各自送入一个LM393比较器,整形为同频方波,再把两路方波接入51的外部中断INT0和INT1,用定时器0测量两路上升沿的时间差。
LM393本身是开漏输出,要接上拉电阻。比较器输入端直接与正弦信号相连时,如果信号在零电平附近有噪声,输出会来回抖动,导致计时错误。解决办法是加一点正反馈形成迟滞窗口,我在比较器同相端和输出端之间接了一个1MΩ反馈电阻,配合输入端的10kΩ电阻,迟滞大约几十毫伏,实测基本不会再误触发。
比较器输出方波的上升沿才是单片机测量的关键。由于51的中断响应有延迟,测出来的时间差会差几个微秒。在1kHz下这对应不到2度的相位误差,可以接受;10kHz误差会放大到约10度,所以10kHz档更适合定性判断阻抗类型,而不是追求精确的L值。如果后续想提高精度,可以把过零比较后的方波经过RC低通变成占空比相关的直流电压,再用ADC读取,那个方案抗干扰更强,但需要额外校准,我没有在初版里做。
2.6 整机电源方案
整机使用单5V供电,音频级运放需要负电源,我加了ICL7660电荷泵产生-5V。电路总共需要:+5V数字、+5V模拟、-5V模拟三路。数字和模拟的+5V在入口处用电感或0Ω电阻分道,避免数字噪声从电源串进模拟电路。
电源滤波我在每个IC的电源引脚就近放了0.1μF陶瓷电容,在总输入端放了一个470μF电解电容。ADS1115的参考电压直接吃模拟5V,虽然不如独立基准精确,但AD736输出的直流电平和ADC是共地的,测量比值时参考误差会被抵消大半,所以对最终精度影响不大。
3. PCB布线关键点与实战布线图解析
3.1 布局分区与地线处理
PCB布线这部分其实比硬件设计更影响最终精度。我第一次画板就是随便布,结果测小电感时读数乱跳,后来重画才明白:模拟电路和数字电路必须分区,地线更要讲究。
我的板子是双面1.6mm FR4,整体布局从左到右大致是:电源输入与ICL7660在左上角,文氏桥振荡器在左中,DUT测试端子在板子中上侧,继电器和采样电阻阵列紧挨测试端子,AD736和比较器在右侧,STC89C51和LCD1602在右下。底层大范围铺地,数字地和模拟地在电源入口处通过一个0Ω电阻单点汇合。
为什么必须单点接地?因为数字电路的电平跳变会在地线上产生高频噪声电流,如果模拟地和数字地大面积直接连通,这些噪声就顺着地平面窜进文氏桥和AD736,最终体现为读数抖动。单点汇合后,模拟电流和数字电流在地平面上的公共路径被缩短到最低。
3.2 关键信号走线的具体约束
以下几条走线我在布线图里做了严格处理,你们画板时可以直接参考:
- DUT端到继电器到采样电阻的走线:这部分走的是整个测量回路的主信号,走线要短、要粗,建议至少40mil以上。走线电阻虽然只有几十毫欧,但在测低阻值时会对10Ω档造成可感知的误差。
- 文氏桥的RC网络:R和C紧挨着运放摆放,两个R对称、两个C对称,避免走线长度不同带来寄生参数偏差。振荡输出到缓冲器的走线不要穿越数字区域。
- LM393输入线:来自AD736前级的信号线属于高阻输入,容易拾取干扰,走线要短,而且两侧尽量用地线包住。如果板子空间允许,比较器输入位置可以加一个100Ω串联电阻配合对地电容做低通,滤掉高频噪声。
- 继电器控制线:从ULN2003到继电器的驱动线是脉冲电流,不能和模拟采样线平行走长距离,否则开关瞬间会通过寄生电容耦合噪声。
- 去耦电容:每个IC电源脚旁的0.1μF电容必须紧靠芯片,走线先过电容再到电源脚。ICL7660的飞跨电容C1和C2也要尽量靠近芯片,否则负压输出纹波会变大。
3.3 布线区域速查表
下面是我画完布线图后的分区速查表,方便在任何EDA工具里复现:
| 区域 | 关键器件 | 布线要点 |
|---|---|---|
| 电源区 | 5V输入、ICL7660、稳压电容 | 走线短粗,电容靠近IC |
| 振荡区 | OP07、R/C网络、CD4066 | 对称布局,远离数字线 |
| 测量区 | DUT端子、继电器、采样电阻 | 主回路走线短粗,包地 |
| 采样区 | AD736、CD4052、ADS1115 | 输入滤波电容靠近芯片 |
| 比较区 | LM393 × 2 | 上拉电阻靠近输出脚 |
| 数字区 | STC89C51、晶振、LCD | 晶振紧贴单片机,铺地隔离 |
实际打样后,按这个布局做出来的板子,模拟区几乎没有受到数字部分干扰。小信号测量时,屏幕读数稳定,只有最后一位偶尔跳动,这对DIY来说完全能接受。
4. 软件设计:从51裸机到测量算法
4.1 主程序框架与状态机
软件部分用Keil C51开发,整个程序围绕一个状态机转。主循环状态依次是:量程选择、信号稳定等待、ADC采样、相位测量、参数计算、结果显示。状态机的好处是逻辑清晰,方便以后扩展数据输出功能。
主循环示意如下:
void main() { LCD_Init(); ADC_Init(); Timer0_Init(); EA = 1; while (1) { Range_Select(); // 自动量程 Delay_ms(200); // 等待AD736输出稳定 uz = Read_ADC(CH_UZ); // 读DUT电压对应的有效值 ur = Read_ADC(CH_UR); // 读采样电阻电压对应的有效值 phase = Measure_Phase(); // 测量相位差时间 Calc_RLC(uz, ur, phase); // 复数运算 Display_Result(); // 刷新LCD } }这个循环看起来简单,但每个函数背后都有不少细节,下面分节展开。
4.2 自动量程的实现逻辑
自动量程函数通过控制继电器的开关组合选择采样电阻。程序首先把档位置为1kΩ,测一次Uz和Ur,然后根据电压比值决定是否换挡。
void Range_Select(void) { unsigned char range = 2; // 默认1kΩ档 unsigned int ratio; do { Set_Range(range); Delay_ms(200); uz = Read_ADC(CH_UZ); ur = Read_ADC(CH_UR); ratio = (unsigned int)(uz * 10 / (ur + 1)); if (ratio > 80 && range < 4) range++; // 换更大采样电阻 else if (ratio < 2 && range > 1) range--; // 换更小采样电阻 else break; // 档位合适 } while (1); }注意ratio这里放大了10倍来比较,也就是Uz/Ur > 8时切大档位,Uz/Ur < 0.2时切小档位。每次切换后必须延时200ms,继电器机械动作需要时间,而且触点稳定也需要几毫秒,千万不要切完立刻采样,否则会读到抖动期间的错误电压。
低阻档位和高阻档位的采样电阻差了1000倍,会导致信号源负载明显变化。实际中我遇到的问题是:切换到10MΩ档时,信号源经过高阻串联后,AD736输入信号很小,有效值转换可能不准确。所以10MΩ档主要用于粗略判断元件是否短路、开路,精度比其他档位差一些,这在软件说明里也标注了。
4.3 相位差测量与代码实现
相位差测量是整个软件里我最谨慎的部分。我用了两个外部中断:INT0接Uz整形后的方波,INT1接Ur整形后的方波。定时器0专门用来计时。
具体测量思路是:先等Uz上升沿触发INT0,在中断里启动定时器0;再等Ur上升沿触发INT1,在中断里读取定时器0的值,就是t1;然后在下一个周期反向测一次,等Ur上升沿触发INT1,启动定时器0,等Uz上升沿触发INT0,停止并读取t2。
void INT0_Isr() interrupt 0 { if (phase_state == 0) { TH0 = 0; TL0 = 0; TR0 = 1; phase_state = 1; } else if (phase_state == 3) { t2 = (TH0 * 256 + TL0); TR0 = 0; phase_state = 4; } } void INT1_Isr() interrupt 2 { if (phase_state == 1) { t1 = (TH0 * 256 + TL0); TR0 = 0; phase_state = 2; } else if (phase_state == 2) { TH0 = 0; TL0 = 0; TR0 = 1; phase_state = 3; } }定时器0工作在1T模式还是12T模式要提前想清楚。STC89C51工作在12T模式,12MHz晶振下计数器每1μs加一。1kHz信号的周期是1000μs,定时器16位最大值65535,完全不会溢出。
拿到t1和t2后,比较大小确定超前滞后关系。如果t1 < t2,说明Uz上升沿先到,也就是电压超前电流,元件感性,相位角取正,φ = 2π × t1 / T。如果t2 < t1,说明电流超前电压,元件容性,φ = -2π × t2 / T。T是信号的周期计数值,1kHz下等于1000。
这个逻辑的前提是两个比较器、两条信号路径的传输延迟基本一致。实际中LM393的翻转速度、光耦如果用了会不一致,但都在微秒量级,对1kHz影响很小。如果换到10kHz档,需要把周期计数换成100,误差比例会明显上升,所以10kHz档我更多用来做元件类别的粗略判断。
4.4 参数计算与串并联换算
计算函数把之前测到的Uz、Ur、t1/t2转成R、L、C并显示。STC89C51的浮点运算很慢,但每秒刷新一两次还可以接受,代码直接用了float。
void Calc_RLC(unsigned int uz_adc, unsigned int ur_adc, unsigned int t1, unsigned int t2) { float uz_v, ur_v, z, phi, r_esr, x, freq; uz_v = uz_adc * 4.096 / 32768.0; ur_v = ur_adc * 4.096 / 32768.0; z = sample_resistor * uz_v / (ur_v + 0.001f); if (t1 < t2) { phi = 2 * 3.14159 * t1 / period_ticks; } else { phi = -2 * 3.14159 * t2 / period_ticks; } r_esr = z * cos(phi); x = z * sin(phi); freq = 1000.0f; if (x > 0) { inductance = x / (2 * 3.14159 * freq); capacitance = 0; } else { capacitance = 1.0f / (2 * 3.14159 * freq * (-x)); inductance = 0; } }这个函数里的sample_resistor是当前量程电阻值,period_ticks是当前频率下一个周期的定时器计数,freq是当前测试频率,三者在切换档位或频率时同步更新。
关于串并联模型:对小电容、大电阻,直接使用串联模型会低估容值,因为高阻并联分量影响变大。我在显示界面做了转换:如果计算出的Q值小于0.05(也就是X远大于R),就按并联等效模型重新计算一份Cp和Rp显示。
[ C_p = \frac{C_s}{1 + (1/Q)^2} ] [ R_p = R_s \cdot (1 + Q^2) ]
这个功能对检测电解电容的漏电阻特别有用。实测一个470μF电解电容,串联模型下ESR约0.3Ω、容值约465μF,切换到并联模型后漏电阻显示为数十千欧,一眼就能看出电容是不是老化了。
4.5 校准与误差修正
校准是整个DIY项目里最能提升精度的一步。我做了两类校准:开路校准和短路校准。
开路校准时,DUT端子悬空,这时仪器读到的不是真正的“零”,而是电路板寄生电容、继电器触点电容、AD736失调等的综合影响,记为Yopen。短路校准时,DUT端子直接短接,读到的Zshort包含测试线电阻、继电器接触电阻和寄生电感。
实际测量时,先用测量值减去短路阻抗做串联修正,再用导纳减掉开路导纳做并联修正。这一步要在复数域做,程序里维护两个校准复数变量,计算时叠加。
一个容易踩的坑是:开路校准在10MΩ档做,短路校准在10Ω档做,两个校准条件下寄生参数的频率特性不同。所以校准必须按频率分别保存,100Hz、1kHz、10kHz三组,切换频率后自动加载对应的校准数据。我第一次没分开保存,结果10kHz档读小电感偏差很大,找了好久才发现是校准数据串档了。
校准之后,再用几个高精度电阻做两点校准修正AD736的非线性。我在程序里实现了简单的增益偏差修正系数,测量已知电阻后反推修正值,写入EEPROM,这样每次开机就不用重新校准了。STC89C51虽然没有EEPROM,但可以用程序存储区的IAP功能模拟,实现起来不复杂。
5. 实测、调试与避坑记录
5.1 通电调试步骤
整机焊好后不要急着插DUT测量,按照“电源→振荡→比较器→ADC→整机”的顺序逐级检查。
第一步检查电源:上电后测+5V、-5V,ICL7660输出应该在-5V附近,纹波小于50mV。如果纹波大,多半是飞跨电容离芯片太远。
第二步看振荡器:用示波器探文氏桥输出,应该看到干净的正弦波,幅度约1V(RMS)。如果不起振,检查稳幅二极管是否焊反;如果波形半边削顶,稳幅二极管动作太早,在反馈电阻上并联一个几百欧电阻降低增益。
第三步看比较器:两个比较器输出应该是频率一致、存在相位差的方波。用示波器双通道同时看,把两个方波调到同一屏上,应该能直接看出哪个超前哪个滞后。如果方波边缘有抖动,说明迟滞电阻没起作用,检查1MΩ反馈电阻和输入串联电阻是否接在正确位置。
第四步看ADC:在单片机程序里临时加一段直接把四路电压原始值打印到LCD的调试代码,确认每路读数都随信号变化。如果读数一直为0,大概率是模拟I2C地址不对,或者SDA/SCL接反。
5.2 实测数据对比
下面是整机调试完成后用几个手上元件做的实测对比,测试频率1kHz,参考值是优利德UT61E万用表和一台朋友那借来的二手电桥给的:
| 被测元件 | 标称/参考值 | 本机实测 | 相对误差 |
|---|---|---|---|
| 金属膜电阻1 | 9.98kΩ | 10.02kΩ | +0.4% |
| 金属膜电阻2 | 47.5Ω | 47.8Ω | +0.6% |
| CBB电容 | 0.1μF | 0.098μF | -2.0% |
| 瓷片电容 | 10nF | 10.3nF | +3.0% |
| 电解电容 | 470μF | 455μF | -3.2% |
| 色环电感 | 100μH | 104μH | +4.0% |
| 工字电感 | 1mH | 0.96mH | -4.0% |
从数据看,电阻档最准,因为两个AD736通道虽然各自有非线性,但做比值时误差被抵消了一部分。电容和电感的误差主要来自相位测量和时间测量,1kHz下几个微秒的误差就能带来好几度的相角偏差,这基本就是精度瓶颈。
关于读数跳动:在测10nF小电容时读数偶尔有1到2个字跳动,主要是因为测试线在桌面上移动导致寄生电容变化。DUT端子附近不要用手碰,手靠近都会让读数明显变化。
5.3 常见问题与排查速查
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 开机LCD无显示 | 对比度电位器没调好 | 调LCD背面电位器到屏幕出现方块 |
| 振荡器无输出 | 运放供电异常或稳幅二极管反接 | 测OP07电源脚,核对二极管方向 |
| ADC读数恒为0 | I2C地址配置错误 | 检查ADS1115的ADDR引脚接地配置 |
| 相位测量剧烈跳动 | 比较器迟滞不足 | 增大反馈电阻/调整输入分压 |
| 继电器切换后读数异常 | 没有等待触点稳定 | 延长切换后延时到200ms以上 |
| 测电感值偏大 | 没有扣除测试线寄生电感 | 做短路校准,在复数域扣除 |
| 测电容值偏小 | 没有扣除开路寄生电容 | 做开路校准,按频率分别保存 |
| 10kHz档误差大 | 中断响应延迟占比变大 | 该档仅做定性判断或改用占空比测相位方案 |
如果在实际调试中遇到“相位差计算出来始终是同一个方向”的情况,先别怀疑硬件,多半是判断超前滞后时t1和t2的符号搞反了,把t1 < t2和t1 > t2的处理逻辑对调一下就行。
最后再分享一个实际使用中的小技巧。DUT测试端子那两根线一定要短、要对称,我用的是香蕉插座加双绞线做的开尔文夹,夹子线靠得太近或者摆成一个大环,测小电感时读数会随夹子位置变化而飘动。原因很简单,测试线本身构成了一个可变电感,也参与了测量。后来我把测试线固定长度、固定绞距,再上机测试,稳定性明显改善。这种细节看起来不起眼,但对RLC测量来说,比换一颗更高精度的采样电阻影响还大。
从零开始做这台RLC测试仪,我最大的体会是:测量类仪器设计的核心并不在单片机有多强,而在模拟链路的每一个环节是否被认真对待。文氏桥的波形质量、采样电阻的精度、比较器的迟滞、地线的回流路径,任何一处偷懒都会直接展现在最终读数上。如果你照着这个方案画板复刻,建议先不要追求一次成功,分模块调试会更顺手。等这台入门款跑通了,后续还可以加一键自动频率扫描、USB串口输出数据曲线,甚至把换挡方式改成电子开关做全自动量程,51的底子虽然老,但把外围电路玩明白了,一样能做出很有价值的工具。