目录
一、方案设计单片机源程序如下:
1.1 方案论证与设计
1.2 系统原理框图
1.3 主要电路设计与参数计算
1.4 总体电路图
二、测试步骤
三、测试数据及实验结果
四、结论
4.1 本方案特点及存在的问题
4.2 功能扩展
五、学习心得
六、本作品使用说明
七、完整电路图及印制板图
八、附录
成员分工
程序
元件清单
一、方案设计1.1 方案论证与设计基于单片机的RLC检测仪,是指以单片机为核心,实现对电阻、电感和电容的值的测量。测量阻抗参数最常用的方法有伏安法、电桥法和谐振法。
伏安法又称为电压电流法,该方法是利用电压表和电流表分别测出元件的电压值和电流值,从而计算出元器件的值。该方法一般只能用于频率较低的情况,而且还需要把电阻器、电容器和电感器看成是理想的元器件。可想而知,这样的测量方法,误差肯定比较大,而且测量也不方便,受到的限制比较多,但是,也有它的好处,那就是使用比较简单。
电桥法是利用电桥平衡的原理。电桥平衡的条件是:一对相对桥臂阻抗的乘积必须等于另一对相对桥臂阻抗的乘积。直流电桥法用于精确地测量电阻的阻值,但是要适当的选择比率臂的倍率和标准电阻的阻值;比较电桥测量电容或电感,就是通过与已知电容或电感比较来测定未知电容或电感,但是相邻两臂要采用纯电阻。此种测量方法,精度比较高,使用不同电桥可得到宽频率范围,价格低,但需要手动平衡,测试速度比较慢。
谐振法是利用LC串联电路和并联电路的谐振特性来进行测量的方法。当外加信号源的角频率等于回路的固有角频率时,LC串联或并联谐振电路发生谐振,可以求出电感和电容的值。利用这种方法,前提是需要把电路调到谐振,而且精度不高,但是可一测得很高的Q值。
测量这些参量的方法有很多经典的方法,现在比较容易的一个方法就是阻抗的数字化测量。数字化测量是将测量的模拟量转化为数字量,我们的设计最基本的思路就是RLC的数字化测量,可以把它们转换为电压、电流及频率等。在我们小组的设计中,被测电阻、电容、电感作为谐振电路的一部分,用单片机测得电路发出的矩形波的频率,然后根据公式计算出电阻、电感和电容。运用的方法就是谐振法。而我们小组选择的测量电路,是用555定时器组成的基本振荡电路来测量电阻和电容,三点式振荡电路构成的LC谐振电路来测量电感。
1.2 系统原理框图图1-2 系统原理框图
测量电阻和电容,是以555芯片为核心,外加几个电阻、电容组成RC振荡电路,利用电容的充放电过程,使这个电路输出高低矩形波,我们就是利用这一点,使电阻和电容的参数值数字化的。测电感的时候,由于555没有电路可以测电感,所以我们就选择了三点式振荡电路,它利用电容电感的三点式接法,就可以构成LC振荡电路。谐振时,电路输出矩形波。波形产生了,就把矩形波信号送给单片机,通过单片机的定时/计数端测量出矩形波的频率,这样就把阻抗转换为频率了,再通过公式就可以计算出阻抗的参数值了。
这个测量方法是目前比较好的一个选择了,首先,数字化测量的准确度高,测量速度快,又是数字显示,简单明了;其次,把阻抗转换为频率,频率相对来说,是一个比较容易测量出的量,尤其在单片机里,这一点就使整个设计轻松了不少;再者,选用的两个芯片555和三点式振荡电路,所用的测量电路都是它们最基本的电路,电路图比较简单,也很容易理解,测量范围也很广,还有最重要的一点是,电路比较稳定,受外界影响比较小,都可以稳定的输出矩形波。总的来说,这个测量方法几乎集合了其他测量方法的所用优点,是一个比较好方法。
1.3 主要电路设计与参数计算电阻的测量采用“脉冲计数法”,如图1-3-1所示,由555电路构成,多谐振荡电路,通过计算振荡输出的频率来计算被测电阻的大小。
图1-3-1 电阻测量模块
555接成多谐振荡器的形式131,其振荡周期为:
(式1-3-1)
(式1-3-2)
电路分为3档:
电容的测量同样采用“脉冲计数法”,如图1-3-2所示,由555电路构成多谐振荡电路,通过计算振荡输出的频率来计算被测电容的大小。
测量范围:中档100pF~5000pF,高档5000pF~0.15Uf。
图1-3-2 电容测量模块
555接成多谐振荡器的形式,其振荡周期为:
(式1-3-3) (式1-3-4)
电感测量电路如图1-3-3所示,电感的测量是采用电容三点式振荡电路来实现的。三点式电路是指:LC回路中与发射极相连的两个电抗元件必须是同性质的,另外一个电抗元件必须为异性质的,而与发射极相连的两个电抗元件同为电容时的三点式电路,成为电容三点式电路。有:
(式1-3-5)
(式1-3-6)
测量范围:1mH~1000mH。
图1-3-3 电感测量模块
1.4 总体电路图图1-4-1 总体电路原理图
图1-4-2 总体电路原理图
二、测试步骤在测试过程中,我们使用proteus仿真软件搭建电路,将用keil软件生成的程序hex文件导入单片机,对所设计的RLC进行了功能测试。仿真电路如图2所示:
图2 proteus仿真电路图
三、测试数据及实验结果 对低档电阻50Ω仿真测试结果如图3-1所示:
图3-1 50Ω电阻仿真测试结果图
对中档电阻5kΩ仿真测试结果如图3-2所示:
图3-2 5kΩ电阻仿真测试结果图
对高档电阻500kΩ仿真测试结果如图3-3所示:
图3-3 500kΩ电阻仿真测试结果图
对中档电容2000pF仿真测试结果如图3-4所示:
图3-4 2000pF电容仿真测试结果图
对高档电容0.1uF仿真测试结果如图3-5所示:
图3-5 0.1uF电容仿真测试结果图
对电感800mH仿真测试结果如图3-6所示:
图3-6 800mH电感仿真测试结果图
仿真测试数据分析表如下:
表3-1 测试数据分析表
四、结论
4.1 本方案特点及存在的问题我们小组选取的该测量方法是比较好的一个选择,首先,数字化测量的准确度高,测量速度快,又是数字显示,简单明了;其次,把阻抗转换为频率,频率相对来说,是一个比较容易测量出的量,尤其在单片机里,这一点就使整个设计轻松了不少;再者,选用的两个芯片555和三点式振荡电路,所用的测量电路都是它们最基本的电路,电路图比较简单,也很容易理解,测量范围也很广,还有最重要的一点是,电路比较稳定,受外界影响比较小,都可以稳定的输出矩形波。总的来说,这个测量方法几乎集合了其他测量方法的所用优点,是一个比较好的方法。
但本方案仍在存在部分问题:
- 各档衔接处附近所测电阻/电容值相对偏差较大
- 较低和较高的电感测量值相对偏差较大
- 电容量程有限,只设置了中档和高档
从表3-1表格可以看出,测量时部分电容值时误差较大。测量电阻和电容时,电路是由555芯片和外接的电阻电容组成的。555是根据电源的精度和外围阻容元件的精度来决定输出频率精度的,如果外围精度很高且温度变化不大,那么555的精度是足够的,但是以目前的情况来看,部分电容值有5%以上的偏差,这就直接导致了测量电路的精确性不是很好,所以就造成了现在上面这种状况。其实555定时器还有一个很大的缺点,那就是不能产生频率很低的信号,所以我们的测量范围比较小,这和555本身的内部结构有关,这里就不讨论了。
还有一点就是,我们的测量电路必须要保证起振,并且振荡电路要稳定,否则也会增加误差,这也是把元件参数转换成频率后测量的方法的一个不足之处。可以根据实际电路中的电阻或电容,多测一些数据,并求这些数据的平均误差,再把这个误差加到程序中,那么再测数据,误差就会小很多,这样就做了误差的修正。
4.2 功能扩展 除了我们原有电路能够实现的功能以外,我们希望还能够实现电感分组测量的功能,修改程序中的计算参数,使得降低对较高和较低电感值测量时的误差。
五、学习心得在这一次课程设计的暑期实习过程中,我们的小组成员收获良多。从最开始的龙文杰老师和易安林老师的电子工艺基础课程,到焊接练习、PCB图绘制练习,我们一步一步掌握了相应的技巧,为之后的课程设计实习打下了基础。
我们的课程设计内容是RLC测量仪,在这次课程设计的过程中,硬件方面,从在电脑上制作原理图、印刷版图、仿真,到实物的焊接、调试,在此过程中每个环节都遇到了许多大大小小的问题。原理图的绘制时,由于原来的原理图库的元件不全,我们又下载了很多原理图库,在封装时,首先调整线宽、孔环大小、焊盘大小等规则大小,再根据老师规定的设计规则一个个来调整元件的封装,此过程需要极大的耐心及足够的细心。在proteus仿真的过程中,我们一步一步地检查电路的问题及程序的问题。我们也经历过烦躁的时期,但都一一克服,耐心地解决所遇到的每一个bug。印刷了板子后,我们将它腐蚀、刮铜、刷松香,并仔细地对照原理图焊接每一个元件。之后就迎来了无比艰难的调试环节,我们接通电源后发现显示屏并没有显示,但我们并没有气馁,而是拿着万用表,一个一个模块地测量,测量各个引脚之间的电阻、电压,并且记下电压降,与仿真环节中的值相比较,之后再一点点调整电路,将模块输出的方波波形调了出来。显示屏显示出实数的那一瞬间,成就感油然而生。
这次课程设计既锻炼了我们收集整理资料、设计电路图的能力,又考验了我们绘制PCB图时需要的耐心与细心,也在随之而来的焊接过程中锻炼了我们的动手能力。在这次实习中,我们真正做到了从无到有,从理论到实践,这并不是一个容易的过程,期间困难无数,但我们坚持初衷,所有小组成员团结协作、全力以赴,终于把电路调试成功。
在此,我们要感谢我们的指导老师,我们组设计的电路当中的参数十分复杂,需要各种各样值的电容和电阻,老师非常耐心地帮我们收集元件,还领我们到库房寻找需要的元件。在之后的电路调试过程中,她也仔细地查看了我们的电路板,并给我们指出问题,我们才能够更加精确地对板子进行修复。在这次课程设计过程中,同学们互帮互助,共同研究学习,在大家的帮助下,我们才能使该RLC测量仪工作更加精确,功能更加完善。
六、本作品使用说明这是一个分档RLC测量仪。本系统在调试方面经过长时间的测试操作,稳定性能得到了认可。同时此系统通过软件设计,减少误差的存在,并采用标准的电阻、电容器和电感进行校准,大大提高了系统的精度。该设计采用555震荡和LC三点式振荡来实现对参数R,L,C的测量的方法,满足总体设计的技术指标与功能要求,具有较好的应用价值。
使用方法:
- 确定待测元件种类【电阻/电容/电感】,按下相应开关。
- 确定待测元件档位【高档/中档/低档】,按下相应开关。
- 接通电源,观察液晶显示屏的示数。
- 需要换挡测量时,按下复位按钮。
图6 RLC测量仪使用说明图
七、完整电路图及印制板图图7-1 完整电路原理图
图7-2 完整电路PCB图
图7-3 印刷板图
图7-4 课程设计作品正面图
图7-4 课程设计作品背面图
以下是RLC测量仪对部分电阻、电容、电感的测量结果图:
图7-5 2kΩ电阻测量结果图
图7-6 5kΩ电阻测量结果图
图7-7 33kΩ电阻测量结果图
图7-8 100kΩ电阻测量结果图
图7-9 200kΩ电阻测量结果图
图7-10 330pF电容测量结果图
图7-11 102电容测量结果图
图7-12 103电容测量结果图
图7-13 104电容测量结果图
图7-14 9.4mH电感测量结果图
图7-15 14.1mH电感测量结果图
RLC测量仪测量数据分析表如下:
表7-1 测量数据分析表
元件清单
八、附录程序
代码:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit E=P2^7;
- sbit R=P1^0;
- sbit C=P1^1;
- sbit L=P1^2;
- sbit A1=P1^3;
- sbit A0=P1^4;
- sbit Low=P1^5;
- sbit Mid=P1^6;
- sbit High=P1^7;
-
- #define LCD_data P0
- uchar code table1[10]={"R= R"};
- uchar code table2[10]={"C= pF"};
- uchar code table3[10]={"L= mH"};
-
- uchar code f_table[88]={13,14,15,16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100};
- uchar code f_correct[88]={9,10, 11, 12, 12, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71,};
-
- uchar a7,a6,a5,a4,a3,a2,a1;
- uchar flag;
- unsigned long cnt,cnt1;
- uchar f_cnt;
-
-
- /********************************/
-
- void delay_us(); //18us
- void delay_ms(uint);
- void lcd_init();
- void lcd_write_com(uchar com);
- void lcd_write_dat(uchar dat);
- void lcd_init();
- void lcd_display(uchar add,uchar dat);
- /***********************************/
-
- void delay_us()
- {
- uchar x;
- for(x=0;x<5;x++);
- }
-
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<123;y++);
- }
- void lcd_write_com(uchar com)
- {
- E=0;
- RS=0;
- RW=0;
- delay_us();
- LCD_data=com;
- E=1; //高脉冲写入数据
- delay_us();
- E=0;
- }
- void lcd_write_dat(uchar dat)
- {
- E=0;
- RS=1;
- RW=0;
- delay_us();
- LCD_data=dat;
- E=1; //高脉冲写入数据
- delay_us();
- E=0;
- }
- void lcd_init() //lcd初始化
- {
- delay_ms(15);
- lcd_write_com(0x38);
- delay_ms(10);
- lcd_write_com(0x0c);
- lcd_write_com(0x06);
- lcd_write_com(0x01);
- delay_ms(2);
-
-
- }
- void timer_init(void) //定时器初始化
- {
- TMOD=0X51;
- PT0=1; /*中断优先*/
- TH0=0x3c;
- TL0=0xb0;
- TH1=0;
- TL1=0;
- ET0=1;
- ET1=1;
- TR0=1;
- TR1=1;
- EA=1;
- }
- void lcd_display(uchar add,uchar dat) //lcd显示(地址,数据)
- {
-
- lcd_write_com(add);
-
- lcd_write_dat(dat);
- delay_us();
-
- }
- void real_display(void)
- {
- if(!R)
- {
- A1=A0=0;
- lcd_display(0x80,table1[0]);
- lcd_display(0x80+1,table1[1]);
- lcd_display(0x80+8,table1[8]);
- lcd_display(0x80+9,table1[9]);
- }
- else if(!C)
- {
- A0=0;A1=1;
- lcd_display(0x80,table2[0]);
- lcd_display(0x80+1,table2[1]);
- lcd_display(0x80+8,table2[8]);
- lcd_display(0x80+9,table2[9]);
- }
- else if(!L)
- {
- A0=1;A1=0;
- lcd_display(0x80,table3[0]);
- lcd_display(0x80+1,table3[1]);
- lcd_display(0x80+8,table3[8]);
- lcd_display(0x80+9,table3[9]);
- }
- if(a6)
- lcd_display(0x80+2,0x30+a6);
- else
- lcd_display(0x80+2,' ');
-
-
- if(a6||a5)
- lcd_display(0x80+3,0x30+a5);
- else
- lcd_display(0x80+3,' ');
-
-
- if(a6||a5||a4)
- lcd_display(0x80+4,0x30+a4);
- else
- lcd_display(0x80+4,' ');
-
-
- if(a6||a5||a4||a3)
- lcd_display(0x80+5,0x30+a3);
- else
- lcd_display(0x80+5,' ');
-
-
- if(a6||a5||a4||a3||a2)
- lcd_display(0x80+6,0x30+a2);
- else
- lcd_display(0x80+6,' ');
-
-
- lcd_display(0x80+7,0x30+a1);
-
-
- }
-
- void correct(void) //误差修正函数
- {
- uchar i,k;
- unsigned long wucha;
- if(cnt<100000) //100KHz以内的修正
- {
- if(cnt>980&&cnt<2100) cnt-=1;
- if(cnt>=2100&&cnt<3900) cnt-=2;
- if(cnt>=3900&&cnt<4800) cnt-=3;
- if(cnt>=4800&&cnt<5700) cnt-=4;
- if(cnt>=5700&&cnt<8000) cnt-=5;
- if(cnt>=8000&&cnt<9100) cnt-=6;
- if(cnt>=9100&&cnt<10900) cnt-=7;
- if(cnt>=10900&&cnt<11900) cnt-=8;
- if(cnt>=11900&&cnt<13000) cnt-=9;
- if(cnt>=13000&&cnt<=100000)
- {
- k=cnt/1000;
- for(i=0;i<88;i++)
- {
- if(k==f_table[i])
- {
- cnt-=f_correct[i];
- }
- }
- }
-
-
- }
- if(cnt>100000)
- {
- wucha=(cnt/1000)*73065/100000;
- cnt-=wucha;
- }
- }
-
- void main()
- {
-
- timer_init();
- lcd_init();
- while(1)
- {
- if(flag==1)
- {
- real_display();
- flag=0;
- }
-
-
- }
-
- }
-
-
- void timer0() interrupt 1
- {
- uchar timer0;
-
- TH0=0x3c; //50ms
- TL0=0xb0;
- timer0++;
- if(timer0==20)
- {
- TR1=0; //关闭的计数器
- EA=0;
- cnt=TL1+TH1*256+f_cnt*65536;
- correct();
- if(!R)
- {
- if(High&&Mid&&!Low){cnt1=(2.6*1000000)/(2*cnt)-25;}
- else if(High&&!Mid&&Low){cnt1=((6.4*1000000)/(2*cnt)-16)/3*4-200;}
- else if(!High&&Mid&&Low){cnt1=((4.372*100000000)/(2*cnt)-(2.1*10000/2))/19*20;}
- }
- else if(!C)
- {
- if(High&&!Mid&&Low){cnt1=(1000000000/(3*0.693*20*cnt))/5*4;}
- else if(!High&&Mid&&Low){cnt1=1000000000/(3*0.693*200*cnt);}
- }
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
完整论文下载(word格式 可编辑):
http://www.51hei.com/bbs/dpj-90086-1.html