适合业余爱好者DIY高精度数字电桥
DIY数字电桥说明一、概述:
玩矿石收音机,大部分元件需要DIY,所以需要知道元件的参数。因为DIY的元件没有标称技术参数。比如,需要知道谐振器件、检波器件、天线、耳机、变压器等器件的电抗特性。其中,高频参数可以使用Q表解决问题,而低频参数Q表难以测定。想了几天,还是觉得DIY一个LCR表来测定比较有效果,以图解决音频阻抗测定问题。
•LCR电桥原理
测定电抗元件Zx中电压U1与电流I,就可以得到Zx=U1/I。当Zx串联了已知电阻R,那么测定了R上压降U2,就可得到I,最后Zx = U1/I = U1/(U2/R) = R*U1/U2,可见,无需测量I的具体值就可以得到Zx,这是电桥的一般特征。
为了得到Zx在x轴与y轴上的两个分量,以上计算须采用复数计算。
设U1 = a+jb,U2=c+jd,那么Zx = R*(a+jb)/(c+jd) = /(c*c+d*d)
U1与U2要采用同一个坐标系来测量。
借助相敏检波器,可以分离出a、b、c、d,相敏检波过程,需要一个稳定的0度与90度的正交坐标轴,测量期间,U1、U2向量也必须在这个坐标系中保持稳定,不能乱转。
为了得到足够的精度,控制好放大器的增益,使得a、b、c、d的有效数字足够大,Zx的测量精度就高。然而,Zx分母两个正交量ac+bd和bc-ad,其中一个值可能很小,这就要求AD转换器的精度及分辨力要足够大。
•一点思路
设计此表,前后花费了近一个月的业余时间,更改了多个版本,总体比较满意。
本表主参数精度良好,副参数精度差。这是表头灵敏度不够造成的。因此,如果想测量Q值,当Q值大于100时精度非常低。
在矿石收音机中,高频线圈的Q值要求准确测定。它值接影响了矿机的性能。但音频线圈的Q值,则没有过分严格的测量要求。所以本表从一开始就没有在副数上多下功夫,始终坚持采用单片机自带的AD转换器,以便大幅度等化电路结构。
网上流行的俄版电路,其核心部分本表均未采用。
俄版电路采用ICL7135作为AD转换器,精度比STC单片机自带的AD性能好很多。然而,经过多次计算分析,结论是用自带AD也可以得到优于1%的主参数精度,所以最后放弃ICL7135。设计后期,对电路优化设计,很大程度上泥补了STC AD的不足。,
ICL7135的最终精度与芯片质量及积分电路有关,因此要使用ICL7135精度达到4位半表头,也不是很容易。7135的几个电容就足已占去半块PCB板。仿制者,通常用低压的小电容代替,这种情况,AD转换器本身的精度一般是低于0.05%的,最后得到的LCR表也会低于0.1%精度。当我们对LCR表的精度要求特别高时,对电阻的精度要求也高,精密电阻不好找。综合这些因素,最后选STC自带AD,代价是损失少量主参数精度,同时严重损失副参数精度。
信号源是LCR表的一个核心部件,俄版的正弦信号发生器及0、90度方波发生器,其综合性能并不会优于本电路,相反,本电路显得非常简法,仅使用了一组RC滤波器及DDS程序就完成了这两种信号的生成。
相对许多其它形式的LC测量电路,相敏检波器是LCR表特有的。本电路采用开关式相敏检波器,性能良好。实测了几个数据,比我预想的要好。比如,小信号用0度轴检波,OP07输出得到293.5mV,用180轴得到-293.0,这当中包含用OP07的输出失调、万用表正反向测量误差0.1mV。OP07输出失调的主要原因是输出端用3个1N4148二极管升压。但从最终数据看,两次测量理论值应是互为相反数,实测仅误差0.5mV(0.2%),大信号时,误差还更小,本表采用满度4500mV表头输出。
本LCR电桥的相敏检波器依靠单个模拟开关实现,可以抑制偶次谐波,但没有奇次谐波抑制能力。开关导通时间是半个基波周期,偶次谐波在半周期内共有整倍数谐波周期,谐波的直流平均值是零。奇次谐波,在半个基波周期内有N倍又1/2个谐波周期,多余的1/2周期的直流平均值不是零。DDS输出的奇次谐波是很小的。对于1kHz和100Hz,理论3次谐波幅值约为DAC分辨率的1/2,相当于-50dB左右。对于7.8kHz,采用DDS时钟的整数分之一倍,相噪小,然而,由于频率与时钟较接近,PWM型DAC的噪声大,谐波失真较大,所以电路中对DDS输出做了6级针对PWM的RC滤波,最后也使得谐波基本消失(在示波器中,在第5级滤波时,就已经无法发现谐波失真)。
由于来自单片机谐波干扰,有可能造成相敏检波质量下降,电路中的带通滤波器,正好对高次谐波有较强的抑制能力。
控制相敏检波器开关的方波信号,本身也是一种干扰信号,但对于这个低频电桥,它的影响可以忽略。从最终的正交分离能力测试来看,相敏检波器的性能优良,虽然只用了一个电子开关。
二、设计要点:
本LCR表的各级放大器,大多工作在大信号状态,所以要精心设计好放大器,否则容易造成运放过载。
之所以选择大信号,主要还是为了提高抗干扰能力,使得LCR表更容易调试。可以在无屏蔽盒的情况下正常调试。
矿机元件一般都很大个,比如大环天线,直径常常到到1米,用线数十米,天线上的信号也很强。为了更可靠测量,还在电路中加入了带通滤波器。
交流放大器由多级放大器构成,设计时,不论增益开关处于那个状态,应保证第n级运输出信号大于等于第n-1级放大器的输出信号。道理是:当不满足上述条件时,前级可能过载失真,而程序全然不知。在音响系统中,前级调音台过载,可以被电平指示灯显示,也可以被耳朵听出来,这时,我们就可以调大后级功放音量,调小前级调音台的增益,这样就不会失真了。但是,单片机程序没有金耳朵,所以中间级电路本身不得过载,以免造成单片机误判。各运放的最大输出能力相同,所以最好的办法就是后级输出幅度大于等于前级输出,那么过载现象必然引起后级输出过大,进而毫伏表超量程,程序立刻知道电路过载了。
1、表头满度值
表头满度是5.0V,由于OP07运态范围限制及纹波等因素影响,表头满度设计为4.6V,对应950字。
2、相敏检波器增益
检波波器理论灵敏度为2/3.1416*(2*51)/(20+4*51)=0.29倍
3、末级直流放大量设计
末级直流放大量过多,不利于提高信噪比,放大量太少,会造成前级过载。
第三级(U2D运放)信号为A,它的最大不失真的幅度为A0,约为3.5V,取保守值为3.0V,表头满度设计为Vo=4.6V,OP07和相敏检波器的直流总增益是K
当正弦信号达到最大不失幅度A0时,须使表头必须满度,以方便判断是否过载,并充分利用表头分辨率。所以K的合理设计值是A0*K>Vo,算得K>Vo/A0=4.6/3=1.5。类似的,在音频功放中,要使功放得到充分的功率输出,功放的增益K要足够大,使得前级满幅时,功放可以超过最大输出Vo。
实际上,“K=Vo/A0”中的Vo指正弦峰值上限。在正交检波输出后,是Vx和Vy两个量,并不直接输了峰值的Vo,要取模计算才得到Vo。即输入信号的模值达到Vo时被认定为表头满度。
为了进一步利用表头分辨力,可以采用Vx或Vy判定表头溢出。但最糟的一种情况是,当被测向量是45度时,最大模值变为1.414V0,所须前级信号也增加了1.414倍才能满度。为了防止前级运放过载(U2D运放超过A0),K值也必须增加1.414倍,因此采用正交量判别表头溢出时,K值须大于1.414*1.5=2.2倍。因此,对于0度或90度信号,A>V0/K,表头溢出;45度信号,A>1.414*V0/K,表头益出。
本电路OP07直流增益是11倍,K=11*0.29=3.2。许可0度或90度信号的A最大值为A=V0/K=4.6/3.2=1.44V。其中,K设计为3.2,比理论下降要求2.2大了40%,这样就留下了足够的余量,前级运放的动态能力余量更大,调试更容易。
4、第三级(U2D运放)放大量设计
本级加了带通滤波器,衰减系数是1/3,7.8k档衰减系数是1/2.6。计算时按1/3计,7.8k档结合信号源另外调整。
7.8k档设计为1/2.6衰减系数,是为与信号源幅值配合。
为了使得本级放大倍数大于1,所以运放至少要补偿带通滤波器的衰减。
本级是可控增益的,最小放大倍数设计为1/3*(13/3) = 1.44倍
通过开关切换,两档增益是3倍关系。
5、第二级(U2C运放)放大量设计
本级也是可控增益,最小放大为1倍(无电压放大功能)
通过开关切换,两档增益是10倍关系。
6、第一级(U2A和U2B运放)设计
直接采用俄版电路设计。电路增益是5倍。
7、DDS输出信号许可最大值
上面已算得,相敏检波许可最大电压输入值是1.44V
前两级最小增益是1.44*5=7.2倍
因此信号源程序最大幅度限制为1.44V/7.2=200mV
由于信号源与坐标轴之间不一定正好是0或90度,所以200mV通常不会溢出。
100Hz移相小,容易溢出。为此,第三级输出电容采用0.22uF,对100Hz有小量衰减,所以100Hz的DDS输出采用200mV不会溢出。
最后信号源输出设计为:
100Hz,有效值140mV,峰峰值200mV
1kHz,有效值130mV,峰峰值180mV
7.813kHz,有交值0.10V,峰峰值140mV
调试电路时,测定一下信号源运放输出端的信号强度,须比小于等于以上电压设计值。如果比以上值高了10%,本LCR表不能可靠工作。
8、V/I变换器与差动输入的关系
当频率高时,V/I变换器运放的内部增益下降,运放负输入端对地电压不是零,当电流较大时,“虚地”电压也可高达数毫伏。此时,如果不采用差动法检测量桥臂上的电压,误差会很大。为了对付这个问题,差动三运放须有较强的共模抑制能力,两臂上的2k与10k电阻要尽量严格对称。
对于上臂电压,为了消除导线电抗影响,也是需要差动放大的。
有些精简版的LCR电桥,不采用差动三运放,而改用一个运放,这种情况下,电桥精度略有下降,而且只能用于较低频率的大Zx小电流(如1kHz以)条件下测定Zx
9、AD问题
单片机自带的AD只有10bit,用10倍步进,会影响精度。
为了改善这个问题,放大器可控增益的调节以3倍左右的倍率关系步进。
其次,借助AD的高速能力及信号噪声,进行10倍过采样,AD的分辨力提高约1bit。
STC自带的AD,不能测量小于3字的信号。所以,电路中给输出直流信号加了偏置电压。这个偏置电压是利用OP07输出端的2k电阻与10欧电阻分压实现的。
10、V/I变换器与信号源的关系。
V/I变换器也存在过载问题,也要消除它,虽然人工切换量程时可以判断它是否过载,但对于没有经验的使用者来说,并不容易,因为,用眼睛看失真,不如耳朵听失真来得容易。
V/I变换器过载的原因有二,首先,那个运放的反馈回路接了500欧左右内阻的电子开关,它相当于输出衰减器;其次,TL082内部串接了200至300欧电阻,也是一个限流衰减。这样一来,100欧档为了得到0.472V,TL082内部电压将是0.472*(500+300+100)/100 = 4.25V,此时,内部过载。
为了解决过载问题,采用以下方法:考虑到信号源TL082也有过载问题,所以上臂限流电路与下臂电阻电路设计成对称的电路,那么只要信号源不过载,V/I变换器也不过载。
此外,V/I变换器的20欧档,采用了机械输助开关,那么相同电流下,更不容易过载的。
11、信号源
前述,V/I与限流器采用对称结构时,Zx短路,V/I变换器输出端的电压与信号源输出端是一样的。信号源不过载,V/转换器也不过载。
信号源采用DDS,频率精度高。可以输出任意频率。本表采用100Hz、1kHz、7.813Hz
不使用10kHz的原因是:DDS的钟频采用62.5k,输出频率10kHz时,频率已经比较接过钟频了,相位噪声大。为了消除相噪,采用钟频的2^n分之一的频率,这里使用1/8钟频。
信号输出加出了简单的RC滤波器,对于1kHz以下的频率输出,此滤波器相当于6阶滤波器,可以得到良好波形。对于7.813kHz,到了第5阶输出,在示波器中观察已基本看不到失真,到了第6级输出,已经是无法直接观察到失真。
由于不是理想的高阶滤波器,Q值低,所以对7.813kHz的衰减很严重,为了保持100Hz、1kHz、7.813kHz三档输出幅度相对一致,利用单片机控制电子开关对1kHz和100Hz降幅。
三、使用要点:
菜单1:开机启动默认菜单
使用8键加1键切换到菜单1
使用8键加2键切换到菜单2
使用8键加3键切换到菜单3
……
1键:显示串联电抗X
2键:显示串联电阻R
3键:显示串联电感L
4键:显示串联电容C
5键:显示Q值
6键:频率切换,100Hz时,指示灯亮起,1kHz时不亮
7键:量程切换,4个指示灯轮跳
8键:菜单切换键,按下该键时,显示当前所处的菜单号。
显示单位表示:
10的-12次方,显示为“P”
10的-9次方,显示为“n”
10的-6次方,显示为“u”
10的-3次方,显示为“大n”
10的0次方,显示为“小O”
10的3次方,显示为“三横”
10的6次方,显示为“d”
10的9次方,显示为“G”
单位如果含有小数点,说明是容性电抗。
矿机高阻抗变压器,在1kHz时,有的会表现为容抗,而不是感抗。
接入Zx后,先设置好频率,然后选择合适的档位。使得被测Zx的阻抗应与下臂电阻匹配,以取得高精度。设下臂电阻是A,那么Zx在A/30<Zx<30A范围内可得到准确的结果。如果事先不知道Zx的估值,可以选择1k档或10k档测量,得到被测Zx的R与X。当Zx是电感或电容时,其R小X大,因此根据X的测值重新选择档位。当Zx是电阻,则R大X小,下臂应与R匹配,根据R选择档位。
残余电抗。本表存在残余电抗。为此,测量pF级电容,先不接被测电容,测量出本底电容,我的LCR表本底是3.5pF,然后接上电容测量,若测得23.3pF,那么实际电容就是23.3-3.5=19.8pF,此法与Q表测得的电容比对,1字不差。
测小电阻时,切换到20欧档,按下机械开关,可以增加灵敏度数倍。测量后,弹出开关,以免影响其它档。
扩屏显示小数位:按下当前显示值对应的键,就会显示为四位模式,但“单位”不显示了。再按一下1至5任意键,退出四位模式。本LCR表达不到4位的精度,所以通常无需采用4位显示。有时显示1.xx的数值,觉得精度不够,可以按此法扩展一下位数。
显示四个小数点,表示溢出。
显示“Err”,表下臂或上臂出来零值。
本表不设置调零功能。必要时用户需要自行减去零值。
测量时,先检查Zx一下X或R的值是否在量程范围之内,如果超主量程,应切换档位。
菜单2:
1键:显示并联电抗X
2键:显示并联电阻R
3键:显示并联电感L
4键:显示并联电容C
5键:显示Q值
6键:频率切换,100Hz时,指示灯亮起,1kHz时不亮
7键:量程切换,4个指示灯轮跳
8键:菜单切换键
单位显示同上
菜单3:
这是调试菜单
1键:增益切换键,切换时,显示屏暂时跳出置位信号数秒钟,
3键:K3切换键,切换时,显示屏暂时跳出置位信号数秒钟
4键:相位旋转键,切换时,显示屏暂时跳出置位信号数秒钟,相位旋转的顺序是0度、180度、90度、270度
本菜单下,屏显内容是AD的读值。
在此菜单下,可以检测检波非线性。方法是:Zx接上一个10k电阻,切换到菜单3,用1键把增益置为0位,利用3键和4键,找一个读值为30以下的。接下来,1键更改增益,并记录读值。例如,得到32,92,302,902,理论增益关系是1、3、10、30,所以,以上显示值说明检波器线性度良好,但存在0点误差2字。以上数据统一减2字就正确了。在菜单4中零点误差改正值。
菜单7:
修改零点误差改正值。
1键(X键):数值增加0.5
2键(R键):数值减小0.5
3键(L键):保存键
4键(C键):清零键
首次使用时,请设置好该值,否则LCR表无法正常工作。我的LCR表,改正值是负2.0
四、制作要点:
V/I变换器上的4个电阻要精确,最好优于0.5%
中间放大器,关系到1:3:10:30增益切换关系的4个电阻(2k、18k、1k、2k),比值关系要准确。请使用4位半的表筛选。
5倍放大器,上、下臂的热端关联的2k与10k电阻要准确,确保上下臂增益相同。冷端(虚地)的2k与10k电阻,不要求精度很高,用1%精度问题不大。当然,如果这几个精度全部高精度,不但上下臂增益相同,而且共模抑制能力强。
电源变压器使用8V*2或9V*2,其中7905与7805无需加散热器。接变压器的排针与接下载线的排针最好区别开,如果不区分,万一把9V电源插到下载线排针,单片机或电路有烧的可能,当然通不会烧的。
接线完成后,检查的关键是:每个IC电源和地线有没有接错。电源没接错,IC通常不会烧。
飞线多,不小心就会错,所以9V变压器使用小容量的,万一接错或碰电,由于变压器功率不足,反而会保护电路。
单片机的电压不可过高,如果高于5.5V,有危险。比如,不小心加入12V电压,单片机必烧。所以各个IC的供电是关键。
制作工艺按照单响的工艺就足够了。
同时注意两个桥臂信号通路的对称性。
TL082负载能力测试:在信号输出运放的输出端,对地接51欧电阻,三个频率档位下输出的波形不得有失真,直接用示波器观察即可。测试完成后,拆除51欧电阻。
制作时,应注意TL082信号输出的幅值,是否在设计规定的范围内。
五、关于误差
基本量程精度是0.5%,精心制作,也可达0.25%
Zx电抗在下臂电阻的1/30至30倍时,1kHz档精度达到0.5%,实际上,1kHz下做了一个小测试,测定了100至200k的十个电阻,精度全部达到0.15%
Zx电抗在下臂电阻的1/30至30倍之外时,误差变大。
Zx在30倍与1/30倍之内,可按300字的精度测算精度,即0.3%,做为误差指标,最好留下余量,即0.5%,个人建议使用1%,因为采用色环电阻,推荐精度是1%,这样取材最方便。1%精度电阻,经过简单筛选,很容易达到0.5%的精度,那么最终LCR表的精度会优于1%,如果不筛选,直接使用1%精度电阻,将不易得到1%精度的电桥精度,要碰运气了。
本电桥最小分辨阻抗是表头测定电压时的分辨力决定的,下臂按300字保守估计,那么上臂1字分辨力对应的阻抗是下臂电阻的1/(300*30)≈1/10000
20欧档的最小分辨阻抗是20/10000=2毫欧。
1k欧档的最小分辨阻抗是1000/10000=0.1欧。
同样道理,最大阻抗分辨力为量程电阻的10000倍
100k欧档的最大分辨阻抗是100k*10000=1G欧左右。
由于对电桥做了一些算法及电路参数的改进,实际上分辨力比上述估计要好3至5倍。
在距离平衡点1/300及300倍处,误差加大10倍,如果再超此范围,直接采用零点非线性误差1至2字即可,1字误差相当于满度值的1/(300*30)=1/10000,如1k欧档,固有常数误差是1000/10000=0.1欧,20欧档为20/10000=2毫欧。
电感分辨力约为2 mΩ/(6.28*7.8kHz)=0.04uH
频率7.8kHz时,电容分辨力约为1/(6.28*7.8kHz*1G欧) = 0.02pF
Q值精度比较特殊。显示为98,并不是说它的精度是1%,我们对它取倒数后,保留到小数点以下第三位,变成0.010,小数点以下第三位就是误差位,约两三字误差。即0.010的误差可以达到30%,对应的Q=98的误差也高达30%
Q值的误差实际上是X和R二者中精度最低的那个。X与R在这个LCR表,是用同等增益系数放大器取得的。设X在某量程处取得良好精度,对于Q=100,R将在1/100量程处取得结果。表头的平均读值安400字计算,那么1/100量程处只有4字,此时,R的误差将高达20%至50%(一到两字误差)
这个LCR表的高Q值测定,与Q表比较,性能还有很大距离。
Zx高Q,测量电阻分量误差大,测电抗分量误差小。反之,Zx低Q,测电阻分量误差小,电抗误差大。低Q时,电抗分量相对电阻分量很小,当电阻分量满度时,电抗分量的读数很小,受表头分辨能力、正交分离度等影响,电抗分量测量精度下降,在Q值大于0.1时,且Zx远离测量极限状时,电抗测量仍有较高精度。
测量感量,如果与阻抗法测量比较,设频率为f时,一个Q=0.1的电感,用阻抗法测量电抗需要30倍f才能将这个电感测到同样的精度(假设频率上升过程中,电阻分量保持不变)。 也就是说,电桥的工作频率虽然只有7.8kHz,但它相当于100kHz至500kHz频率下阻抗法测电抗的效果,所以可以准确的测量小电感的电感量。
小电感最小测量约0.1uH,测量0.5uH电感,误差可达5%至10%,测量1uH电感,误差小于5%
下表是洞洞板LCR表电阻测量精度实测(没有采用过采样算法,精度稍低一些):
被测电阻 档位 100Hz 1kHz 7.8kHz
2.5mΩ 20欧 2.2 mΩ 3.1mΩ 2.2 mΩ
7mΩ 20欧 7 mΩ 7 mΩ 7 mΩ
14mΩ 20欧 14 mΩ 13 mΩ 13 mΩ
223 mΩ 20欧 222 mΩ 222 mΩ 222 mΩ
3.129Ω 20欧 3.13 3.13 3.12
50.46 20欧 50.70 50.48 50.65
50.46 1k欧 50.50 50.35 50.56
100.45 1k欧 100.4 100.2 100.3
301.3 1k欧 301.5 301.6 302.3
100.3k 100k 100.2k 100.2k 100.3k
2.210M 100k并 2.213M 2.205M 2.187M
4.436M 100k并 4.46M 4.42M 4.30M
Zx开路时,100k档并联残余电阻是2.4GΩ(100Hz),2GΩ(1kHz),127MΩ(7.8kHz),使用并联法测量电阻,所得阻值实际上是残余电阻与被测电阻的并联值。
上表2.21M欧7.8kHz测量,并联值是2.21//127 = 2.17M欧,实际显示为2.19M
上表4.44M欧7.8kHz测量,并联值是4.44//127 = 4.30M欧,实际显示为4.30M
串联法测量高阻值电阻,在7.8kHz档,受残余导抗影响,测值误差很大。因此,测量高阻值电阻,建议使用1kHz频率并联法测量,而不应使用串联法,也不要使用7.8kHz。
L、C的测量精度,与Q和X的测量精度有关。当Q大于1时,测量精度可以参考电阻测量精度。当Q小于1时,L、C的测量精度比纯电阻测量精度低。
测量小电感时,由于频率过低,是不能完全反应高频状态的。例如,用5米长0.38mm线径漆包线绕的空心线圈,10kHz时的电感量是35.5uH,到了1MHz表现出来的电感量会比大于该值,即在10kHz与1MHz两个频率下表现出来的电抗是不同的。1MHz频率下铜线的趋肤深度是0.066mm,10kHz频率下趋肤深度是0.66mm,在10kHz下,趋肤深度远大于这条导线半径,所以导线的内自感是0.05uH*5=0.25uH,当频率达到1MHz,内自感变为2*0.066/(0.38/2) * 0.25uH = 0.17uH,这就是说,低频测量多测出了0.08uH的内自感。线圈有分布电容及对地分布电容约2pF至3pF,这会使它在1MHz时表现出的感抗变大0.5%的。频率高了,线圈中各点的电流不是同步建立的,这些可以归算为分布电容的影响。电感绕线用的传导铜线的长度大,容易受到各种因素影响,所以不必期望低频法测得的电感量外推到高频还会有相同的精度。
六、残余电容问题:
数字电桥存在一些残余电容,残余电容是有损耗的,即含有电阻分量。不同频率档位,残电容基本相同,但残余损耗电阻是不同的。1kHz与100Hz,残余并联损耗电阻是G欧级的。测量10M欧以下的电阻,无需修正即可得到1%的精度。7.8kHz,残余并联损耗约150兆欧。
在1kHz时,残余损耗电阻相当于并联在被测Zx两端,因此,当我们测量一个电阻,如果试图修正结果,应使用并联原理修正。这时,请使用并联法测量电阻。
残余电容的容量,在1kHz和7.8kHz下,不管是串联还并联,容量是相同的,这是因为残余电容的Q值较大,所以串或并联残余电容相同。测量小电容时,应减去残余电容,才是真正的电容值。
100Hz下,通常无需考虑残余电容问题。
七、DDS信号发生器
这是本LCR表的使用的核心技术。利用它实现了精确的相位控制,并输出正弦波。
DDS即“直接数字频率合成器”
一般采用专用DDS芯片,以取得高性能。使用专用DDS,如AD9833等芯片,价格贵,而且是MSOP封装,焊接不易,给DIY带来了一些障碍。此外,AD9833与单片机结合,实现0度、90度、180度、270度移相方波,也是比较麻烦的。
现在的单片机,速度快,可以直接合成音频波形,同时精确输出移相方波。
单片机DDS算法原理:
正弦函数y=sin(x),其中相位量x与时间成正比。即相位x随时间增加而线性增加。
先产生随时间线性变化相位序列x,同时利用查表法得到sin(x)的值,并利用DAC将sin(x)的值即时输出。
在单片机中设置定时器,每隔dT时间,相位累加dX,就得到x,x+dX,x+2dX,x+3dX……的相位序列。每产生一个相位,同时输出相应的sin(x)值。
算法确定后,接下来就看硬件上是否支持以上算法,如果支持,写出相应程序即可。
在单片机的内存中,存放了方波函数值查询表、正弦波函数值查询表,dT中断来到时,先输出x对应的正弦波数值,接着在另一个端口马上输出x+0度(或x+90度)方波函数值。这样就得到了LCR电桥所需的两个信号源。当前输出方波是x+0度还是x+90度,dT中断期间,不要使用if语句来判断,而应写面“x+初相变量”的形式,初相变量是事先设定好的。这样,x+0度方波与x+90度方波之间的相差就是严格的90度关系。
为了使波形相位稳定,dT的中断优先级须置为最高级别。
STC12C5A60S2,内置了DAC,并且dT可以设置得较小。
八、焊接
双面PCB板孔洞疏通:电阻位置焊错了,得取出重重新焊接。取出后,焊盘被堵,可能造成其它元件(如集成电路)安装不了,这时得疏通焊孔。可以使用“现场”工具来解决:平时剪下来的电阻引线不要扔,在烙铁加热下,把电阻引线穿进洞中。控制好温度,同时让电阻线只往一个方向运动,直到引线取出,这时孔内的焊锡就会被带出来。
焊接鳄鱼夹:把它夹在一个镊子上焊接。
双面板拆集成:1、引脚集体加热,同时拆。2、烙铁功率小,集体加热不灵。把引脚全部剪断,一脚一脚拆,这是万能的,不伤害PCB板的。
集成电路一般不会焊错,电阻容易焊错。
九、元件选配及调试
LCR1.0 PCB板上有一个错误。从PCB板的背面看(没有标注元件文字的那一面),7805的输入端,引出了两条线,一条接到整流二极管,另一条接到地线去了(长度约0.5cm),显然发生了错误。请把这条0.5cm的线割断,改接到7805的第二脚。
首先安装调的元件是电源部分,而不是其它元件。电源不正常,如输出电压过高,很容易把单片机烧掉,到时就麻烦了。在双面板上取下集成电路,不是很容易。所以,电源调试正常了,再安装其它元件。变压器请使用小功率的,那么调试过程中,万一短路什么的,通常不烧器件的。
电路上的元件参数有改动,请按新版PCB的标注安装。
机械开关,按下时启动20欧档输助功能,请注意安装方向。
OP07输出接了一个2k电阻。由于新版电路还利用10欧电阻加了偏置电压,而PCB板是上星期制作的,没有偏置。建议这样解决问题:2k电阻与10欧电阻串联后,变成一个直插元件,插入原来的2k电阻孔,要注意方向,串联体的2k电阻引脚接电源端,10欧电阻接1N4148端。再取100k电阻,从串联体电阻的中间连接头直接飞到104电容,与104电容连接的那个电阻孔可以利用,在PCB板正面飞过去。注意,这个100k电阻两引脚的对地阻抗是不同的,接104电容的那一脚对地是高阻抗的,所以引线要短一点,另一头是低阻抗的,长还是短无所谓。原PCB板上相应的100k电阻也标错了,在单片机左边,被标注为1k欧。通过飞线安装100k电阻,PCB板上当然就不要再装这个100k电阻了。
装完后,应检查TL082信号输出是否与设计值相同,偏小10%是可以的。偏大10%则不可以。
菜单7,直接采用负2.0(即2.0的相反数),估计没有问题。
电路中的电源滤波小电容,采用瓷片电容或独石电容。
接P1.0口的那两个104电容,采用体积小的涤纶电容或独电容。最好,测定一下它的漏电情况,测量方法是:电容一脚接到5V源,另一脚接数字万用表电压档正极,万用表负极接地,数字万用表最终显示的数值小于1mV,说明它的漏电很小。几个mV漏电不要紧。
其它的最好多使用涤纶电容。
除电解电容外,LCR表上的阻容元件的参数,几乎都不能做改动,所有的电阻的阻值关系,不单单是“调试”出来的,它经过了理论的计算与调试验证得到的,如果因为手上没有合适的阻值的元件,而改动参数,多半会影响电桥的精度。
一定要看明PCB板上各元件对应电路图中的哪个元件,才能明白哪些电阻要求精确。
电阻精度要求:
1、除单片机部分,其它与交流信号有关的,须全部使用1%金属膜电阻,或精度更高的电阻。
2、4个下臂电阻,须筛选到0.1%精度以上。
3、10倍增益切换运放的反馈电阻,2k和18k两电阻,须是9.000倍关系,即不要求电阻精确,要求比值精确,筛选到0.05%精度是比较容易的。
4、3倍增益切换运放的反馈电阻,1k和2k两电阻,须是2.000倍关系,即不要求电阻精确,要求比值精确,筛选到0.05%精度是比较容易的。
5、5倍增益运放的电阻,共有8个,四个2k和四个10k电阻
上臂的2k电阻(负输入)与下臂2k电阻(负输入),应严格相同,匹配到0.05%至0.1%
上臂的10k电阻(负反馈)与下臂10k电阻(负反馈),应严格相同,匹配到0.05%到0.1%
上臂的2k电阻(正输入)与下臂2k电阻(正输入),1%精度,此电阻精度,影响共模抑制,对高频大电流很重要
上臂的10k电阻(正臂)与下臂10k电阻(正臂),1%精度,此电阻精度,影响共模抑制,对高频大电流很重要
十、元件列表
三运放仪放电路阻容
2k,4个
10k,4个
1M,4个
1k,6k
104独石2个
224/100V涤纶电容,4个
1N4148,4个
上臂阻容:
20,2个
1k,1,10k,100k,5.1k各1个
发光二极管6个
自锁小开关1个
下臂阻容等:
20,100,1k,10k,100k,各1个
1N4148,2个
可控增益运放的阻容
1M,2个
2k,18k,各1个
1k,2k,10k,各1个
16k,5个
27k,1个
20k,1个
1n,10n,100n涤纶,各2个
104独石2个
224涤纶电容1个
检波器及直流放大:
10欧,1个
2k,1个
10k1个
51k,4个
100k,2个
473涤纶,2个
104涤纶1个
474涤纶1个
104独石2个
100uF,1个
1N4148,3个
DDS滤波及信号输出:
160欧,1个
1k,4个
2.2k,1个
5.1k,1个
10k,1个
4.7n涤纶1个
47n涤纶2个
22n涤纶,1个
10n涤纶,4个
10uF电解,1个
1N4148,2个
单片机及电源:
轻触小开关,8个
32MHz晶振,1个
3V峰鸣器,1个
100欧,1个
2.2k电阻,8个
5.1k电阻,2个
LED共阳4位,1个
100uF电解3个
10uF电解1个
8050三极管,2个
8550三极管,1个
7805三极管,1个
7905三极管,1个
1000uF,2个
1N4007,4个
排针40针
3M铜柱,5套
集成电路:
CD4052,CD4053,TL084,各2个
STC12C5A60S2,TL082,OP07各1个
品牌四位半万用表1块
示波器一台(可选)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689257VWX9IS.PNG
(原文件名:myLCR.PNG)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689258CRDXDP.jpg
(原文件名:T1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689259QUX35N.jpg
(原文件名:T2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689260WQYG6Z.jpg
(原文件名:T3.jpg)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689261LFRKDV.jpg
(原文件名:T4.jpg)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689262T1VZQR.jpg
(原文件名:PCB正面.jpg)
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689263GRB6US.jpg
(原文件名:PCB反面.jpg) 基本状况:
工作频率: 100Hz,1kHz,7.813kHz
最小分辨:最小分辨0.5毫欧,0.03uH,0.02pF
最大分辨:G欧
基本量程精度:1kHz基本量程精度,0.5%,选好电阻,精心制作,可以轻松达到0.25%精度
AD非线性误差小于0.05%,AD零点误差采用直流偏置消除
信号源:软件合成正弦DDS、软件合成方波DDS
显示:4LED
单片机:STC12C5A60S2 音频数字电桥,比较简单,但设计这个电路并不断改进,前后花费了近一个月时间。 http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689460KNADGT.GIF
(原文件名:相敏检波等效.GIF) http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689461BFU8F6.GIF
(原文件名:pcb1.GIF) 终于发了5个贴 /*************************************
LCR表驱动程序 V1.0
xjw01 于莆田 2011.10
**************************************/
//====================================
#define uchar unsigned char
#define uintunsigned int
#define ulongunsigned long
#include <reg52.h>
#include <math.h>
void delay(uint loop) { uint i; for(i=0;i<loop;i++); } //延时函数
void delay2(uint k){ for(;k>0;k--) delay(10000); } //长延时,k=100大约对应1秒
//========================AD转换=============================
sfr P1ASF = 0x9D; //将P1置为模拟口寄存器(使能),各位中为1的有效
sfr ADC_CONTR = 0xBC; //A/D转换控制寄存器
sfr ADC_res = 0xBD; //A/D转换结果寄存器
sfr ADC_resl= 0xBE; //A/D转换结果寄存器
void set_channel(char channel){
P1ASF = 1<<channel;
ADC_CONTR = channel+128; //最高位是电源开关,低3位通道选择
delay(1); //首次打开电源应延迟,使输入稳定
}
uint getAD2(){
ADC_CONTR |= 0x08; //00001000,置ADC_START=1启动A/D 转换
while ( !(ADC_CONTR & 0x10) ); //等待A/D转换结束(ADC_FLAG==0)
ADC_CONTR &= 0xE7; //11100111,置ADC_FLAG=0清除结束标记, 置ADC_START=0关闭A/D 转换
return ADC_res*4 + ADC_resl;
}
/*
uchar get_AD(){
ADC_CONTR |= 0x08; //00001000,置ADC_START=1启动A/D 转换
while( !(ADC_CONTR & 0x10) );//等待A/D转换结束(ADC_FLAG==0)
ADC_CONTR &= 0xE7; //11100111,置ADC_FLAG=0清除结束标记, 置ADC_START=0关闭A/D 转换
return ADC_res;
}
*/
uint getAD10() reentrant { //10次采样
char i;
uint c = 0;
for(i=0;i<10;i++) c += getAD2();
return c;
}
//============================EEPROW偏程=========================
sfr IAP_data= 0xC2;
sfr IAP_addrH = 0xC3;
sfr IAP_addrL = 0xC4;
sfr IAP_cmd = 0xC5;
sfr IAP_trig= 0xC6;
sfr IAP_contr = 0xC7;
/********************
写字节时,可以将原有数据中的1改为0,无法将0改为1,只能使用擦除命令将0改为1
应注意,擦除命令会将整个扇区擦除
*********************/
uchar readEEP(uint k){ //读取
IAP_addrL = k; //设置读取地址的低字节,地址改变才需要设置
IAP_addrH = k>>8; //设置读取地址的高字节,地址改变才需要设置
IAP_contr = 0x81; //设置等待时间,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前导1表示许档IAP
IAP_cmd = 1; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
IAP_trig = 0x5A;//先送5A
IAP_trig = 0xA5;//先送5A再送A5立即触发
return IAP_data;
}
void writeEEP(uint k, uchar da){ //写入
IAP_data = da; //传入数据
IAP_addrL = k; //设置读取地址的低字节,地址改变才需要设置
IAP_addrH = k>>8; //设置读取地址的高字节,地址改变才需要设置
IAP_contr = 0x81; //设置等待时间,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前导1表示许档IAP
IAP_cmd = 2; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
IAP_trig = 0x5A;//先送5A
IAP_trig = 0xA5;//先送5A再送A5立即触发
}
void eraseEEP(uint k){ //擦除
IAP_addrL = k; //设置读取地址的低字节,地址改变才需要设置
IAP_addrH = k>>8; //设置读取地址的高字节,地址改变才需要设置
IAP_contr = 0x81; //设置等待时间,1MHz以下取7,2M以下取6,3M取5,6M取4,12M取3,20M取2,24M取1,30M取0,前导1表示许档IAP
IAP_cmd = 3; //读取值1,写取2,擦除取3,擦除时按所在字节整个扇区撺除
IAP_trig = 0x5A;//先送5A
IAP_trig = 0xA5;//先送5A再送A5立即触发
}
xdata struct Ida{
char zo; //零点改正值
} cs;
void cs_RW(char rw){
uchar i,*p = &cs;
if(rw){
eraseEEP(0);
for(i=0;i<sizeof(cs);i++) writeEEP(i,p);
}else{
for(i=0;i<sizeof(cs);i++) p=readEEP(i);
}
}
/**********
字形编码图
32
-
64| | 128
-16
1| | 8
_. 4
2
**********/
uchar code zk={235,136,179,186,216,122,123,168,251,250}; //字库
uchar code zk2={241,25,11,233,27,50,155,107};//p,n,u,m,0,k,M,G
uchar disp={168,251,250}; char cx=-1; //显示缓存,cx光标位置
sfr P1M1=0x91; //P1端口设置寄存器
sfr P1M0=0x92; //P1端口设置寄存器
sfr P0M1=0x93; //P0端口设置寄存器
sfr P0M0=0x94; //P0端口设置寄存器
sfr P2M1=0x95; //P2端口设置寄存器
sfr P2M0=0x96; //P2端口设置寄存器
sfr P3M1=0xB1; //P3端口设置寄存器
sfr P3M0=0xB2; //P3端口设置寄存器
sbit ds3=P2^4; //数码管扫描口
sbit ds2=P2^5; //数码管扫描口
sbit ds1=P2^6; //数码管扫描口
sbit ds0=P2^7; //数码管扫描口
sbit spk=P2^3; //蜂鸣器
sbit Kb=P2^1; //量程开关B
sbit Ka=P2^2; //量程开关A
sbit DDS2=P1^2;//移相方波输出口
sbit K3=P1^7;
sbit K4=P1^6;
sbit K5=P1^5; //7.8kHz滤波开关
sbit K6=P1^4;
sbit K8=P2^0; //100Hz滤波开关
//==============字符显示函数====================
xdata uchar menu=1,menuB=1;
void cls(){ char i; for(i=0;i<6;i++) disp=0; } //清屏
void showDig(long f){ //显示数字
uchar i;
cls();
for(i=0;i<6;i++) { disp=zk, f/=10; if(!f) break; }
}
void showDig2(float f,char dw){ //显示浮点数
char i,b=0,b2=0,fh=0;
if(f<0) fh=1,f=-f;
for(i=0;i<3;i++){ if(f>=1000) f/=1000, b++;} //以3位为单位移动小数点,把大数转粉0至999,小数点在末字
for(i=0;i<4;i++){ if(f<1) f*=1000, b--;} //以3位为单位移动小数点,把小数转粉0至999,小数点在末字
for(i=0;i<3;i++){ if(f<1000)f*=10, b2++; } //对以于1000结果,连同小数点整体移位,使首位移到最左边
showDig(f);
disp += 4; //小数点
if(!dw) return;
disp = zk2;//显示单位
if(fh) disp += 4; //显示符号
}
//==============低频信号DDS====================
//PCA相关寄存器
sfr CMOD = 0xD9; //钟源选择控制等
sfr CH = 0xF9; //PCA的计数器
sfr CL = 0xE9; //PCA的计数器
sfr CCON = 0xD8; //PCA控制寄存器
sfr CCPAM0 = 0xDA; //PCA模块0工作模式寄存器
sfr CCPAM1 = 0xDB; //PCA模块1工作模式寄存器
sfr CCAP0L = 0xEA; //模块0捕获寄存器低位
sfr CCAP0H = 0xFA; //模块0捕获寄存器高位
sbit PPCA= IP^7; //PCA的中断优先级设置
sbit CCF0= CCON^0; //PCA的模块0中断标志
sbit CCF1= CCON^1; //PCA的模块1中断标志
sbit CR = CCON^6; //PCA计数器使能
void PWM_init(){ //把PCA置为PWM
CMOD = 2; //0000 0010 计数源选择,钟源取fosc/2
CL = CH = 0;
CCAP0L = CCAP0H = 192; //占空比为25%
//CCPAM0=0x42;//0100 0010,PCA的模块0设置为PWM模式,无中断
CCPAM0=0x53;//0101 0011,PCA的模块0设置为PWM模式,有中断,下降沿中断
PPCA = 1; //优先中断
//CR = 1; //开始计数
EA = 1; //开总中断
}
uint ph=0, phM=256, feq=1000; //相位,phM相位步进值
uchar code sinB={
//查询表中不可装载零值,否则会造成无中断产生
255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,245,243,242,240,239,237,236,234,232,230,229,227,225,222,220,
218,216,214,211,209,206,204,201,199,196,194,191,188,185,183,180,177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131,
128,125,122,119,116,112,109,106,103,100, 97, 94, 91, 88, 85, 82, 79, 76, 73, 71, 68, 65, 62, 60, 57, 55, 52, 50, 47, 45, 42, 40,
38, 36, 34, 31, 29, 27, 26, 24, 22, 20, 19, 17, 16, 14, 13, 11, 10,9,8,7,6,5,4,4,3,2,2,1,1,1,1,1,
1,1,1,1,1,1,2,2,3,4,4,5,6,7,8,9, 10, 11, 13, 14, 16, 17, 19, 20, 22, 24, 26, 27, 29, 31, 34, 36,
38, 40, 42, 45, 47, 50, 52, 55, 57, 60, 62, 65, 68, 71, 73, 76, 79, 82, 85, 88, 91, 94, 97,100,103,106,109,112,116,119,122,125,
128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174,177,180,183,185,188,191,194,196,199,201,204,206,209,211,214,216,
218,220,222,225,227,229,230,232,234,236,237,239,240,242,243,245,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255
};
uchar code fbB={ //方波DDS查询表
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
};
uchar chuX=0; //方波DDS初相
void PCAinter(void) interrupt 7 {//PCA中断
uchar x,y;
CCF0=0; //清除中断请求,以免反复中断
x = ph >> 8; //截断正弦相位累加器,取高8位
y = x + chuX; //方波相位
CCAP0H = sinB;//正弦DDS输出
DDS2 = fbB; //方波DDS输出
ph += phM; //相位累加
}
void setDDS(uint f){ //参考时钟是c=(fosc/2)/256=32000000/2/256=62500,频率f=c*phM/2^16
feq = f;
phM=f*65536.0/62500; //phM=f*2^16/62500
ph = 0; //高频时,使波形对称
if(!f) CR=0; else CR=1;
}
//相位控制函数
xdata char xw=0; //相位
void set90(char k){ //设置方波的相位差
k %= 4;
if(k<0) k += 4;
if(k==0) chuX=0; //移相0度
if(k==1) chuX=128; //移相180度
if(k==2) chuX=64;//移相90度
if(k==3) chuX=192; //移相270度
xw = k;
}
void set902() { set90(xw+1); } //相位步进
//==============量程控制函数====================
xdata char rng=1; //量程
void setRng(char k){//切换量程
if(k==0) Ka=0,Kb=0; //100欧
if(k==1) Ka=0,Kb=1; //1k欧
if(k==2) Ka=1,Kb=0; //10k欧
if(k==3) Ka=1,Kb=1; //100k欧
rng = k;
}
void setRng2(){ setRng( (rng+1)%4); } //量程步进
//==============增益控制函数====================
float gain={1,3,10,30};//增益表
char curGain=1; //当前增益索引号
void setGain(char k){ //设置电路增益
if(k>3) k=3;
if(k<0) k=0;
if(k==0) K4=0,K6=0; //1倍
if(k==1) K4=0,K6=1; //3倍
if(k==2) K4=1,K6=0; //10倍
if(k==3) K4=1,K6=1; //30倍
curGain = k;
}
void setGain2(){ setGain((curGain+1)%4); }
//==============设置频率====================
uchar mT = 6; //测量速度
void setF(char k){
if(k==-1){ //步进
k = 0;
if(feq==100)k=1;
if(feq==1000) k=2;
if(feq==7813) k=0;
}
if(k==0) { setDDS(100); K5=0; K8=1; mT=15; } //置为100Hz
if(k==1) { setDDS(1000);K5=0; K8=0; mT=6;} //置为1kHz
if(k==2) { setDDS(7813);K5=1; K8=0; mT=6;} //置为7.8125kHz
}
//==============LCR测量====================
xdata int Vxy={0,0,0,0};//Vxy
xdata char Vga={1,1,1,1}; //上下臂增益记录表
xdata uchar tim=0,tims=0;
xdata char pau=0; //暂停坐标自动旋转
int Vfull = 9500;
code float dwR={20,1000,10000,100000}; //档位电阻表
int absMax(int a,int b){
a=abs(a);
b=abs(b);
if(b>a) a=b;
return a;
}
void timerInter1(void) interrupt 3 {//T1中断
char a,g; int c;
static int Ve0=0;
if(pau) return;
tims++;
if(tims>=mT){ //tim进位触发
tims = 0, tim++;
if(tim>=8) tim=0;
a = tim/2; //x1,y1,x2,y2指针
c = getAD10() + cs.zo;//读取电压值
if(tim%2){
if(Ve0>c) Vxy = Ve0; //保存当前电压
else Vxy = -c;
Vga = curGain; //保存当前增益
}else Ve0 = c;
if(tim==3||tim==7){ //上下臂切换
//电压模值才能反应运放的输出幅度,所以增益切换判断得用模值
if(tim==3) K3=1, c = absMax(Vxy,Vxy), g=Vga; //切换到下臂
if(tim==7) K3=0, c = absMax(Vxy,Vxy), g=Vga; //切换到上臂
//切换后一定要设定一个g值,不论c为何值
setGain(g);
if(c>Vfull) setGain(g-1);
if(c<Vfull/33*10) setGain(g+1);
if(c<Vfull/33*3)setGain(g+2);
if(c<Vfull/33*1 ) setGain(g+3);
}
set90(tim+1); //相位旋转
}
}
char sfdw=1; //是否显示单位
void showR(char xm){ //显示电阻
xdata float a,b,c,e,bs;
xdata float x1 =Vxy/gain];
xdata float y1 =Vxy/gain];
xdata float x2 = -Vxy/gain];
xdata float y2 = -Vxy/gain];
bs = dwR;
a = x2*x2+y2*y2;
b = x1*x2+y1*y2;
c = x2*y1-x1*y2;
if(!a) { cls(); disp=115;disp=disp=97; return; }
if(xm==0){ showDig2(c/a*bs,sfdw); }//显示X值
if(xm==1){ showDig2(b/a*bs,sfdw); }//显示R值
if(xm==2){ showDig2(c/a*bs / 6.283/feq, sfdw); }//显示L值
if(xm==3){ showDig2(a/c/bs / 6.283/feq, sfdw); }//显示C值
if(xm==4||xm==9){ //显示Q值
if(!b) { showDig(9999); return; }
c = fabs(c/b);
if (c>=1000) { showDig(999 ); }
else if(c>=100 ) { showDig(c ); }
else if(c>=10) { showDig(c*10);disp += 4; }
else if(c>=1 ) { showDig(c*100 );disp += 4; }
else { showDig(c*1000);disp += 4; }
}
e = (b*b+c*c)/a;
if(xm==5){ showDig2(e/c*bs,sfdw); }//显示并联X值
if(xm==6){ showDig2(e/b*bs,sfdw); }//显示并联R值
if(xm==7){ showDig2(e/c*bs / 6.283/feq,sfdw); }//显示并联L值
if(xm==8){ showDig2(c/e/bs / 6.283/feq,sfdw); }//显示并联C值
}
//void timerInter(void) interrupt 1 {}//T0中断
void showMsg(uchar a){ //临时跳出信息
P0 = ~a;
ds0=1, ds1=ds2=ds3=0;
delay2(50);
}
main(){
uchar i=0,kn=0,key=0;
uchar dispN=0; //显示扫描索引
uchar spkN=0;//蜂鸣器发声时长
uchar nn=0;
uchar XRQ=1;
delay2(40); //启动延时
cs_RW(0); //读EEPROM
TCON=0, TMOD=0x12; //将T0置为自动重装定时器,T1置为定时器
TH1 = 47, TL1 = 171; //20ms秒定时
TR1=1;//T1开始计数
TR0=0;//T0暂停计数
ET1=1;//T1开中断
ET0=1;//T1开中断
EA=1; //开总中断
PT0=1;//设置优先级
set_channel(0); //设置AD转换通道
P2M0 = 0xFF; //P2.01234567置为推勉输出
P1M0 = 0xFC; //P1.234567置为推换口
P1M1 = 0x03; //P1.0置为高阻抗
//请注意启动延时0.5秒方可读取cs_RW
//cs_RW(0); //读取比值基数(调零时已做开机延时,确保电压上升到可读取EEPROW)
PWM_init();//DDS初始化
set90(2);//初始设置相位
setRng(1); //初始设置量程
setGain(1); //初始设置增益
setF(1); //DDS初始设置为1kHz
while(1){
//显示disp
nn++;
dispN=(++dispN)%4; //扫描器移动
ds0=ds1=ds2=ds3=0;
if(dispN==0) ds0=1;
if(dispN==1) ds1=1;
if(dispN==2) ds2=1;
if(dispN==3) ds3=1;
P0=~disp; //显示
//扫描键盘
//键盘响应
//key = (~P3)&0xfc;
key = ~P3;
if(key&&kn<255) kn++; else kn=0;
for(i=0;key;i++) key/=2; key=i;
if(kn==20) spkN=50; else key=0; //当按下一定时间后,key才有效,否则无效。spkN发声时长设置
if(spkN) spkN--, spk=0; else spk=1; //键盘发声
//菜单系统
if(key==8 && menu) { menuB=menu, menu=0; key=0; XRQ=-1;} //菜单键
if(key==7 && menu) setRng2(); //量程步进
if(key==6 && menu) setF(-1);//设置频率
if(menu==0){ //显示量程和菜单
showDig(menuB);
if(key==8) menu = menuB;
if(key>=1 && key<=7) menu = key;
key = 0;
}
if(menu==1||menu==2){ //自动LCR测量(串联)
pau = 0;
if(XRQ==-1) XRQ=1, sfdw=1;
if(key>=1&&key<=5){ //扩展一位显示
if(key-1==XRQ) { if(sfdw==0) sfdw = 1; else sfdw = 0; }
else sfdw = 1;
XRQ = key-1; //X,R,L,C,Q
}
if(key>=1&&key<=5) XRQ = key-1; //X,R,L,C,Q
if(menu==1) showR(XRQ);
else showR(XRQ+5);
}
if(menu==3){ //手动调试
pau = 1;
if(key==1) { setGain2(); showMsg( zk );} //增益控制
if(key==2) { };
if(key==3) { K3=~K3; showMsg(zk); } //切换上下臂
if(key==4) { set902(); showMsg(zk); } //相位旋转
if(nn%64==0) showDig( getAD10());
}
if(menu==7){ //设置零点偏移数
if(key==1) cs.zo += 5; //X键加5
if(key==2) cs.zo -= 5; //R键减5
if(key==3) cs_RW(1); //L键保存
if(key==4) cs.zo = 0;//C键清除
showDig(abs(cs.zo));
disp += 4;
if(cs.zo<0) disp = 16;
}
delay(4000);
}//while end
} 钦佩洞洞板的手功,看过LZ在矿石收音机的文章.肯定是非常热爱电子的爱好者. 在一乐看过这篇,好东西狂顶 看这个贴子,能学习到很多知识,感谢楼主。 强贴。 标志一下 牛人 mark mark 看这个贴子,能学习到很多知识,感谢楼主。 mark 新版本:
点击此处下载 ourdev_695598HUDWPV.rar(文件大小:170K) (原文件名:程序.rar) mark mark lz可以考虑出套件或组装好的套件。再加个盒子就更好了,以前本坛一位大侠用avr单片机做的元器件参数测试盒就很不错。 真是酷呀 看上去非常不错! 顶------做个标记! max 支持LZ出套件! mark mark mark 哎哟,这个估计可以置个酷了! 厉害的家伙,佩服!./emotion/em205.gif 回复【楼主位】xjw01
-----------------------------------------------------------------------自己想做一个,估计改成贴片效果会更好 新版本
改进了校准方法
ourdev_700604YH2UZT.rar(文件大小:187K) (原文件名:程序.rar) •本LCR表的基本特性
AD转换器的字数:约1000字,采用了过采样技术,有效分辨力约为2000字
测量方法:准桥式测定,测量原理类似于比例法测电阻。
主要测量范围:1欧至0.5兆欧,精度0.5%(理论),阻抗实测比对,均未超过0.3%
有效测量范围:2毫欧至10兆欧,最小分辨力1毫欧
串联残余误差:2毫欧,低阻测量时此误差不可忽略
并联残余误差:50M欧,高阻测量时此误差不可忽略
Q值误差:±0.003(Q<0.5),Q/300(Q>2,相对误差,简易算法),其它按0.5%左右估算
D值误差:±0.003(D<0.5),D/300(D>2,相对误差,简易算法),其它按0.5%左右估算
注意:Q = 1/D
测试信号幅度:峰值200mV(100Hz),180mV(1kHz),140mV(7.8kHz)
电感:0.02uH分辨力,测量范围0.1uH至500H,超出500H未测试(因为我没有更大的电感器)。
电容:分辨力与夹具有关。夹具好的话,分辨0.1pF或0.05pF,不屏蔽只能分辨到0.2pF,甚至只有1pF。上限测量,没有测试,只测过10000uF电容,手上没有更大的电容。
实测误差,比上述精度指标好许多。
本表基准源:分别为4个基准电阻,一个时间基准。电阻基准就是电桥的4个下臂电阻,要求精度达到0.1%,对1%精度的金属膜电阻筛选即可。时间基准用32MHz石英晶振得到,精度可以满足电桥要求的。如果电阻达不到要求,可以使用软件校准。
频率精度:实际频率为99.18Hz、999.45Hz、7812.5Hz,简写为(100Hz、1kHz、7.8kHz)。由于DDS的频率分辨力有限,所以不采用整数频率。频率精度约为0.02%(由石英晶振决定)。
信号源失真度:没有专用仪器测试,只做估测。对输出信号做一次高通滤波后,用示波器观察,未发现可觉察失真。如果有可觉察失真,对D值测量有小量一些影响。 高手啊!记号 顶------做个标记! mark 支持给裤子 校准这个LCR表,全部用电阻实现校准。
建议找一些高Q电容,作为佐证元件,以验证是否存在校准失误。
220pF以下的独石电容,Q值可高达3000(500kHz频率下,用Q表测得),在这个LCR表中,显示为500至999(往往跳变的)
小于50pF的电容,本表无法有效测量它的Q值。
用10个220pF并联,可以得到2.2nF的高Q电容。
可以使用军机空气可变电容作为左证测试。军机可变Q值一般在10000至10万。在本LCR表中测试,须使用300pF以上的。过小容易,会受到干扰,因为军机可变体积大。
高压CBB22电容,如470n/630V,1uF/630V,Q值也比较高,须测到500以上。品牌开关电源上的MPX-X2电容,Q值也不错。
如果有Q表,可以利用Q表,测定字在500Hz测出它的ESR,然后也可以估计算这种电容的性能,用于LCR表验证。
测量无极性介质的电容(涤纶电容不行),用100Hz、1kHz、7.8kHz三档测量,容量应基本不变,Q值也高。小容量的瓷片电容属于这类电容。
绕一个几十uH的空心线圈,用1平方毫米的柒包线纸在110PVC管上。测得电感量,不同频率下应相同。在1kHz下,测得的ESR须等于直流电阻,7.8kHz测得ESR会比直流电阻大10%,这就正常了。
用铁硅铝磁环绕线圈,不同频率下,电感量也应其本不变。
也就是说,用色环电阻进行幅相校准之后,再用电容或电感验证,如果验证结果满足上述情况,说明这个LCR表Q值(或D值)的精度达到设计要求了。
如果关键电阻达标,无需地行幅值校准的。 中Q验证比较简单:
取一个高Q电容,如CBB22 高压电容,如果容抗100欧,串联一个100欧电阻,也应测得100欧ESR,说明正交分离良好,D或Q值精度良好。
涤纶电容也行,与电阻串联之后,总ESR = 电阻+涤纶电容的ESR
也可以用电感与电阻串联实现。
电感最好使用空线圈,不可使用磁环。如果非要用磁环,请使用铁硅铝磁环。 学习了,有时间DIY 当时我就吓傻了。。。。 点击此处下载 ourdev_702090UUPR9S.rar(文件大小:271K) (原文件名:程序.rar) 经过反复测试,基本确定这个电桥可以达到0.3%精度。
实测误差总是小于0.2%
要达到这个精度,需要进行逐档校准。不进行逐档校准,精度按0.5%
要达到0.3%精度,须进行幅值校准6个档,即20欧、1k、10k、100k及3倍增益档、9倍增益档。
相位档位至少需要校准三个档位:100k档、3倍增益档、9倍增益档
•设计目标:
1、能够准确测量电抗器的L、C、R,精度优于0.5%,如果进行人工逐档校准,精度优于0.3%
2、取材容易,电路简洁,易于制作,成本应适当控制。使之具有更强的业余DIY价值及研究价值,并通过设计、DIY学习到LCR电桥的相关细节、原理。
•本LCR表的基本特性
AD转换器的字数:约1000字,采用了过采样技术,有效分辨力约为2000字
测量方法:准桥式测定,测量原理类似于比例法测电阻。
主要测量范围:1欧至0.5兆欧,精度0.5%(理论),阻抗实测比对,均未超过0.3%
有效测量范围:2毫欧至10兆欧,最小分辨力1毫欧
串联残余误差:2毫欧,低阻测量时此误差不可忽略
并联残余误差:50M欧,高阻测量时此误差不可忽略
Q值误差:±0.003(Q<0.5),Q/300(Q>2,相对误差,简易算法),其它按0.5%左右估算
D值误差:±0.003(D<0.5),D/300(D>2,相对误差,简易算法),其它按0.5%左右估算
注意:Q = 1/D
测试信号幅度:峰值200mV(100Hz),180mV(1kHz),140mV(7.8kHz)
电感:0.02uH分辨力,测量范围0.1uH至500H,超出500H未测试(因为我没有更大的电感器)。
电容:分辨力与夹具有关。夹具好的话,分辨0.1pF或0.05pF,不屏蔽只能分辨到0.2pF,甚至只有1pF。上限测量,没有测试,只测过10000uF电容,手上没有更大的电容。
实测误差,比上述精度指标好许多。
本表基准源:分别为4个基准电阻,一个时间基准。电阻基准就是电桥的4个下臂电阻,要求精度达到0.1%,对1%精度的金属膜电阻筛选即可。时间基准用32MHz石英晶振得到,精度可以满足电桥要求的。如果电阻达不到要求,可以使用软件校准。
频率精度:实际频率为99.18Hz、999.45Hz、7812.5Hz,简写为(100Hz、1kHz、7.8kHz)。由于DDS的频率分辨力有限,所以不采用整数频率。频率精度约为0.02%(由石英晶振决定)。
信号源失真度:没有专用仪器测试,只做估测。对输出信号做一次高通滤波后,用示波器观察,未发现可觉察失真。如果有可觉察失真,对D值测量有小量一些影响。
•特点:
将正弦信号发生器、AD转换器、0度方波、90度方波全部利用单片机完成,电路大大简化,而性能可以满足一般要求。这使得仿制者更容易,更适合作为DIY仪表。 本版提供了源程序。
也提供了PCB文档,但不保证是正确的。因为,我没有打样试验过。所以,如果要打样,请自行检查是否有误。
PCB设计是简易的,如果要做成台式铝壳表,这样的PCB设计对不住铝壳表的。
如果采用铝壳表,性能会提升的,这时候,要把单片机与模拟电路分开,并对单片机独屏蔽,减小谐波干扰,其二,那个TL082要用两个TL081代之,其三,模拟电路中的3倍、9倍放大器、信号源,建议屏蔽,也可以采用广义屏蔽,即把它们之间的距离拉远一些。做好这些工作,噪声会减小很多倍,就象高级音响那样,几乎听不到噪声的。这些工作不做,只相当于音响技术中的几十元的“随身听”水平。
高噪声情况下,对1pF以下的电容容量测量是有影响的,对100pF以下电容Q值测定也是有严重影响的。
如果7.8kHz下,测量5pF电容,容量跳动正负0.05pF,说明噪声对虚轴引入0.05pF的等效干扰,相当于300M至400M欧的干扰,这时,对实轴也同样会引入300M欧至400M欧的干扰。如果按绝对跳动范围来计算,相当于引入了150M欧的不确定电阻,这时候,ESP最大有效测量必须远小于150M,顶多测量到50M欧(取1/3)。对于5pF电容,容抗约3至4兆欧左右,那么,有效测量5p的Q值,只能达到50/4=12Q,这是严重失真的。
几个pF到几十pF的电容的Q值,在这样的PCB设计是测不了的 新版本:LCD加入了开路清零功能,可以测量20pF电容的Q值。
几十pF电容的Q值非常高,在电桥中一般显示值为300至999(本表显示值上限),用高频Q表测量这些电容的Q值,通常在1000以上。LCR表测值与Q表测值相对一致。不过,Q表测量时,我一般采用500kHz左右测量。
点击此处下载 ourdev_702841SDAI5L.rar(文件大小:272K) (原文件名:程序.rar) 强 顶一个!!! MARK 数字电桥
MARK LCR电桥 LZ牛!膜拜!学习 相当不错,出套件吧。 看到楼主用STC自带的ADC偶就笑了
STC是一款没有基准的片子,用的是电源来作为ADC基准,楼主谈何精度? 自由轴方法(vector ratio detector),虽然它是使用比例法.若是谈确实的精度,不能确定LS无理由. mark mark!!!! 不错 mark~~~ mark 牛贴'顶起来 丁页 牛人啊
能出套件就好了 xjw01大大,我从矿坛顶你到38度,再到这里,唉,千山万水啊。./emotion/em055.gif 牛人啊
谢谢分享 mark 记号 强帖留名 新版本
点击此处下载 ourdev_704435Q2LQ04.rar(文件大小:274K) (原文件名:程序.rar) 楼主路上新版有哪些改进? 1、在放大器中加了一级滤波器,提升D值测量精度。
2、信号源限流电阻加大一些,以方便校准。
加大限流电阻之后,高阻抗测量的精度下降了一些。
高阻测量,通常不需要高精度,所以做了取舍。
比如,测量10pF电容,测得10.05p还是10.10,其实没有多大区别
3、LCD1602版,加入了开路清零工能。这样,20pF至100pF电容的Q值或D值测量结果,也有一定的可信度。
不过,5pF至100pF电容,通常都是高Q电容,Q值一般是大于500的,这个LCR表实际上测不了,显示值一般在100至999之间跳动。容量越大,跳得越少。
4、增益档位全部改为3倍关系,以简化程序,程序运行更可靠
5、7.8kHz带通滤波器改为低阻抗的,以减小附加耦合造成精度损失
以上所有改进,目标是使主量程范围内(0.5欧至200k)的测量精度达到0.3%,D值精度达到0.003
有得有失,改了之后,高阻测量变差一点。
1M欧以下的精度实际上也达到0.5%
高Q测量是跳动的,读个估值即可。D值0.003的LCR表,它的Q值有效测量只能达到300,大于300的,只能认为被测元件Q值很大,具体值是多少,那是不明确的。所以跳与不跳,是无所谓的。
调试中,D值要挣取达到设计目标。这样,LCR表相对于LC表的长处才能充分体现。
1、请根根据说明书,利用电阻校准相位。
2、寻找或DIY一些标准器件,验证Q值或D值精度
DIY器件的方法很多,举几个例子:
1、用1寸管绕线圈,漆包线0.38mm,平线60圈。这样得到的电感,在7.8kHz时,理论上交流电阻只比直流电阻大了0.1%
这样,在7.8kHz上测得的电阻与100Hz上测得的电阻的一至性,就反应了该量程档位的D值精度
大于0.38mm的线,临近效应比较明显,7.8kHz时交流电阻会变大一点。
2、用同轴电缆制作电容,可以得到Q值大于1000的电容,用它做相位参考。用于验证小容量电容(如10pF以下)
电缆不要太长。太长会引入较多干扰。
3、用CBB/630V电容,验证。在7.8kHz,它的Q值一般大于1000,会超出表本量程
4、用10个200pF独石电容并联,它的Q值也是超高。单个200pF,也是高Q
不要用CL电容
涤纶电容Q值低,7.8kHz时,Q值只有100多,无法用来做相位基准。
不要试图用电容与电阻串联来验证D值精度。没有多大意义。这种验证方法是:Rs = 电容Rs + 电阻
满足上式,认为D值正确。实际上,这样是不行的。因为,LCR表存在相位误差时,这个误差可能同时在于Rs 和 电容Rs中产生,所以LCR表有相位误差时,上式一般也是成立的。当然,没有相位误差的LCR表,当然也会得到Rs = 电容Rs + 电阻 mark 矿坛看过,很好,低成本,爱好者适合DIY用 Mark 新版程序。
本版做了重要改进。
由于对器件差异性考虑不足,会造成有的人调试失败。
本版做了改进。R37由原来的10欧换为20欧
点击此处下载 ourdev_708067LF8N5Z.rar(文件大小:276K) (原文件名:程序.rar) 果断顶翻 mark之~~ mark 谢谢分享 mark 楼主,弄成套件,做这个怕的就是那个电阻不好找,统一采购,价格合算一点。 mark,
顶一下。 MARK 强烈要求楼主出套件 点击此处下载 ourdev_713357OMLUVK.rar(文件大小:277K) (原文件名:程序.rar)
此版本,与精密电桥比对,一般只要差0.1%,相差0.2%的很少。
误差标定为0.3% 注意频率修正菜单Menu+F。
默认修正了0.06%
晶振频率准确的话,修正量应置0 是21ic的洗碗机? 祝贺许老师的大作(数字电桥)获奖! mark 祝贺许老师的大作(数字电桥)获奖! 学习了,谢谢,资料很完整。 mark mark做个记号 mark mark mark 祝贺许老师的数字电桥获矿坛一等奖! mark 看了之后收获颇多!!!为楼主严谨的精神所折服!!! mark 记号。
没有看到电路图相应的改进? 这个必须要顶! 回复【楼主位】xjw01
-----------------------------------------------------------------------
mark
页:
[1]
2