电子设计竞赛报告
题目:多功能测量仪
专业:电子信息工程
小组:飞翔一队
姓名学号:张勇 08021231
李翔 08021211
王赓 08021204
指导教师:王薇
完成日期:20##年5月
目录
一.选题与设计要求
二.电路设计方案论证
三.程序设计语言部分
四.问题与最终结果
五.心得体会
六. 附录
一.选题与设计要求
本次电子竞赛一共有五个题目,我们首先分析了每一个题目的可行性,然后确定题目为c题,即多功能测量仪。A题是关于小车的,由于我们是第一次参加竞赛,对这方面并不熟悉;而小车又是热门题目,向来参赛人较多,拿名次的可能行较小,于是放弃;d,e两题一个是无线通信类,另一个是模拟放大类,这类题目结果很难预料,我们对这方面又不太熟悉,所以也放弃了;那么只剩下B,C两题;我们开始觉得这两个题目本身没太大区别,在网上查询相关资料后,发现C题资料较多,于是我们经过商议C选题。 此题目的主要内容为:制作一个测试电子元器件的简易装置,能够测量电容 和电感的参数。具有良好的结构。
基本要求为:能够测量、显示电容的电容量,基本范围:从100pF到0.1μ F;能够测量、显示电感的电感量,基本范围:从100μH到1mH;测量精度为±5%;具有良好的人机接口。
扩展要求为:扩大被测电容和电感的量程范围;提高电容和电感测量的精度;
具有自动量程转换的功能;具有测试电感Q值(品质因数)的功能;仪器具有良 好的结构,便于使用;其他实用和创新的功能。
二.电路设计方案论证
1.电路原理说明
(1) 系统设计框图
本电路由7部分组成:单片机部分(包括键盘,显示),测电容部分电路,测电感部分电路;电源的解决;系统设计框图如下:
(2) 单片机电路
单片机电路方面,我们用了单片机的定时器跟计数器,通过编程实现单片机的计频率数,然后通过修改例程里面的一个字幕水平滚动的例程来实现待测电感电容数值的显示。
(3) 电容测量电路
电容的测量是通过555振荡电路,得到振荡频率,之后直接送单片机计
数。通过公式计算得到相应电容值。
(4) 电感测量电路
电感的测量是由电容三点式电路振荡产生,之后将正弦波通过一个由555组成的施密特触发器转成方波,输入单片机计算,得到相应电感值。
(5) 电源电路
电源使用+5v电源,由直流电源或外加电路产生,由于时间有限,我们
没有对这部分进行设计。
2. 各主要元件功能分析
(1)单片机电路
电路比较简单,首先是单片机需要+5V电源,所以需要接好电源跟地,然后选择了T1口作为输入,即:定时/计数器1的外部计数输入来接通外部电路产生的频率,然后通过拨码开关来选择测量电路,每个测量电路都对应一个LED灯,方便判别电路的选择,即,拨码开关的6连通的是LED1,拨码开关的2为导通开关,当把2,6同时导通,此时LED1亮,证明选择电感档,在加上待测电感时,此时屏幕上将流动显示出电感的值。而当把开关的2导通,将6断开,此时屏幕将流动显示出待测电感的频率。拨码开关7连通的是LED2,拨码开关的3为导通开关,当把3,7同时导通,此时LED2亮,证明选择的是电容档,再加上待测电容,此时屏幕上将流动显示出电容值。而当把3导通,7断开,此时屏幕将流动显示出待测电容的频率。换句话说,我们的电路还可以当做频率计用,并且还很准。
(2)电容测量电路
测量电容采用“脉冲计数法”,由555组成多谐振荡电路,通过计算振荡
输出频率来计算被测电容大小。
555接成多谐振荡电路,其振荡周期为:
设置R1=R2,得出:
即:
电路分为一档:R4=510K,R4=R6;
电容测量电路如下图:
(3)电感测量电路
电感的测量是采用电容三点式振荡电路(考毕兹振荡电路)来实现的。三
点式振荡电路是指:LC回路中与发射极相连的两个电抗原件必须是同性质的,
另外一个电抗原件必须是异性质的,这三个电抗原件同为电容式的三点式振荡
电路。其震荡频率是:
则:
即:
电感测量电路如图:
测量电感部分电路仿真(multisim):
加施密特触发器后波形:
三.程序设计语言部分
/**********************************************************************************
* *
* ETCEE-101单片机开发板教学例程---北京工业大学电工电子实验教学中心 *
* *
**********************************************************************************/
//------------------------------------------------------------------------------//
// "字幕水平滚动.c",屏幕汉字显示内容以显示位为单位水平移动的例程。 //
//------------------------------------------------------------------------------//
#include "C8051F020.h" //包含C8051F020硬件信息的头文件
#include "absacc.h" //包含绝对地址访问信息的头文件
//数据定义头文件
#include "data_define.c"
//YLF12232操作函数
#include "YLF12232.c"
//CH452操作函数
#include "ch452x.c"
//设备初始化函数,在主程序中调用Init_Device()
#include "Init_Device.c"
long unsigned int nFcnt = 0; //total counter number
/*
*clear display
*/
void clear_display()
{
YLF12232_init();
}
/*
*display a number
*/
void xianshi(unsigned long q)
{
uchar y,b ,c,d,e,g,h,i;//j,k;
uchar z = 0;
unsigned int m = 0;
uchar v = 0;
xdata uchar a[10][2] = {
{0xa3,0xb0},
{0xa3,0xb1},
{0xa3,0xb2},
{0xa3,0xb3},
{0xa3,0xb4},
{0xa3,0xb5},
{0xa3,0xb6},
{0xa3,0xb7},
{0xa3,0xb8},
{0xa3,0xb9}
} ;
clear_display();
y = q%10 ;
b = (q/10)%10 ;
c = (q/100)%10 ;
d = (q/1000)%10 ;
e = (q/10000)%10 ;
g = (q/100000)%10 ;
h = (q/1000000)%10;
i = (q/10000000)%10 ;
// j = (q/100000000)%10 ;
// k = (q/1000000000)%10 ;
LCD_locate(8); //调用显示定位函数从第2行开始存放
// LCD_Ddata_Send(a[k][0],a[k][1]); //2
// LCD_Ddata_Send(a[j][0],a[j][1]); //7
LCD_Ddata_Send(a[i][0],a[i][1]);
LCD_Ddata_Send(a[h][0],a[h][1]);
LCD_Ddata_Send(a[g][0],a[g][1]);
LCD_Ddata_Send(a[e][0],a[e][1]);
LCD_Ddata_Send(a[d][0],a[d][1]);
LCD_Ddata_Send(a[c][0],a[c][1]);
LCD_Ddata_Send(0xa3,0xae); //.
LCD_Ddata_Send(a[b][0],a[b][1]);
LCD_Ddata_Send(a[y][0],a[y][1]);
while(v++ < 4){ //无限次循环
LCD_char_LS(1); //调用字符左移函数左移1个显示位
for(z=0;z<20;z++)
for(m=50000;m>0;m--); //for循环配合空语句实现软件延时
}
}
unsigned long int dianrong(unsigned long int f,char flag)
{
unsigned long R1 = 0;
float Cx = 0.0;
float ln2 = 0.69315;
if(flag == 1){
R1 = 510000;
}else{
R1 = 10000;
}
if (f == 0) {
return 0 ;
}else {
Cx = 1/ (3 * f * ln2 * R1) ;
}
return ( long unsigned int) (Cx * 1000 * 1000 *1000 * 1000)*100;
}
#define PI 3.1415926
unsigned long diangan(unsigned long p)
{
float C = 0.00000005;
float L = 0;
if (p == 0) {
return 0 ;
}else {
L = 4 * PI * PI * p * p;
L = L * C;
L = 1 / L; //L = 1/(4*PI*PI*P*P*C)
}
return (unsigned long int )(L * 1000 * 1000) * 100 ;
}
void counter_0_interrupt(void) interrupt 3 using 0
{
EA = 0;
TR1 = 0;
ET1 = 0;
nFcnt = nFcnt + 0xffff;
TR1 = 1;
ET1 = 1;
EA = 1;
}
void timer_0_interrupt(void) interrupt 1 using 0
{
unsigned short nTmp = 0;
static uchar m = 0;
uchar st = 0;
//first stop the timer and disable the interrupt
EA = 0;
TR0 = 0;
ET0 = 0;
//interrupt handler action
if(m == 183){ //timer run over
TR1 = 0;
ET1 = 0;
nTmp = ((nTmp + TH1 ) << 8) + TL1;
nFcnt = nFcnt + nTmp;
st = P2;
if(!(st & 0x10)){
xianshi(diangan(nFcnt));
}else if(!(st & 0x20)){
xianshi(dianrong(nFcnt,1));
}else if(!(st & 0x80)){
xianshi(dianrong(nFcnt,2));
}else{
xianshi(nFcnt*100);
}
TH1 = 0x0;
TL1 = 0x0;
nFcnt = 0;
m = 0;
}else{
m++;
}
//init the time value
TL0 = 0x77;
TH0 = 0xEC;
//start timer and enable interrupt
ET1 = 1;
ET0 = 1;
TR1 = 1;
TR0 = 1;
EA = 1;
}
void init_timer0(void)
{
//set Timer0
PT0 = 1;
PT1 = 0;
//TMOD working at timer mode
TMOD = 0x51;
//timer start value;
TL0 = 0x77;
TH0 = 0xEC;
//counter start value
TH1 = 0x0;
TL1 = 0x0;
//ET0 = 1 INTERRUPT
ET1 = 1;
ET0 = 1;
//start timer and counter
TR1 = 1;
TR0 = 1;
//enable global interrupt
EA = 1;
}
void main(void)
{
Init_Device(); //调用设备初始化函数
init_timer0();
while(1){
}
}
四.问题与最终结果
由于本实验外围电路并不多,主要只有测电容和测电感部分。两部分都不是很
复杂。在焊接电路后,也都能谐振出相应的频率;而在这之后,我们却遇到了一个
能以解决的问题:信号的幅值不够,无法送单片机直接计数;于是我们想到了放大。
可是,不管我们用什么方法,都难以实现信号的完整放大。这是硬件电路的致命缺
点,使我们的测量范围受限。
还有就是Q值的问题。由于我们使用的不是R,L,C的震荡电路,使 Q值的测
量变得复杂。我们不知道该如何计算R,L,C。而且由于时间的有限,这个问题就一
直没有解决。
软件及编程方面,我们也曾遇到各种各样的问题,比如:我的电脑是WIN7的系统,有些软件没法安装,找同学帮忙也没有解决,最后跟同学借了一个XP系统的电脑才解决,由于之前的疏忽大意,有些文件没有及时从网上下载下来,导致后面的很多问题变得很复杂,从安装C8051FXXX IDE开始,好多安装的注意事项,比如需要修改路径什么的 。然后就是要保证硬件连接正确,首先要做到适配器的USB线接好计算机,适配器的10线扁平电缆接头接到单片机板上。然后就是接通单片机电源。最后就是最重要的:首次使用,要将连接口设置为USB口。由于疏忽大意,第一次,我们没有将单片机电源接通,找了半天的问题,最后才发现是电源没接通。软件也用了一些熟悉。然后就是编程的问题,由于用了一个例程,好多东西就不用再自己编,单片机方面就需要加个中断和定时计数即可。然后定义一些变量,编几个需要用到的公式。
最终结果:
680UH电容的显示值
100PF电感显示值
五.心得体会
经过实验室中数十个小时的努力,我们终于顺利地完成了本选题的基本功能。虽然我们的测量范围还很有限,虽然我们的一些扩展要求难以实现,但我们通过这几周的实验进一步增强了我们的动手能力和分析问题,解决问题的能力。
我们通过这次难得的机会,体验了从对所给的实际问题的思考,到抽象出电路模型;从利用所学的知识设计出电路,到一根线一根线把它接出来付诸实践;从调试中遇到困难到细心找原因并成功完成的非常有益的过程,我想这对培养我们的科研精神会很有帮助,同时也深刻地体验到了一项发明设计从构想到最终实践制成成品有多么的艰辛,这需要设计者有较高的综合能力。
面对所要实现的功能,起初我们无从下手。虽然之前曾经学习过单片机这门功课,但由于基础知识不扎实,加之处理实际问题经验尚浅,使得我们有一段时间几乎停滞工作,但为了能够顺利完成课设任务也只好硬着头皮往下作。经过同学之间的讨论,我们首先画出了系统编程流程图,迈出了成功的第一步,接下来,通过网上查询资料,我们终于确定了电路的设计。然而在调试当中却遇到了各种各样的问题,有些问题已经解决,有些问题却没有。同样,在软件上出现的问题更是多如牛毛,但经过老师和同学们的帮助,我们还是闯了过来。最终攻克了这一道道的难关。
所以在这次设计中,我们的收获特别大,不仅学到了很多专业知识,得到了许多专业技能,增长了工程试验的经验,而且坚定了自己的信心和理想。这次竞赛虽然累,但是我们也同时得到了快乐,坚定了我们的目标。知识上的收获并不是全部,非知识上的收获有着同样重要的地位,首先是培养了自己的坚持到底,永不放弃的精神,另外,我们也明白,一个人的力量是有限的,像这样一个复杂的任务,仅靠一个人是很难完成的,而只有具有团队协作、相互支持的精神,以及默契的合作精神才能突破一道道重围。
同时,借此机会我们要感谢课设期间所有帮助,支持我们的老师们和同学们,特别是赵颖老师跟王薇老师,跟赵颖老师要了许多芯片,跟王薇老师问了许多问题,没有他们的帮助,我们也不会如此顺利地完成任务。
六.附录
单片机相关介绍
ETCEE-101单片机开发板由单片机板(A板)和人机交互板(B板)二部分组成。A 板是开发板的核心部分,主要由一片美国silicon Labs公司的C8051F020单片机组成。B板是开发板的人机交互部分,由122×32点阵LCD和12键键盘组成。A 板和B板之间通过6条信号线和2条电源线相连。
C8051F020单片机采用与8051兼容的CIP-51微控制器作为内核,其指令与MCS-51系列单片机完全兼容,但是与经典的MCS-51单片机相比:串、并行接口更丰富;指令执行速度更快;功能更强大。A板分别通过1条34线和1条26线的双排插针将单片机的信号引出,34线双排插针主要引出串行接口的信号线和通用I/O端口的信号线,26线双排插针主要引出并行接口信号线、模入/模出信号线和专用功能控制信号线。开发板使用时通过双排插针与通用实验台ETCEE-100相连,通过ETCEE-100的内部连线与其他电路板相连,可以完成一般的单片机应用设计。
B板的122×32点阵LCD采用串行操作,带有中文字库,可以显示ASCII字符、汉字和图形。键盘由专用集成电路CH452进行控制,CH452也采用串行操作。B板也有34线和26线的双排插针各1条,34线双排插针连接了LCD与键盘操作必需的信号线,26线双排插针未连信号线仅用作结构支撑。A板和B板的34线双排插针通过ETCEE-100内部的连线连接在一起,所以A板上的单片机可以通过34线双排插针控制人机交互板,也可以通过A板与B板之间直通的信号连线对人机交互板进行控制。
图1-1 单片机开发板实物图
LM555芯片介绍以及引脚图
LM555 时基电路内部由分压器、比较器、触发器、输出管和放电管等组成,是模拟电路和数字电路的混合体。其中 6 脚为阀值端(TH),是上比较器的输入。2 脚为触发端(TR),是下比较器的输入。3 脚为输出端(OUT),有 0 和 1 两种状态,它的状态由输入端所加的电平决定。7 脚为放电端(DIS),是内部放电管的输出,它有悬空和接地两种状态,也是由输入端的状态决定。4 脚为复位端(R),叫上低电平(< 0.3V)时可使输出端为低电平。5 脚为控制电压端(CV ),可以用它来改变上下触发电平值。8 脚为电源(VCC),1 脚为地(GND)。 一般可以把 LM555 电路等效成一个大放电开关的 R-S 触发器。这个特殊的触发器有两个输入端:阀值端(TH)可看成是置零端 R,要求高电平;触发端(TR)可看成是置位端 S,低电平有效。它只有一个输出端 OUT,OUT 可等效成触发器的 Q 端。放电端(DIS)可看成由内部放电开关控制的一个接点,放电开关由触发器的反 Q端控制:反 Q=1 时 DIS 端接地;反 Q=0 时 DIS 端悬空。此外这个触发器还有复位端 R,控制电压端 CV,电源端 VCC 和接地端 GND。 这个特殊的 R-S 触发器有两个特点:(1)两个输入端的触发电平要求一高一低:置零端 R 即阀值端 TH 要求高电平,而置位端 S 即触发端 TR 则要求低电平。(2)两个输入端的触发电平,也就是使它们翻转的阀值电压值也不同,当 CV 端不接控制电压是,对 TH(R) 端来讲,> 2/3VCC 是高电平 1,< 2/3VCC 是低电平 0;而对 TR(S)端来讲,> 1/3VCC 是高电平 1,< 1/3VCC 是低电平 0。如果在控制端 CV 加上控制电压 VC,这时上触发电平就变成 VC 值,而下触发电平则变成 1/2VC。可见改变控制端的控制电压值可以改变上下触发电平值。
LM555引脚图