《大学生电子设计竞赛黑龙江赛区简易RLC测量仪.doc》由会员分享,可在线阅读,更多相关《大学生电子设计竞赛黑龙江赛区简易RLC测量仪.doc(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、简易LCR测量仪摘要:系统是通过STC89C52测量电阻、电容和电感对应振荡电路所产生的频率来实现各个参数的测量。其中电阻采用AD转换待测电阻与标准电阻的分压进行测量,电容是采用555 多谐振荡电路产生的,而电感则是根据LC振荡回路产生的。STC89C52的定时器可以利用外部时钟源来计数,文章将RLC 测量电路产生的频率作为单片机STC89C52的时钟源,通过计数可以计算出被测频率,再通过该频率计算出各个参数。该系统采用单片机控制,具有测量精度高,便于使仪表实现自动化。关键词:NE555、LC振荡回路、AD转换、一、 设计任务:即题目的要求设计并制作简易电阻、电容、电感、品质因数和损耗系数测量
2、仪,其结构框图如图1所示。图1测量仪框图1 基本要求(1)测量电阻围:100W1MW,测量精度:;(2)测量电容围:1000pF0.1mF,测量精度:;(3)测量电感围:1mH100mH,测量精度: ;(4)可使用按键设置被测器件的类型和单位,并显示;(5)自制满足本测量仪要求的电源。2. 发挥部分(1)扩展量程,并提高测量精度。. 测量电阻围:10W10MW,测量精度:;. 测量电容围:100pF1mF,测量精度:;. 测量电感围:100mH1H,测量精度: ;(2)测量电感的品质因数Q,测量围:1.0999.9,测量精度:;(3)测量电容的损耗系数D,测量围:0.0019.999,测量精度
3、:;(4)具有三个可选的测试频点:100Hz,1kHz,10kHz;(5)其它(如自动识别器件类型、量程自动转换等)。二、 方案论证:.电桥法:具有较高的测量精度,被广泛采用,现已派生出许多类型。但电桥法测量需要反复进行平衡调节,测量时间长且数据为非线性变化,,很难实现快速的自动测量。.谐振法:要求较高频率的激励信号,通过对信号频率的测量,结合相应计算公式,计算出电容电感的取值。.伏安法:最经典的方法,它的测量原理来源于阻抗的定义。即若已知流经被测阻抗的电流相量并测得被测阻抗两端的电压,则通过比率便可得到被测阻抗的相量。显然,要实现这种方法,仪器必须能进行相量测量与除法运算.但采用的自由轴法由
4、于硬件电路过于复杂,硬件调试过难,且原理复杂不以计算,难以实施。电容的测量方法较多,如电桥法、阻抗法等。电桥法精度高,但电路复杂且测量时还需要调节电桥平衡,不利于实现全自动的智能化控制,阻抗法需要低失真的正弦波和高精度的 ,而且计算较为复杂。电阻的测量方法有电流法、分压法等,这些方法的精度变化大。若要较高的精度,必需较大的量程,且电路复杂。同样,在测量电感时电桥法和相位法也不宜采用。数字 测量仪的数字化程度并不高 ,其参量分离是靠同步检波器实现的。随着单片机技术的发展,单片机在智能化测量仪表中的应用越来越广泛。本文所设计的 测量仪是把 作为谐振电路中的一个元件,当阻抗值变化时谐振电路的输出频率
5、将随着改变,在单片机系统建立了频率阻抗对照表数据库,从测得的频率值直接查表可获得元件的阻抗值并显示。利用本系统强大的微处理器功能,对小阻抗元件和大阻抗元件能进行自动识别,实现测量档位的自动切换和准确测量。三、 分析与计算:f1f3电阻前端测量电路电感前端测量电路电容前端测量电路与标准电阻的分压经AD芯片模数转换LC振荡回路经电压比较器NE555谐振电路STC89C52LCD显示屏STC89C52STC89C52电源f2量程切换量程切换流程图如上图。测量电阻采用电阻分压方法进行测量。通过测量标准电阻与待测电阻的电压,并经14位高精度AD对电压进行模数转换。 U0 R0 Ux Rx记标准电阻的前端
6、电压为U0,待测电阻的前端电压为 Ux,则电阻R=UxR0/U0-Ux。电容测量电路如下图。200电容的测量也采用脉冲计数法,如图4 所示。由555 电路构成多谐振荡器,通过计算振荡输出的频率来计算被测电容的大小。555 接成多谐振荡器的形式,其振荡周期为:T = t1 + t2 = ( ln2) ( Ri + R6) Cx + ( ln2) R6Cx电路分为5档:通过对IO1IO5分别加高电平以达到切换量程的功能。电容越大电阻Ri越小。电路是一个由LM393(U3A)组成的LC振荡器。由单片机测量LC震荡回路的频率F1,然后控制继电器K2将标准电容C2与C1并联,测出振荡器频率F2,再用下列
7、式子计算出电感L1的值。 这里电容器C2的容量的精确程度,基本上决定了整个测量过程的精度。应该选用稳定性好精度高的电容器,这个制作选用了1800pF的云母电容器。上述过程可称作为一个校准过程,由单片机控制每次开机时自动完成。开机后延时3秒,测量由U1A、L1、C1组成振荡器频率F1; K2吸合,C2接入延时3000ms,测量振荡器频率F2, K2断开。单片机算C1、L1完成后按S1进入电容Lx的测量状态。电感Lx的值,分别用下列式子计算: 四、 测试:测量电阻采用RLC测量仪TH2817进行测量,以作为待测元件的标称值。测量表格如下。电阻测量标称值测量值误差512.5501.12.2%9.81
8、k10.01k2%109.58k100.3k6%1.12M1.21M8.03%电容测量标称值测量值误差29460 pF26365 pF10.5%954.7pF1133 pF18.7%10040 pF10171 pF1.3%2374 pF2530 pF6.6%4612 pF5061 pF9.7%16264 pF16514 pF1.5%电感测量标称值测量值误差4.76mH4.55mH4.4%9.84mH9.21mH6.4%五、结论、心得体会按照题目要求的容进行设计的电路,经加工焊接得到的成品经调试测量基本能够满足基本要求。心得体会:第一,我把课本上学到的东西运用到实际的项目中了,真正的将理论知识与
9、实际相结合,在科技实践设计过程中对理论知识有了更加深度的认识,提示提升了实际应用中的兴趣,使电子设计更加有趣。同时有理论知识的支持,对于各类电路和芯片功能与原理能够更加简单明晰的了解清楚,使理论真正的成为实践的强力工具。第二,在这个过程中也让我学会了做事必须严谨、认真。对于电路设计过程中以与程序编写过程中不容有半点马虎,否则每一个微小的错误都会为调试工作带来巨大的障碍、消耗大量的时间。第三,认识到了团队精神的重要性,对于一个团队而言,最重要的就是队员之间的相互配合。团队工作的合理分配,意见的统一实施,矛盾的合理调解,都是保持一个团队高效协作与完美实现目标的必要条件。附件:电感测量电路电容测量电
10、路电阻测量电路元件名称元件型号数量电阻芯片STC89C522芯片NE5551芯片LM3861芯片TLC25431显示屏1602A1开关-4变压器18V1电容-若干电阻-若干电感-若干原程序:#include#include#include#include#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit k1=P16;sbit k2=P17;uint T0count,timecount,flag,num,n,f=0,th1,tl1,flag1,f1=0,f2=0;ulong c;
11、float c1,l1;/uchar table1=F=;uchar temp=000000 ;sbit rs=P20;sbit rw=P21;sbit en=P22; void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-); void write_(uchar )rs=0;rw=0;en=0;P0=;delay(5);en=1;delay(5);en=0; void write_dat(uchar dat)rs=1;rw=0;en=0;P0=dat;delay(5);en=1;delay(5);en=0;void init() uc
12、har i;write_(0x38);write_(0x0c);write_(0x06);write_(0x01);/write_(0x86);/*for(i=0;i3;i+)write_dat(table1i);delay(5); */void display( uchar i) uchar code table=0123456789 ; /init();/ delay(1); tempnum=tablei; num+; write_dat(tablei) ; delay(20); while(n!=0xf0) n=P1; n&=0xf0; ; void DisChar(uchar a,uc
13、har b) write_(a); display(b); void main(void) TMOD=0x15;/0001 0101 TH0=0; TL0=0; TH1=(65536-49989)/256; TL1=(65536-49989)%256; ET0=1; ET1=1; EA=1; TR1=1; TR0=1;init();flag1=1;k1=1;k2=1;while(1)if(flag=1)flag=0; /*DisChar(10+0x40,f%10);f /= 10;DisChar(9+0x40,f%10);f /= 10;DisChar(8+0x40,f%10);f /= 10
14、;DisChar(7+0x40,f%10);f /= 10;DisChar(6+0x40,f%10);f/= 10;DisChar(5+0x40,f%10);f /= 10;DisChar(4+0x40,f%10);f /= 10;DisChar(3+0x40,f%10);f /= 10;delay(20);*/write_ (0x80+0x40+4); if(flag1=1) delay(50); delay(2000); f1=th1*256+tl1; f1=f1-f1*0.0792; f1=100*f1; k2=0; delay(2000); f2=th1*256+tl1;f2=f2-f
15、2*0.0792;f2=100*f2;flag1=0;c1=f2*f2*1.0*0.6/(f1*f1-f2*f2) ;l1=1.0/(4*3.141593*f1*f1*c1);k2=1;k1=0; f1=0;/f2=0;delay(2000); f=th1*256+tl1; f=f-f*0.0792; display(f/10000);display(f%10000/1000);display(f%10000%1000/100);display(f%10000%1000%100/10); display(f%10000%1000%100%10); write_(0x80+4); /c=00.0
16、/(log10(2)*f*39760); / c=36285000/f;/write_(0x38);/*k2=0;delay(2100);f2=th1*256+tl1;f2=f2-f2*0.0792;f2=f2*100; */c=(f*f*1.0/f2*f2-1)*l1;c=c*1000;/k2=1; display(c/10000);display(c%10000/1000);display(c%10000%1000/100);display(c%10000%1000%100/10); display(c%10000%1000%100%10);/f=0; /*void t0(void) in
17、terrupt 1 using 0/计脉冲个数 T0count+; */ void t1(void) interrupt 3 using 0 /定时1s TH1=(65536-50045)/256; TL1=(65536-50045)%256; timecount+; if(timecount=20) th1=TH0; tl1=TL0; TH0=0; TL0=0; T0count=0; /TR0=0; /TR1=0; timecount=0; flag=1; #include#include#include#include#define uchar unsigned char#define u
18、int unsigned int#define ulong unsigned longuint T0count,timecount,flag,num,n,f=0,th1,tl1,d=1;unsigned long c;uchar table1=F=;uchar temp=000000 ;sbit rs=P20;sbit rw=P21;sbit en=P22;sbit s0=P10;sbit s1=P11; void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-); void write_(uchar )rs=0;rw=0;en=0;P0
19、=;delay(5);en=1;delay(5);en=0; void write_dat(uchar dat)rs=1;rw=0;en=0;P0=dat;delay(5);en=1;delay(5);en=0;void init()uchar i;write_(0x38);write_(0x0c);write_(0x06);write_(0x01);/write_(0x86);/*for(i=0;i4)d=0;write_(0x80+1);delay(50);display(d); while(s1=0); if(flag=1)flag=0; /*DisChar(10+0x40,f%10);
20、f /= 10;DisChar(9+0x40,f%10);f /= 10;DisChar(8+0x40,f%10);f /= 10;DisChar(7+0x40,f%10);f /= 10;DisChar(6+0x40,f%10);f/= 10;DisChar(5+0x40,f%10);f /= 10;DisChar(4+0x40,f%10);f /= 10;DisChar(3+0x40,f%10);f /= 10;delay(20);*/if(d=2) /s1=0;write_ (0x80+0x40+4); f=th1*256+tl1; f=f-f*0.0792;display(f/1000
21、0);display(f%10000/1000);display(f%10000%1000/100);display(f%10000%1000%100/10); display(f%10000%1000%100%10);write_dat(0x48);write_dat(0x5a); write_(0x80+4); /c=00.0/(log10(2)*f*39760); c=28853901.0 /f;/write_(0x38); display(c/10000);display(c%10000/1000);display(c%10000%1000/100);display(c%10000%1
22、000%100/10); display(c%10000%1000%100%10);write_dat(0x70);write_dat(0x46);/f=0; if(d=1) write_(0x80+0x40+4); f=th1*256+tl1; f=f-f*0.0792 ; display(f/10000);display(f%100000/10000);display(f%100000%10000/1000);display(f%100000%10000%1000/100); display(f%100000%10000%1000%100/10);display(f%10);write_d
23、at(0x48);write_dat(0x5a); write_(0x80+4); /c=00.0/(log10(2)*f*39760); c=71420547/f; if(c1000&c1499&c3500&c5999&c10000) c=c-600; else c=c-900;/write_(0x38); display(f%100000/10000);display(f%100000%10000/1000);display(f%100000%10000%1000/100); display(f%100000%10000%1000%100/10);display(f%10);write_d
24、at(0x70);write_dat(0x46); if(d=3) /s2=0; write_ (0x80+0x40+4); f=th1*256+tl1; f=f-f*0.0792; display(f/10000);display(f%10000/1000);display(f%10000%1000/100);display(f%10000%1000%100/10); display(f%10000%1000%100%10);write_dat(0x48);write_dat(0x5a); write_(0x80+4); /c=00.0/(log10(2)*f*39760); c=18033
25、688.0/f;/write_(0x38); display(c/10000);display(c%10000/1000);display(c%10000%1000/100);display(c%10000%1000%100/10); display(c%10000%1000%100%10);write_dat(0x70);write_dat(0x46); if(d=4) /s3=0; write_ (0x80+0x40+4); f=th1*256+tl1; f=f-f*0.0792 ; display(f/10000);display(f%10000/1000);display(f%1000
26、0%1000/100);display(f%10000%1000%100/10); display(f%10000%1000%100%10);write_dat(0x48);write_dat(0x5a); write_(0x80+4); delay(10); /c=00.0/(log10(2)*f*39760); c=14426950/f; if(c8000) c=c-300;/write_(0x38); display(c/100000);display(c%100000/10000);display(c%100000%10000/1000);display(c%100000%10000%
27、1000/100); display(c%100000%10000%1000%100/10);display(c%10);write_dat(0x70);write_dat(0x46); /*void t0(void) interrupt 1 using 0/计脉冲个数 T0count+; */ void t1(void) interrupt 3 using 0 /定时1s TH1=(65536-50045)/256; TL1=(65536-50045)%256; timecount+; if(timecount=20) th1=TH0; tl1=TL0; TH0=0; TL0=0; T0co
28、unt=0; /TR0=0; /TR1=0; timecount=0; flag=1; #include#include#define uchar unsigned char#define uint unsigned intsbit clock=P37;sbit d_in=P36;sbit d_out=P35;sbit _cs=P33 ;float sum,sum1,sum2;uint flag;double sum_final1;double sum_final;uchar j,i;sbit rs=P20;sbit rw=P21;sbit en=P22;sbit j1=P23;sbit j2
29、=P24;sbit j3=P25;sbit j4=P26;void display1();void display2();void display3();void display4();uchar table1=R ,temp;uchar table2=KM;uchar table5;void delay(unsigned char b) /50us unsigned char a; for(;b0;b-) for(a=220;a0;a-);void write_(uchar )rs=0;rw=0;en=0;P0=;delay(5);en=1;delay(5);en=0;void write_
30、dat(uchar dat)rs=1;rw=0;en=0;P0=dat;delay(5);en=1;delay(5);en=0;void init()uchar i;write_(0x38);write_(0x0c);write_(0x06);write_(0x01);/write_(0x86);for(i=0;i2;i+)write_dat(table1i);delay(5); void display( uchar i) int num; uchar code table=0123456789 ; /init();/ delay(1); tempnum=tablei; num+; writ
31、e_dat(tablei) ; delay(20); /*while(n!=0xf0) n=P1; n&=0xf0; ; */ uint read(uint port)uchar i,al=0,ah=0;unsigned long ad;clock=0;_cs=0;port=4;for(i=0;i4;i+)d_in=port&0x80;clock=1;clock=0;port=1;d_in=0;for(i=0;i8;i+)clock=1;clock=0;_cs=1;delay(5);_cs=0;for(i=0;i4;i+)clock=1;ah=1;if(d_out) ah|=0x01;cloc
32、k=0;for(i=0;i8;i+)clock=1;al=1;if(d_out) al|=0x01;clock=0; _cs=1;ad=(uint)ah;ad=8;ad|=al;return(ad);void main() init(); j2=1; j1=0; j3=0; j4=0; flag=2;while(1) /sum=0;sum1=0;sum_final=0;sum_final1=0; /init();while(1)write_(0x80+4);sum1=read(0);sum2=read(1);/*for(i=0;i4;i+)display (tablei); delay(10)
33、; */ delay(100); display2();/*sum=1000*sum2/(sum1-sum2); if(sum100.099&sum10000.09&sum1000000.09) flag=4;display4();break;*/*sum1=0;sum2=0;/sum_final1=(sum/4095)*5;/sum_final=sum_final1*1000;sum_final=sum;table0=(int)sum_final/1000;table1=(int)sum_final%1000/100;table2=(int)sum_final%1000%100/10;tab
34、le3=(int)sum_final%10; */ /*void display1() /init(); /j1=0; /j2=1; /j3=1; /j4=1; sum1=read(0); sum2=read(1); write_(0x80+4); sum=1000*sum2*1.0/(sum1-sum2); sum1=0; sum2=0; /sum=sum*100; sum_final=sum; table0=(int)sum_final/1000; table1=(int)sum_final%1000/100; table2=(int)sum_final%1000%100/10; tabl
35、e3=(int)sum_final%10; for(i=0;i0) if(i=3) write_dat(0x2e); else if(i=6) write_dat(0xf4); else if(i3&i6) display(tablei-1); else display(tablei); */void display2() init(); /j1=1; / j2=0; / j3=1; /j4=1; sum1=read(0); sum2=read(1); write_(0x80+4); sum=1000*sum2*1.0/(sum1-sum2); sum1=0; sum2=0; sum_fina
36、l=sum; table0=(int)sum_final/1000; table1=(int)sum_final%1000/100; table2=(int)sum_final%1000%100/10; table3=(int)sum_final%10; for(i=0;i0) if(i=4) write_dat(0xf4); else display(tablei); /*void display3() init(); j1=1; j2=1; j3=0; j4=1; sum1=read(3); sum2=read(4); write_(0x80+4); sum=100000*sum2*1.0/(sum1-sum2); sum1=