电子测量课程设计.docx
《电子测量课程设计.docx》由会员分享,可在线阅读,更多相关《电子测量课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
电子测量课程设计
课程设计报告
题目:
直流数字电压表
院(系):
电气工程学院
专业:
电子3班
学生姓名:
张XX
学号:
2009447
指导教师:
李老师
写作日期:
2011年12月6日
摘要
数字电压表英文名称为DigitalVoltmeter,简称为DVM,是采用数字化测量技术,把连续的模拟量通过抽样保持电路,AD转换电路转换为离散的数字量的形式,并加以显示出来的仪表,与传统的模拟式电压表相比,具有数据显示直观易读,读数准确,测量范围宽,扩展功能强等优点。
本次设计内容为构建一个简易直流数字电压表,主要方法是利用A/D转换电路将被测的模拟量电压进行采样,转换成数字量,送到微处理器进行数据处理,然后将数据送到显示器上进行输出显示。
该电压表具有测量准确度高,性能稳定,扩展功能强,方便易读等优点。
关键词:
A/D转换;单片机数据处理;LCD液晶显示
1系统目标及概要
本次设计内容为构建一个简易直流数字电压表,利用A/D转换电路将被测的模拟
电压进行采样,转换成数字量并在显示器上显示。
基本要求:
能测量0-5V电压,并用LCD进行显示。
功能完善:
可自由发挥实现各种具有新意的功能。
本次设计功能完善主要有:
(1)具备量程切换档电路,能通过换挡实现-20—20V电压的测量,实现三位半电压的测量,并且LCD显示界面友好。
(2)具备过量程声光报警。
(3)自带系统运行所需的直流稳压电源。
能测量实时温度并在LCD上显示。
2系统方案总体概述及方案
2.1各方案的选择及优缺点
2.11方案一采用集成芯片ICL7106三位半LCD/LED显示A/D转换器。
ICL7106和ICL7107是高性能,低电源,1/2位A/D转换。
包括七个段解码器,显示驱动器,一个参考时钟。
ICL7106是一个液晶接口设计显示器(LCD)包括复背板驱动器;IL7107将直接驱动的仪器大小灯
发光二极管(LED)显示。
ICL7106和ICL7107汇集的组合精度高,通用性和真正的经济。
它功能自动归零
小于10μV,零比1μV/oC,输入漂移偏置电流10pA的(最大),和翻转误差小于一个计数。
真正的差分输入和参考有用所有系统,但给设计师一种罕见的优势
当测量称重传感器,应变计和其他桥梁类型传感器。
最后,单电源的真实经济电源操作(ICL7106),实现了高性能此外只有10被动内置面板仪表。
此方案电路结构简单,经济适用但没有达到练习的目的。
2.12方案二采用逐次比较ADC0804,单片机和LED显示路。
外部被测电压是一种连续的模拟量,而把模拟量测量出来并显示出来需要将模拟量变成数字量,方法是将模拟量经过采样保持电路,量化,编码才成为处理器与显示器可以识别的二进制数。
随着科技的发展,现在的A/D转换器一般都实现了采样保持,量化编码的电路功能。
ADC0804为8位AD,采用逐次比较的原理实现电压转换,转换速度快,但由于与被测电压直接比较,容易产生干扰,误差比较大实际测量转换数据将达不到8位的精度。
LED扫描显示占用CPU处理时间,且扫描显示数据难以达到稳定显示,实现的电路复杂。
2.13方案三应用单片机控制积分式ADC驱动液晶显示电路。
其中在此次方案中我们采用的ADCMC14433为双斜积分式AD转换器。
这种AD为31/2的转换位数直接输出四位BCD码。
转换精度高,但处理时间慢,因为我们在此应用为数字电压表,转换速度要求不是很高,所以考虑稳定度和经济成本的问题。
显示采用1602由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像数码管动态点亮的时候要不断地刷新亮点。
因此,液晶显示器画质高且不会闪烁。
显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
而且体积小、重量轻。
综合上述,我采用的是第三种方案,这种方案在我看来电路简单易懂,能更好的明白数字式电压表的工作原理。
根据所学单片机的内容可以在此电路中加一些扩展电路,比如时钟显示,温度显示等,但考虑的重点主要还是DVM性能的设计。
3电路设计及其原理
3.1微处理器
本次设计中的微处理器是整个系统的核心,主要作用是接收A/D转换的数据,将数据进行运算输出驱动LCD显示。
在本次设计中能胜任此系统的控制与运算功能的处理器多种多样。
由于本系统对数据处理的速度与要求不高,且系统所要实现的控制运算逻辑比较简单,若使用大规模控制系统所需使用的微处理器,而且此类处理器的成本也比较高,因此从性价比的角度选用8051系列单片机比较适合。
因此本次设计采用工业与控制领域应用广泛,本系统的微处理器。
与传统的处理器电路相比,该款处理器芯片实现了高度集成化,将处理器电路所需的算术逻辑单元ALU,随机存储器RAM,只读存储器ROM,多种I/O口和中断系统、定时器/计时器等功能,集成到一块硅片上构成的一个小而完善的计算机系统。
因此大大简化了系统的电路设计。
STC89S52的主要性能参数为:
片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;
片内数据存储器内含256字节的RAM;
具有32根可编程I/O口线;
具有3个可编程定时器;
中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;
串行口是具有一个全双工的可编程串行通信口;
具有一个数据指针DPTR;
低功耗工作模式有空闲模式和掉电模式;
具有可编程的3级程序锁定位;
工作电源电压为5(1+0.2)V,且典型值为5V;
最高工作频率为24MHz。
所以,我在本次设计中采用的是我们所学的单片机STC89C52。
下图为STC89C52单片机的最小系统。
此系统包括单片机复位电路,时钟产生电路,P0口接上拉电阻,P0口为开漏结构,所以无法输出高电平,因此需要外接上拉电阻。
复位电路采用上电自动复位和手动按键复位,STC单片机复位电路为高电平持续一定时间,才能将单片机复位。
3.2ADC的选择及原理
MC14433芯片工作时需要外接RC(接CLK1、CLK2)时钟振荡电阻、C0(接C01、C02)失调补偿电容及R1(接R1、R1/C1引脚)、C1(接C1、R1/C1引脚)积分阻容元件,其内部具有时钟信号发生器,只需外接一电阻就能产生其内部进行A/D转换所需要的时钟信号,当CLK0,CLK1外接300K的电阻时其时钟频率为66KHZ,本次设计的电路就是采用外接300K电阻R6让其转换的时钟信号频率为66KHZ。
积分电阻电容R4和C2的选择应根据实际条件而定。
若时钟频率为66kHz,C2一般取0.1uf。
R4的选取与A/D转换的基准电压有关,当R4为470K时,对应其基准电压为2V,当R4=27K时对应其基准电压为200mV。
本次设计采用的是2V的基准电压源,因此R4选取为470K。
C3为失调补偿电容,其典型值为0.1uf。
其他引脚功能如下:
(1)端:
VAG,模拟地,是高阻输入端,作为输入被测电压UX和基准电压VREF的参考点地。
(2)端:
RREF,外接基准电压输入端。
(3)端:
UX,是被测电压输入端。
(4)端:
RI,外接积分电阻端。
(5)端:
RI/CI,外接积分元件电阻和电容的公共接点。
(6)端,C1,外接积分电容端,积分波形由该端输出。
(7)和(8)端:
C01和C02,外接失调补偿电容端。
推荐外接失调补偿电容C0取0.1μF。
(9)端:
:
DU,实时输出控制端,主要控制转换结果的输出,若在双积分放电周期即阶段。
开始前,在DU端输入一正脉冲,则该周期转换结果将被送入输出锁存器并经多路开关输出,否则输出端继续输出锁存器中原来的转换结果。
若该端通过一电阻和EOC短接,则每次转换的结果都将被输出。
(10)端:
CPI(CLKI),时钟信号输入端。
与CLK0外接一电阻使用内部时钟发生器
(11)端:
CPO(CLKO),时钟信号输出端。
(12)端:
VEE,负电源端,是整个电路的电源最负端,主要作为模拟电路部分的负电源,该端典型电流约为0.8mA,所有输出驱动电路的电流不流过该端,而是流向VSS端。
(13)端:
VSS负电源端(低电平参考端)典型接法是接地。
(14)EOC:
转换周期结束标志输出。
每当一次A/D转换周期结束,EOC端输出一个宽度为时钟周期1/2宽度的正脉冲。
当EOC与DU直接连接时,可以实现每次转换后结果的自动更新。
本次设计采用的就是EOC与DU相连,每次转换结束都更新输出锁存器。
(15)端:
OR,过量程标志输出端,当|UX|>VREF时,OR输出低电平,正常量程OR为高电平。
本设计中外接一个LED与一限流电阻做过量程提示。
(16)~(19)端:
对应为DS4~DS1,分别是多路调制选通脉冲信号个位、十位、百位和千位输出端,当DS端输出高电平时,表示此刻Q0~Q3输出的BCD代码是该对应位上的数据。
(20)~(23)端:
对应为Q0一Q3,分别是A/D转换结果数据输出BCD代码的最低位(LSB)、次低位、次高位和最高位输出端。
(24)端:
VDD,整个电路的正电源端。
3.2.2MC1403基准电压源的电路接法及引脚功能:
由于该A/D转换选择的是2V的基准电压,MC1403的作用就是充当本电路的基准电压源,其特点为:
①温度系数小;②噪声小;③输入电压范围大,稳定性能好,当输入电压从+4.5V变化到+15V时,输出电压值变化量小于3mV;④输出电压值准确度较高,y。
值在2.475V~2.525V以内;⑤压差小,适用于低压电源;⑥负载能力小,该电源最大输出电流为10mA。
MCl403用8条引线双列直插标准封装。
其引脚说明如下:
脚:
电源电压输入端,最大值不能超过40V,
脚:
基准电压输出端,输出2.5V。
脚:
接地端。
由于MC1403输出电压是2.5V,因此需要通过电阻分压获得2V的基准电压。
因此通过调节可调电阻R8可以获得2V的电压提供为M14433作为基准电压。
3.3衰减网络及其原理
衰减电阻网络,在此采用电阻串联的方法组成,因为MC14433的基准电压为2V,所以输入AD的电压小于等于2V,电阻选择为精密可调的电位器分别为100K,10K,2K
可以构成3档电压的测量,分别为+-2V,+-20V,+-200V为了提高输入阻抗和安全我不用+-200V的电压测量。
电路如下图
3.4过量程报警电路
如上图蜂鸣器,PNP型三极管Q1,限流电阻R9构成了系统的过量程报警电路,当接收到A/D转换的数据中判断到所测电压高于量程时,通过单片机载P2.1口输出低电平,此时三极管导通,有电流流过蜂鸣器,蜂鸣器就发出声音。
三极管在这里的作用一是起到开关作用,二是起到电流放大作用,因为蜂鸣器发声需要比较大的电流,而三极管的发射极电流比基极电流大(1+β)倍,因此能驱动蜂鸣器的同时也不至于有很大的灌电流流入单片机的引脚中。
3.4LCD显示电路
LCD接口电路
3.5直流稳压电源电路
为ADMC14433芯片供电采用7805和7905分别提供正负5V电压。
4.系统软件设计及其原理
用C语言编写代码驱动ADC,下图为MC14433的读写时序图
下图为程序流程图的设计
根据流程图编写C程序思路清晰,代码简洁。
5电路性能测试
次数
1
2
3
4
5
6
7
8
9
+-2V
+-20V
6附件
程序代码
/*********************************************
DVM.hfile
*********************************************/
#ifndef__CONFIG_H__
#define__CONFIG_H__
#include
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitds1=P1^4;//各控制引脚定义
sbitds2=P1^5;
sbitds3=P1^6;
sbitds4=P1^7;
sbitrs=P2^5;
sbitrw=P2^6;
sbite=P2^7;
sbitbuzz=P2^1;
unsignedchartime;//设置全局变量,专门用于严格延时
ucharcodeerror1[]="error!
!
";
ucharcodeerror2[]="outofrange";
ucharcodetab1[]="range:
";
ucharcodetab2[]="voltage:
";
ucharcoderag1[]="-2~+2V";
ucharcoderag2[]="-20~+20V";
ucharcodeclr[]="";
uchardisp[7];
#endif/*********************************************
DVM.hfile
*********************************************/
#ifndef__CONFIG_H__
#define__CONFIG_H__
#include
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
sbitds1=P1^4;//各控制引脚定义
sbitds2=P1^5;
sbitds3=P1^6;
sbitds4=P1^7;
sbitrs=P2^5;
sbitrw=P2^6;
sbite=P2^7;
sbitbuzz=P2^1;
unsignedchartime;//设置全局变量,专门用于严格延时
ucharcodeerror1[]="error!
!
";
ucharcodeerror2[]="outofrange";
ucharcodetab1[]="range:
";
ucharcodetab2[]="voltage:
";
ucharcoderag1[]="-2~+2V";
ucharcoderag2[]="-20~+20V";
ucharcodeclr[]="";
uchardisp[7];
#endif
/**********************************************
文件:
DDS.H
功能:
模块H文件
***********************************************/
#include"config.h"
#ifndef__DDS_H__
#define__DDS_H__
externvoidDelay(uintdel);
externvoidAD9850_Rset(void);
externvoidAD9850_kzz(void);
externvoidAD9850_scp(uintAD9850_sc);
#endif
/********************************************************
文件名DVM.c
*********************************************************/
#include
#include
voidad_conver()//A/D转换程序
{
while(!
ds1);//求出千位运算;
disp[1]=P1;
while(!
ds2);//求出百位运算;
disp[2]=P1;
while(!
ds3);//求出十位运算;
disp[3]=P1;
while(!
ds4);//求出个位运算;
disp[4]=P1;
}
voidcompute()//转换A/D转换数据子程序
{ucharmk=disp[1],i,j,temp[4];
disp[6]='V';
if(mk&0x01)
disp[1]=0;//Q3=1,千位为0.
else
disp[1]=1;
if(mk&0x02)
disp[0]='';
else
disp[0]='-';
if(mk&0x09==0x08)
disp[1]=2;
mk=0x01;//提取百十个位数
for(j=2;j<5;j++)
{for(i=0;i<4;i++)
{temp[i]=disp[j]&mk;
mk<<=1;
}
temp[0]<<=3;
temp[1]<<=1;
temp[2]>>=1;
temp[3]>>=3;
disp[j]=temp[0]+temp[1]+temp[2]+temp[3];
mk=0x01;
}
for(i=1;i<5;i++)//把千百十个位转换为ASCII码
disp[i]+=0x30;
}
voiddelay(uintz)
{uinti;
ucharj;
for(i=z;i>0;i--)
for(j=10;j>0;j--);
}
voiddelay2(uintz)
{uinti;
ucharj;
for(i=z;i>0;i--)
for(j=200;j>0;j--);
}
voidwrite_com(ucharm)//写指令函数
{rs=0;
rw=0;
P0=m;
delay(10);
e=1;
delay(10);
e=0;
delay(10);
}
voidwrite_data(ucharn)//写数据函数
{rs=1;
rw=0;
P0=n;
delay(10);
e=1;
delay(10);
e=0;
delay(10);
}
voidinit()//显示初始化函数
{e=0;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据口
write_com(0x0c);//开显示,不显示光标
write_com(0x06);//写入数据后地址指针加1
write_com(0x01);//显示清屏
//write_com(0x80+0);//设置初始显示地址
}
voidwr_lcd(ucharaddr,uchar*str,ucharlength)
{ucharx;
write_com(addr);
for(x=0;xwrite_data(str[x]);
}
voidbuzzer()
{buzz=0;
delay2(2500);
buzz=1;
}
/**********************************************
文件:
MAIN.c
功能:
主程序
***********************************************/
#include"DVM.h"
#include"config.h"
#include"DVM.c"
voidmain()
{
init();
while
(1)
{
ad_conver();//启动A/D转换
compute();//转换A/D转换的数据
if((disp[1]==0x31)&&(disp[2]==0x39)&&(disp[3]==0x39)&&(disp[4]==0x39))//过量程报错
{wr_lcd(0x80,error1,16);
wr_lcd(0x80+0x40,error2,16);
buzzer();
}
else
switch(P3)
{
case0xdf:
{wr_lcd(0x80,tab1,16);
wr_lcd(0x80+0x40,tab2,16);
wr_lcd(0x80+0x07,rag1,9);
disp[5]=disp[4];
disp[4]=disp[3];
disp[3]=disp[2];
disp[2]='.';
wr_lcd(0x80+0x49,disp,7);
}break;
case0xbf:
{wr_lcd(0x80,tab1,16);
wr_lcd(0x80+0x40,tab2,16);
wr_lcd(0x80+0x07,rag2,9);
disp[5]=disp[4];
disp[4]=disp[3];
disp[3]='.';
if(disp[1]==0x30)
{disp[1]=disp[0];
disp[0]='';
}
wr_lcd(0x80+0x49,disp,7);
}break;
default:
break;
}
delay2(1700);
}
}