基于.51单片机的数字电容测量仪_第1页
基于.51单片机的数字电容测量仪_第2页
基于.51单片机的数字电容测量仪_第3页
基于.51单片机的数字电容测量仪_第4页
基于.51单片机的数字电容测量仪_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...电子系统设计创新与实习报告设计课题基于单片机的电容测量仪设计学院信息科学与工程学生姓名学号专业班级队友指导教师设计时间2014.6.4-2014.7.3本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。通过单片机的计时器测量脉宽,根据的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。系统的测量范围为10pF~500uF,具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil编程,进而借助altiumdesigner制作PCB,最后到焊接元器件,调试直至成功。1系统方案设计1.1设计说明及要求1.1.1设计说明框图中的外接电容是定时电路中的一局部。当外接电容的容量不同时,与定时电路所对应的时间也有所不同,即C=f(t),而时间与脉冲数目成正比,脉冲数目可以通过计数译码获得。1.1.2设计要求〔1〕根本要求①自制稳压电源。②被测电容的容量在10pF至10000μF范围内③设计四个的测量量程。④显示测量结果,测量误差小于2.5%。数字显示:显示分辨率:每档满量程的0.1%;电容测量:电压可选择5V,25V,50V;为实现该设计,到达相应的设计要求,本次设计中考虑了三种设计方案,三种设计方案中主要区别在于硬件电路和软件设计的不同,对于本设计,三种方案均能够实现,最后根据设计要求、可行性和设计本钱的考虑选择了基于STC89C52单片机和555芯片构成的单稳态触发电路测量电容的方案。现在一一介绍论证如下。1.3方案Ⅱ根据积分电路原理可得C=Ui*dt/R*Uo,将经过RC充电电路后,输出的与电容对应的电压值输入到ADC0809中,经过处理后,将相应的数值传到单片机里,再通过公式运算,求得相应的电容C值,在LCD上显示。图1-2方案Ⅱ电容测量框图1.5三种方案作简单的比拟比拟上述三种方案可知,方案Ⅰ和ⅠⅠ采用了A/D转换器,价格比拟昂贵;而且根据公式可知,再换算电压与电容值时,时间参数t起着至关重要的作用,对t的计算要准确,不然误差值会很大,所以调试起来有一定难度;方案Ⅲ电路简单,原理清晰,易于实现,易于控制,本设计就是基于方案Ⅲ展开的。2.2硬件电路设计2.2.1单片机电路设计为使单片机正常工作,除电源供电局部外,还需提供晶振电路和复位电路。具体电路如下:图2-3单片机工作电路由图2-3可知,9脚外接的是按键复位电路,18,19脚外接的是晶振电路,这样,就构成了单片机正常工作的必备电路。同时,为使P0口正常工作,并增加其带负载能力,P0口需接了上拉电阻〔在图中未画出〕。2.2.2555时钟芯片与单片机连接图2-4是555时钟芯片构成的单稳态触发电路,6脚和7脚接在一起,R2和C4构成商店复位电路,2脚用于接收单片机P3.7口产生的低脉冲,3脚接于P3.2脚,用于门控制计时器0的启动与停顿。从而将电容容量转为脉冲宽度。图2-4555芯片与单片机的连接2.2.3低脉冲产生电路如图2-5所示,按键接于P3.3口,即外部中断1接口,因此低脉冲是利用中断实现的,P3.7口产生低脉冲,可在软件中的外部中断1函数中实现,整个过程为,需要测量时,按键,产生外部中断,利用外部中断,用软件再在P3.7口产生一个低脉冲,之所以利用中断实现该功能,是为了增加产品的可靠性,因为按键的时间是比拟长的,直接用按键产生低脉冲可能导致T1>Tw,导致测量错误。而利用中断,可以直接在中断函数中产生一个固定时间的低脉冲,保证了测量条件,防止发生错误。图2-5按键产生低脉冲电路2.2.4键盘电路如图2-6所示键盘电路主要用于与用户进展交互,如用户需要选择量程时,就必须交互。键盘分为独立键盘和矩阵键盘,这里只需要实现量程的选择,共四个量程,故无需矩阵键盘,4个独立按键就完全够用了。图2-6键盘电路2.2.5指示灯电路如图2-7所示,指示灯主要用于给用户以提示,如当前量程提示,超量程提示等等。D2用于超量程提示,D6用于电源提示。图2-7指示灯电路2.2.6量程选择电路在图2-4中可以看到,在RC充电回路中,R值是固定的,不可变的,那么量程也显然是不可变的,因此,需要在此参加可调节充电回路电阻的电路局部,这里,利用继电器可以简单实现。具体电路如图2-8所示,利用继电器时需特别注意,由于单片机输出电流是很小的,缺乏以驱动继电器吸合,因此要加驱动电路,在这里,选择ULN2003芯片来实现。当然,也可以利用典型的三极管驱动来实现,虽然选择的是芯片实现驱动,在这里也将典型的三极管驱动电路列于此。如图2-9所示。图2-8实现量程选择电路图2-9利用三极管的驱动电路2.2.7液晶显示电路如图2-10所示,lcd接与P1口,用于显示电容值以及一些相应的测量信息。图2-10lcd显示电路至此,整个电容测量仪的硬件设计局部就设计好了,接下来,需要的就是与之相匹配的软件支持了。2.3软件设计软件编程平台选择最常用的keil软件。由于该程序并未涉及到底层的驱动问题,因此选择方便快捷的C语言编程。在编程中,将该程序分为三个模块:延时模块,1602显示模块及主函数模块。方便调试与理解。具体程序见附录二。总体程序较长,但并不复杂,可根据需要重点看主函数,与硬件电路结合起来,注重程序后紧跟的注释,理解起来是比拟容易的,在此就不再一一详细分析。2.4量程范围设置由于量程的选择是非常重要的一个环节,在这里单独讨论量程的选择。系统采用单片机片内16位的定时器测量TW的宽度,标准计数脉冲的周期为1微秒时,为确保计数器不发生溢出,要求TW<65毫秒。同时,为减小量化误差对结果的影响,要求TW>1微秒。当TW>100微秒以上时,可忽略量化误差的影响。为满足10pF~500uF的测量范围,可通过设置不同充电电阻R的阻值来实现。理论计算的电阻R阻值、理论量程范围以及系统选择的量程范围如表2-1所示。系统分为四个量程,可测量10pF~500uF的电容。表2-1R值与量程范围的关系R值〔欧姆〕理论量程范围选择的范围10M9pF~5.9nF10pF~5nF100K900pF~590nF5nF~500nF1K90nF~59uF0.5uF~50uF100900nF~590uFF50uF~500uF2.5altiumdesigner原理图设计及PCB制作2.4.1原理图设计图2-11原理图设计PCB制作图2-12PCB设计在此并没有布双层板,红色的线仅仅只是为了标志出跳线。设计结果图2-13设计结果实物图各个按键功能如图中文字说明。3系统测试由于该作品需实现的功能仅为测电容,在此不列出其他的测试。3.1测量100pf的电容在此以100pf电容测试为例,演示整个测试过程。测试标称值为101的电容,即测量电容值为100pf的电容。104的电容实物如图2-14所示。测试结果如图2-15所示。假设量程选择错误,测试结果如图2-16所示。图2-14100nf的电容实物图2-152nf电容正常测试图2-16量程错误情况下的测试3.2测量4.7uf的电容再以测试4.7uf电容为例,测试结果如图2-18所示。图2-18测试4.7uf的电容3.3测试结果将测量的一系列电容的电容值与标准值比拟。比拟结果如表3-1。表3-1测量值与标准值比拟标准值测量值误差100pf99.10pf1%2nf2nf0%4.7uf4.70uf0%100uf100.66uf1%由表3-1中数据可知,平均误差是0.5%,低于设计扩展要求的2.5%,测量范围是10pf~500uf,根本满足设计要求的10pf~10000uf。测量结果由液晶直观显示。综合以上分析,该设计满足整体设计要求。3.1误差分析由于产生的0.5%左右的误差,在这里简要分析一下误差产生的原因。电容测量的误差主要由NE555定时器构成的单稳态触发电路的非线性误差T、计数器的量化误差N和标准计数脉冲的频率偏移TC产生[2][3]。因此有:系统采用的标准计数脉冲来自单片机内核时钟,由片外的高精度晶振与片内电路自激振荡产生,频率非常稳定,可以忽略其频偏对测量结果的影响。量化误差N是数字电路的特有误差,最坏的情况下等于1。如采用12M的晶振,可获得1MHz的标准计数脉冲,量化产生的最大误差为1微秒。通过设置充电电阻R的阻值,使TW到达毫秒级时,量化误差的影响非常小,可以忽略。非线性误差是由器件的非线性特性产生的,可通过硬件参数修正和软件算法补偿来减小。4结论与心得体会经过本次历经4周的实习,使得我又进一步对单片机系统,尤其测量电容的电路系统有了深一步认识。在做前期准备工作时,教师不希望我们用555芯片做这个实验,因为如果是555芯片震荡电路来测量的话,虽然制作原理简单,但测量值会很不稳定,测范围也不够广。可出于坚信化繁为简的信念,在没做过实物的情况下,我们还是硬着头皮还是想验证下事实是不是如此〔如果不成功再改换方案〕。起初查阅了很多资料,比方伏安法中的自由轴法制作测量电容电路,LC震荡侧电容电路等,教师也推荐了方案二中的积分法测量电路,但因为在进展理论计算时,因为积分测容法中C=Ui*dt/Uo*R,而我们无法准确确定ADC在输出口的传输时间〔哪怕是几十us〕,所以有种无法掌控误差的感觉,再加上出于本钱考虑,所以没有首选这种方法。而对于利用555芯片单稳态触发这种法案的分析,我则很相信,这个电路是可以实现测量功能的,并且只要输出稳定,我就可以做相应补偿。在经过一系列的仿真,实物制造和调整后,最初做出来的板子并不能运行的,后面反复彻查后,才发现原来自己的设计出现了差漏,少连或错连了一些关键线路,于是又重新修整过。经过修正后的电路中终于可以开场进展测量了,起初的测量只有在nf档和10uf以下档位下,测量值是根本满足要求的,而PF裆和100uf以上的档位并不满足已要求的,甚至不够稳定,所以我开场将挡位缩小,将10pf~10000uf的要求,缩减为100Pf~500uf,果然修正后的电路,测量稳定了。再经过软件补偿后,最终获得了在精度上可以满足要求的方案。〔Ps:因为最初设计的时候只选择了4个挡位,而手上电容最大才470uf,出于“最稳定测量〞的考虑,所以才改的100pf~500uf挡位。即:本方案也可能可以测量500uf以上的电容,只要将其中的100欧姆电阻改小即可。〕5参考文献【1】《单片机根基》第三版李广弟朱月秀冷祖祁编著北京航天大学出版社,2007【2】《数字式电容测量仪设计》张玉芹,洪远泉廊坊师范学院学报(自然科学版)2011年6月第11卷第3期【3】梁艳霞,基于单片机控制的电容测试仪设计,总裁,2009.【4】徐思成,一种基于单品啊及只能电容测试仪的设计与实现,现代电子技术,2010【5】陶春明,单片机使用技术,北京:人民邮电出版社,2008【6】何立民,单片机应用程序设计,北京:北京航空航天大学出版社。【7】陈世良,吴凌燕,丁国臣,基于AT89C2051单片机的数字电容表设计,2009【8】童诗白,华成英,模拟电子技术根基第三版,北京,高等教育出版社,2007【9】熊筱芳,郭学提,根本89C51单片机的数字电容表设计,自动化应用技术,2008【10】何光明,杨健宇,C语言程序设计与应用开发,北京:清华大学出版社,2006.6附录附录1元器件清单〔1〕晶振12M一个〔2〕stc89c52芯片一片〔3〕30pf2个;10uf1个;470uf1个;0.33uf2个;4.7uf1个;1nf1个〔4〕40脚活动底座一个〔5〕lcd液晶一个〔6〕按键6个〔7〕发光二极管6个〔8〕9引脚排阻1个〔9〕680Ω6个;10k1个;1k2个;1k滑动变阻器1个;10M1个;100k1个;100Ω1个;2k1个;200Ω1个;〔10〕开关1个〔11〕整流桥1个〔12〕7805稳压芯片1片〔13〕继电器3个〔14〕ULN20031片〔10〕排针假设干,杜邦线假设干附录2程序清单分5个文件:delay.h,delay.c,1602.c,1602.h,main.c(a)delay.h程序清单:#ifndef__delay_h__#define__delay_h__#defineucharunsignedchar#defineuintunsignedintvoiddelay_us(uintcnt);voiddelay_ms(uintcnt);#endif(b)delay.c程序清单:#include"delay.h"voiddelay_us(uintcnt){ uchari; for(;cnt>0;cnt--) { for(i=0;i<12;i++) { ; } }}voiddelay_ms(uintcnt){ uchari; for(;cnt>0;cnt--) { for(i=0;i<125;i++) { ; } }}(c)1602.h程序清单:#ifndef__1602_h__#define__1602_h__#include<reg52.h>sbitRS=P2^2;//定义端口sbitRW=P2^1;sbitEN=P2^0;#defineRS_CLRRS=0#defineRS_SETRS=1#defineRW_CLRRW=0#defineRW_SETRW=1#defineEN_CLREN=0#defineEN_SETEN=1unsignedcharpro_data(unsignedcharmda);voidLCD_write_com(unsignedcharcom);voidLCD_write_Data(unsignedcharData);voidLCD_init(void);voidlcd_pos(unsignedcharpos);voiddisp(unsignedchar*p);voiddispchar1(unsignedchar*p);voiddispchar2(unsignedchar*p);voiddispchar3(unsignedchar*p);#endif(d)1602.c程序清单:#include"1602.h"#include"delay.h"voidLCD_write_com(unsignedcharcom){ RS_CLR; RW_CLR; EN_SET; com=pro_data(com); P1=com; delay_us(5); EN_CLR;}voidLCD_write_Data(unsignedcharData){ RS_SET; RW_CLR; EN_SET; Data=pro_data(Data); P1=Data; delay_us(5); EN_CLR;}voidLCD_init(void){LCD_write_com(0x38);//显示模式设置delay_ms(5);LCD_write_com(0x38);delay_ms(5);LCD_write_com(0x38);delay_ms(5);LCD_write_com(0x38);LCD_write_com(0x08);//显示关闭LCD_write_com(0x01);//显示清屏LCD_write_com(0x06);//显示光标移动设置delay_ms(5);LCD_write_com(0x0c);//显示开及光标设置}voidlcd_pos(unsignedcharpos){ LCD_write_com(0x80|pos);}voiddisp(unsignedchar*p) //第二行显示数据{ unsignedchari; lcd_pos(0x43); for(i=0;i<6;i++){ if(4==i) { LCD_write_Data(0x2e); } LCD_write_Data('0'+(*p)); p++; }}voiddispchar1(unsignedchar*p) //第一行显示需要显示的提示字符串{ lcd_pos(0x00); while(*p!='\0') { LCD_write_Data(*p); p++; } lcd_pos(0x4c); LCD_write_Data('f'); }voiddispchar2(unsignedchar*p) //第二行显示需要显示的提示字符串{ lcd_pos(0x40); while(*p!='\0') { LCD_write_Data(*p); p++; } }voiddispchar3(unsignedchar*p) //第一行显示第二行清空{ unsignedchari; lcd_pos(0x00); while(*p!='\0') { LCD_write_Data(*p); p++; } lcd_pos(0x40); for(i=0;i<16;i++) { LCD_write_Data(''); } }unsignedcharpro_data(unsignedcharmda) //数据处理函数,将高位和低位互换{ unsignedcharenddat; unsignedchari; enddat=0; for(i=0;i<8;i++) { enddat=enddat<<1; if(mda&0x01==1) { enddat=enddat|0x01; } else { enddat=enddat|0x00; } mda=mda>>1; } returnenddat;}(e)main.c程序清单:#include<reg52.h>#include"1602.h"#include"delay.h"sbitvo=P3^2; //用于检测P3.2口的值,计算时间。计时器0的开与断sbittr=P3^7; //产生一个低电平脉冲 //超量程提示灯sbitledclc=P2^7;sbitcon1=P0^0;//用于控制继电器,实现档位选择sbitcon2=P0^1; sbitcon3=P0^2; sbitkey1=P0^3; //独立按键局部,用于用户选择量程sbitkey2=P0^4;sbitkey3=P0^5;sbitkey4=P0^6;sbitled1=P2^3; //量程提示灯sbitled2=P2^4;sbitled3=P2^5;sbitled4=P2^6;unsignedinttw;//用于获取定时器的数值floatftemp; //用于计算电容值的中间变量unsignedlongintc; //存放电容值unsignedcharneed; //需要测量时置1,一次测量完毕置0unsignedcharR;//表示不同的档位unsignedcharflag; //数据处理完毕置1unsignedchartemp[8];//存放电容值的各个位 unsignedcharzimu1[]="rangeishigher"; //量程太高unsignedcharzimu2[]="ThevalueofCap";unsignedcharzimu3[]="pleasepresskey";unsignedcharzimu4[]="tomeasure";unsignedcharzimu5[]="rangeislower"; voidprocess(unsignedlongintc); //数据处理函数voidkeyscan(); //键盘扫描函数voidledlight(unsignedcharR); // 量程指示灯函数voidinit_timer0() //定时器0初始化{ TMOD=0x09; //gate置1,方式1,16位计时,定时器由P3.2控制开断 TH0=0x00; TL0=0x00; EA=1; ET0=1; TR0=1;}voidinit_INT1() //定时器0初始化{ EA=1; IT1=1;//下降沿触发 EX1=1;} voidmain(){ ledclc=1; //超量程提示灯熄灭 need=0; //一开场无需测量con1=con2=con3=0; flag=0; init_timer0(); //初始化 init_INT1(); LCD_init(); dispchar1(zimu3); dispchar2(zimu4); while(1) { if(need==1) { //当需要测量时 if(vo==0)//vo==0时检测计数器的值可能还没开场计数,可能计数完毕 { if(TH0!=0x00||TL0!=0x00)//是计数完毕假设有读数,用tw存下 { tw=TH0<<8; tw=tw|TL0; TH0=0x00; //一次完毕,计时器清零 TL0=0x00;need=0;//需要再次测量时,need置1.防止tw的值被更//改即不需要测量时,一直保持 EX1=1; //开外部中断1 } else //反之,证明没有计数,无电容,默认值tw置0 { tw=0; } } ftemp=tw/1.1;//计算电容值根据公式tw=1.1*R*C c=(unsignedlongint)(ftemp)*100;//扩大了一百倍便于后续程序//取两位小数点 process(c); //调用数据处理函数,根据不同的R值进展处理 } if(flag==1)//数据处理完毕每次处理完毕,证明需要更新显示的数据 { if(tw>=50000||ledclc==0) //量程超出 { dispchar3(zimu1);//量程太高 ledclc=0; } elseif(tw<=100&&ledclc==1) //量程太低 { dispchar3(zimu5); ledclc=0; } else { dispchar1(zimu2); disp(temp); } flag=0; } keyscan(); }}voidtimer0()interrupt1 //定时器0中断用于超量程提示{ ledclc=0;}voidexint1 ()interrupt2 //外部中断0用于产生低脉冲,启动555定时器{ unsignedchara; tr=1; //tr端一个负脉冲 a=1; while(--a); tr=0; a=20; while(--a); tr=1; //tr端负脉冲完毕 大约40us的负脉冲 need=1; //表示需要测量 ledclc=1; //关闭先前的超量程提示 EX1=0; //暂时关闭外部中断,一次测量完毕,再开放外部中断}voidprocess(unsignedlongintc){ if(R==1) //10M 的电阻 量程10pf~5000pf { c=c/10; lcd_pos(0x4a); LCD_write_Data(''); LCD_write_Data('p'); LCD_write_Data('f'); LCD_write_Data(''); LCD_write_Data(''); } if(R==2) //100k的电阻 量程5nf~500nf { c=c/100; lcd_pos(0x4a); LCD_write_Data(''); LCD_write_Data('n'); LCD_write_Data('f'); LCD_write_Data(''); LCD_write_Data(''); } if(R==3) //1k欧姆的电阻 量程0.5uf~50uf { c=c/1000; //扩大了一百倍单位c=tw/500uf lcd_pos(0x4a); LCD_write_Data(''); LCD_write_Data('u'); LCD_write_Data('f'); LCD_write_Data(''); LCD_write_Data(''); } if(R==4) //100欧姆的电阻 量程50uf~500uf { c=c/100; //扩大了一百倍单位c=tw/500uf lcd_pos(0x4a); LCD_write_Data(''); LCD_write_Data('u'); LCD_write_Data('f'); LCD_write_Data(''); LCD_write_Data(''); } temp[0]=c/100000; //千位 temp[1]=c/10000%10; //百位 temp[2]=c/1000%10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论