暨全国电子设计竞赛选拔赛
简易LCR测量仪(D题)
2015年6月5日
摘 要
本设计中把R、L、C转换成频率信号f,转换的原理分别是RC振荡电路和LC电容三点式振荡电路,单片机根据所选通道,取得振荡频率,作为单片机的时钟源,通过测频法则可以计算出被测频率,再通过该频率计算出各个参数。然后根据所测频率判断是否切换单位,或者是把数据处理后,把R、L、C的值送液晶屏,并显示相应的参数值。
简易LCR测量仪(D题)
【三只牛犊组】
1系统方案
本系统主要由电子元件集中参数R、L、C转频率模块、主控模块、R,L,C切换模块、电源模块组成,下面分别论证这几个模块的选择。
1.1 测量方案的论证与选择
方案一:电桥法
电阻R可用直流电桥测量,电感L、电容C可用交流电桥测量。电桥的平衡条件为
通过调节阻抗、使电桥平衡,这时电表读数为零。根据平衡条件以及一些已知的电路参数就可以求出被测参数。用这种测量方法,参数的值还可以通过联立方程求解,调节电阻值一般只能手动,电桥的平衡判别亦难用简单电路实现。这样,电桥法不易实现自动测量。
方案二:伏安法
伏安法有固定轴法和自由轴法两种,区别在于相敏检波器的相位参考基准选取的不同。实际上,相敏检波的相位参考基准代表坐标轴的方向,相敏检波器的输出就是待测电压在坐标轴方向上的投影。但此方案需要信号源,由于信号源的制作较为繁琐,不够简洁。
方案三:谐振法
利用555的多谐震荡电路及电容三点式震荡电路将电子元件的集中参数R、L、C转换成频率信号f, 然后用单片机计数后在运算求出R、L、C的值,并送显示,转换的原理分别是RC振荡和LC三点式振荡。其实,这种转换就是把模拟量进拟地转化为数字量,频率f是单片机很容易处理的数字量,这种数字化处理一方面便于使仪表实现智能化,另一方面也避免了由指针读数引起的误差。
综合以上三种方案,我们组最后决定使用方案三。
1.2 R,L,C切换模块的论证与选择
方案一:4路模拟开关CD4066
CD4066芯片(全称:四路模拟开关集成电路)内部含有A、B、C、D四路模拟开关,A路模拟开关由引脚13控制、B路模拟开关由引脚5控制、C路模拟开关由引脚6控制、D路模拟开关由引脚12控制。所有的控制引脚由软件编程控制,当控制线由软件置“1”时,该模拟开关闭合,当控制线由软件置“0”时,该模拟开关断开,且四路模拟开关可使用。但由于其断开时不能完全断开而只是阻抗很大,因此在进行RLC切换时会出现信号干扰问题。
下图为CD4066的内部结构图:
方案二:电磁继电器
电磁继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流、较低的电压去控制较大电流、较高的电压的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。其开关的闭合与打开符合条件,不会出现信号干扰问题。
综合以上两种方案,我们组最后决定使用方案二。
1.3 控制系统的论证与选择
方案一:STM32
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核但其编程较为复杂,价格也不占优势。
方案二:STCC52
·8位CPU·4kbytes程序存储器(ROM) (52为8K)
·128bytes的数据存储器(RAM) (52有256bytes的RAM)
·32条I/O口线·111条指令,大部分为单字节指令
·21个专用寄存器
·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
·一个全双工串行通信口
·外部数据存储器寻址空间为kB
·外部程序存储器寻址空间为kB
·逻辑操作位寻址功能·双列直插40PinDIP封装
·单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
由于此方案需要单片机完成的工作只有驱动液晶,测量频率及简单计算,51完全可以胜任,且51性价比不错.因此选用51作主控芯片。
综合以上两种方案,我们组最后决定使用方案二。
2系统理论分析与计算
2.1 LCR值转频率电路的分析
2.1.1 RC值转频率电路(NE555芯片构成的多谐振荡器)
电阻R1、R2和电容C1构成定时电路。定时电容C1上的电压UC作为高触发端TH(6脚)和低触发端TL(2脚)的外触发电压。放电端D(7脚)接在R1和R2之间。电压控制端K(5脚)不外接控制电压而接入高频干扰旁路电容C2(0.01uF)。直接复位端R(4脚)接高电平,使NE555处于非复位状态。
多谐振荡器的放电时间常数分别为
tPH≈0.693×(R1+R2)×C1
tPL≈0.693×R2×C1
振荡周期T和振荡频率f分别为
T=tPH+tPL≈0.693×(R1+2R2)×C1
f=1/T≈1/[0.693×(R1+2R2)×C1]
2.1.2L值转频率电路
电感的测量是采用电容三点式振荡电路来实现的,如图2.5.1所示。三点式电路是指:LC回路中与发射极相连的两个电抗元件必须是同性质的,另外一个电抗元件必须为异性质的,而与发射极相连的两个电抗元件同为电容时的三点式电路,成为电容三点式电路。 在这个电容三点式振荡电路中,C4 C5分别采用1000pF、2200pF的独石电容,其电容值远大于晶体管极间电容,可以把极间电容忽略。
振荡公式:
,其中 为C1C2串联容值
则电感的感抗为
2.2 LCR值转频率的计算
2.2.1
电阻计算公式:R= 138720677*(1/f)-325.5
单位:电阻:欧,频率:Hz
2.2.2
电容计算公式:C= 0.00050037*(1/f)
单位:电容:pf,频率:Hz
2.2.3
电感计算公式:L= 661102.8/(f*f)
单位:电感:H频率:Hz
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图
系统总体框图如下图所示:
3.1.2 LCR值转频率电路原理图
1、R值转频率电路原理图:
2、C值转频率电路原理图:
3、L值转频率电路原理图:
4、过零比较电路:
3.1.3 档位切换电路原理图
1、继电器部分切换电路:
3.1.4电源
电源由变压部分、滤波部分、稳压部分组成。为整个系统提供5V或者12V电压,确保电路的正常稳定工作。这部分电路比较简单,都采用三端稳压管实现,故不作详述。
3.2程序的设计
3.2.1程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现键盘的设置,测频和显示。
1)键盘实现功能:选择测量对象(R、C、L),按键切换单位,复位。
2)显示部分:显示测量频率和所测元件值。
2、程序设计思路
对系统初始化之后,判断是否有按键按下。以测电阻为例,若按下R开关,单片机输出高信号驱动继电器闭合。测量的电阻经RC振荡电路转换为频率f,根据测电阻的换算公式,利用单片机软件编程,测量出其阻值并送显示。使用外部中断实现按键切换单位和按键复位功能。
3.2.2程序流程图
1、主程序流程图
4测试方案与测试结果
4.1测试方案
1、硬件测试
LCR测试方法:通过使用LCR测试仪,测量出较精确的LCR值,然后通过示波器读出所显示方波的频率,由此通过公式反推出LCR的理论值,再与实际测量的LCR值比对,调整参数。
2、软件仿真测试
通过信号发生器连接单片机,通过液晶屏读取频率值。
3、硬件软件联调
通过硬件组装,通过按键切换,用液晶屏显示理论值,与硬件测试时的理论值与实际值进行比对,记录数值,调整参数。
4.2 测试条件与仪器
测试条件:仿真电路和硬件电路与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:示波器,数字万用表,LCR测试仪。
4.3 测试结果及分析
4.3.1测试结果(数据)
通过LCR测量的R值数据及通过液晶屏显示的频率数据:
通过公式算出的理论值及理论值与实际值的误差
通过excel图象拟合数据:
4.3.2测试分析与结论
根据上述测试数据,由此可以得出以下结论:
1、电阻的测量值与实际值的误差能控制在1%以内
2、
3、
综上所述,本设计达到设计要求。
附录1:电路原理图
一.测的RC振荡电路:
二.测Cx的RC的振荡电路:
三.测量Lx的电容三点式振荡电路:
过零比较电路:
四.部分仿真电路:
多谐振荡电路:
电容三点式振荡电路及方波变换电路:
五.继电器部分切换电路:
附录2:源程序
#include"LCD1602.h"
#include #include #include #define k 830016036 sbit keyR=P2^5; sbit keyC=P2^4; sbit keyL=P2^3; sbit testR=P1^0; sbit testC=P1^1; sbit testL=P1^2; sbit R_large=P1^3; sbit R_small=P1^4; sbit C_large=P1^5; sbit C_small=P1^6; sbit counter=P3^4; sbit timer=P3^5; sbit flag=P3^2; sbit reset=P3^3; uchar idata f_display[20]; uchar idata display_lcd[20]; uint flag_rcl; uint flag_danwei; uint flag_reset; uint timer_yichu=0,counter_yichu=0; uint fenpin_rate,m,n,f_L; void init(void); void keypress(void); void cepin(void); void display(float f); void panduan(void); void main() { lcd_init(); init(); write_string(1,0,"designed by "); write_string(1,1,"three calves"); delay_ms(1000); clear_screen(); while(1) { clear_screen(); flag_reset=0; write_string(1,1,"waiting..."); while(1) { keypress(); panduan(); if (flag_reset==1) break; } } } void init(void)//初始化 { TMOD=0x15; //T1定时器,T0计数器 TH1=0x3c; //定时50ms TL1=0xb0; TH0=0; TL0=0; IT0=1;//外部中断下跳沿触发 IT1=1;//外部中断下跳沿触发 ET1=1; ET0=1; EX0=1; EX1=1; EA=1; TR1=1; TR0=1; PT0=1;//计数器中断优先 flag_rcl=0; flag_danwei=0; flag_reset=0; } void keypress(void) { while(1) { if(keyR==0) { testR=1; testC=0; testL=0; flag_rcl=1; } else if(keyC==0) { delay_ms(5); if(keyC==0) { testR=0; testC=1; testL=0; flag_rcl=2; } while(keyC==0); } else if(keyL==0) { delay_ms(5); if(keyL==0) { testR=0; testC=0; testL=1; flag_rcl=3; } while(keyR==0); } if (flag_rcl!=0) break; } } void panduan(void) { if (flag_rcl==0); if(flag_rcl==1) { cepin(); } else if(flag_rcl==2) { cepin(); } else if(flag_rcl==3) { cepin(); } } void cepin(void) { unsigned long f_test; timer_yichu=0; counter_yichu=0; TMOD=0x15; TH1=0x3c; //初始50ms TL1=0xb0; TH0=0; TL0=0; TCON=0x50; while(timer_yichu!=20); TCON=0; f_test=TH0*256+counter_yichu*65536+TL0; display(f_test); } void display(float f)//液晶屏显示函数 { float vlaue_r0; float value_r; float value_c; float value_l; clear_screen(); if(f>1000000.00) sprintf(f_display,"Freq:%2.4fMhz",(f/1000000.00)); else if(f>1000.00) sprintf(f_display,"Freq:%4.2fKhz",(f/1000.00)); else sprintf(f_display,"Freq:%3.2fhz",f); write_string(0,0,f_display); if (flag_rcl==1)//R { vlaue_r0=138720677/f-326.4; if(vlaue_r0<300) value_r=0.8882*vlaue_r0+14.887; else if((vlaue_r0>300)&&(vlaue_r0<500)) value_r=0.9232*vlaue_r0+8.3454; else if((vlaue_r0>500)&&(vlaue_r0<1000)) value_r=1.0497*vlaue_r0-55.115; else if((vlaue_r0>1000)&&(vlaue_r0<5000)) value_r=1.0747*vlaue_r0-69.451; else if((vlaue_r0>5000)&&(vlaue_r0<10000)) value_r=1.0698*vlaue_r0-17.569; else value_r=1.0471*vlaue_r0+29.594; if(flag_danwei==0) sprintf(display_lcd,"R:%4.5f o",value_r); //需要修改 if(flag_danwei==1) sprintf(display_lcd,"R:%4.5fKo",value_r/1000); if(flag_danwei==2) sprintf(display_lcd,"R:%4.5fMo",value_r/1000000); } if (flag_rcl==2)//C { value_c=0.00050037/f; if(flag_danwei==0) sprintf(display_lcd,"C:%4.2f F",value_c/1000000); //需要修改 if(flag_danwei==1) sprintf(display_lcd,"C:%4.2f pF",value_c); if(flag_danwei==2) sprintf(display_lcd,"C:%4.2f uf ",value_c*1000000); } if (flag_rcl==3)//L { value_l= 600782/(f*f) ;//电感公式 sprintf(display_lcd,"L:%4.2f mH ",value_l*1000);//需要修改 } write_string(0,1,display_lcd); } void timer1(void) interrupt 3 //定时器服务函数 { timer_yichu++; TH1=0x3c; //重装载50ms TL1=0xb0; } void counter0(void)interrupt 1 //计数器服务函数 { counter_yichu++; TH0=0; TL0=0; } void int0(void)interrupt 0 //外部中断切换单位服务函数 { delay_ms(5);//软件消抖 if(flag == 0) { flag_danwei++; while( !flag);//松手检测 } if (flag_danwei==3) flag_danwei=0; } void int1(void)interrupt 2//外部中断reset { delay_ms(5);//软件消抖 if(reset== 0) { flag_reset=1; flag_rcl=0; while( !reset);//松手检测 } } 0.0005049155