直流数字电压表设计Word文件下载.docx
《直流数字电压表设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《直流数字电压表设计Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
![直流数字电压表设计Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/31/013f1d8a-f091-4f9f-aec6-ed92793990f5/013f1d8a-f091-4f9f-aec6-ed92793990f51.gif)
MEGA8单片机具有速度高、超功能精简指令等特点,采用16MHZ晶振,完全能满足分辨率15位和转换速度2次/S的要求。
4、显示电路
本设计采用点阵式液晶显示器(LCD)显示。
液晶显示器显示功能强大,可显示各种字体的数字、图像,还可以自定义显示内容,增加了显示的美观性与直观性。
最重要的是提供了友好的人机界面。
第二部分理论分析与计算
一、输入放大与量程自动转换电路
输入电路的主要作用是提高输入阻抗和实现量程的转换。
输入电路的核心是输入放大器和模拟开关CD4066组成的量程自动转换电路,如图2所示。
TG1、TG2是单片机控制的模拟开关,采用CD4066芯片,控制不同的增益。
各种组合分析如下:
(1)200mv量程。
TG2导通,放大电路被接成电压串联负反馈放大器。
放大倍数Af及最大的输出电压Uomx分别为:
图2输入放大与量程自动转换电路
Uomx=200mV×
20=4V
(2)2V量程。
TG1导通,此时的电压放大倍数Af及最大的输出电压Uomx分别为:
Uomx=200×
由上述计算可见,输入A/D转换器的规范电压为0-4V,同时电路被接成了电压串联负反馈放大器形式,输入电阻高达10000㏁,完全达到题目的要求,电路输入端采用RC低通滤波电路抑制交流干扰。
二、三斜积分式A/D转换器
图3三斜积分式A/D转换器的原理图
图3是一个三斜积分式A/D转换器的原理图。
它由基准电压-VREF、、积分器、比较器和由单片机构成的计数控制电路组成。
转换开始前,先将计数器清零,并接通S0使电容C完全放电。
转换开始,断开S0。
整个转换过程分三步进行:
首先,令开关S1置于输入信号Ui一侧。
积分器对Ui进行固定时间T1的积分。
积分结束时积分器的输出电压为:
可见积分器的输出电压与Ui成正比。
这一过程也称为转换电路对输入模拟电压Ui的采样过程。
图4三斜积分式A/D转换波形图
在采样开始时,逻辑控制电路将计数门打开,计数器对周期为Tc的计数脉冲CP计数。
当计数器达到满量程N1,此时计数器由全“1”恢复为全“0”,这个时间正好等于固定的积分时间T1,。
计数器复“0”时,同时给出一个溢出脉冲(即进位脉冲)使控制逻辑电路发出信号,令开关S1转换至参考电压-VREF一侧,采样阶段结束。
三斜积分式A/D转换器的转换波形是将双积分式A/D的反向积分阶段T2分为图4所示的T21、T22两部分。
在T21期间,积分器对基准电压-VREF进行积分,放电速度较快;
在T22期间积分器改为对较小的基准电压进行积分,放电速度较慢。
在计数时,把计数器也分为两段进行计数。
在T21期间,从计数器的高位(2m位)开始计数,设其计数值为N1;
在T22期间,从计数器的低位(20位)开始计数,设其计数值为N2。
则计数器中最后的读数为:
N=N1×
2m+N2
在一次测量过程中,积分器上电容器的充电电荷与放电电荷是平衡的,则
|Ux|T1=VREFT21+(VREF/2m)T22
其中:
T21=N1TcT22=N2Tc
将上式加以整理得:
将上式进一步整理,可得三斜式积分式A/D转化器的基本关系式为
本设计中,取m=8,时钟脉冲周期Tc=120us,基准电压VREF=5V,并希望把2V被测电压变换成N=65536码读数时,由上式可以计算出T1=76.8ms,而传统的双积分式A/D转换器在相同的条件下所需的积分时间T1=307.2s,可见三斜积分式A/D转换器可以使转换速度大幅度提高。
三、计数器的设计
题目基本要求测量分辨率为1mV(2V档),因此计数器至少要11位,发挥部分要求测量分辨率为0.1mV(2V档),计数器至少要15位,故本设计采用MEG8单片机实现控制和脉冲计数,构成16位计数器,内部采用16MHZ晶振,完全满足分辨率15位和转换速度2次/S的要求。
第三部分电路与程序设计
一、三斜积分A/D转换器模拟电路部分
图5三斜积分A/D转换器模拟电路部分
图5为三斜积分A/D转换器模拟电路部分,图中放大电路选用精密运放OP07;
积分电路也选用OP07;
积分电容选用漏电流很小且等效串联电阻、电感都很小的CBB80电容;
比较器选用LM311;
图中的电子开关TG1、TG2、TG3、TG4、TG5、TG6、TG7、TG8均选用模拟开关CD4066芯片,只要将CD4066控制端接到单片机不同控制端口PBX上即可实现不同的开关通断控制。
TG1为自动校零控制、TG2、TG3为量程自动转换控制,TG4、TG5、TG6控制积分的三个阶段,TG7、TG8为转换开始前的控制。
二、单片机控制、计数、显示部分电路
采用MEGA8单片机实现对CD4066模拟开关的通断控制,从而实现量程自动转换、自动校零以及三斜积分A/D转换过程的控制;
同时利用单片机编程实现16位高速计数功能。
显示部分采用1602LCD液晶显示器实现A/D转换数据和测量电压值的显示。
单片机控制、计数器以及LCD液晶显示电路如图6、7所示。
图6单片机控制、计数器电路
图7LCD液晶显示电路
三、基准电压产生电路
图8基准电压信号生成电路
自行设计了一个从0—100mV连续调节的模拟电压信号作为该系统的基准电压源,选用TL431AA,其电压精度可以达到0.5%;
两组电压跟随器选用精密运放OP07;
可变电阻RW101、RW103选用多圈精密可变电阻;
电位器RW102选用10圈线绕精密电位器。
由TL431产生2.50V电压,经电位器RW101分压得到100mV电压送给第一组电压跟随器(由IC101组成)输入端。
第一组电压跟随器的输出由多圈精密电位器RW102进行分压,分压后的信号由第二组电压跟随器(由U2组成)输出0--100mV的可调电压作为A/D转换电路的电压基准。
四、主程序流程(见附录一)
第四部分测试方案与测试结果
为了确定系统与题目要求符合程度,我们对系统中关键部分进行了实际测试。
一、分辨率和测量误差
我们从信号源输入0—2V连续调节的直流电压信号作为该系统的被测信号源,对A/D转换电路的分辨率和测量误差进行了测试。
选取被测信号源的1mV、5mV、50mV、150mV、200mV、300mV、500mV、1V、1.5V、2V点作为测试电压,分别进行了测试,结果见表1:
200mV档
输入电压(mV)
1
5
50
150
200
显示数据(字)
96
498
5004
14997
19997
显示电压值(mV)
0.96
4.98
50.04
149.97
199.97
测量误差
0.04%
0.02%
0.03%
2V档
输入电压(V)
0.3
0.5
1.5
2
显示数据
2998
4996
10004
14998
显示电压值
0.2998
0.4996
1.0004
1.4998
1.9997
从上述测试结果分析,本设计直流数字电压表的测量分辨率和测量误差均能达到题目基本和发挥部分的要求。
二、采样速率测试
A/D转换结束后,单片机输出一个信号驱动发光二极管闪烁,显示A/D转换速度。
用脉冲计数器测得其转换速度大于10次/S,达到了题目要求,结果如表2
测试次数
1
2
3
4
转换速度(次/S)
11
13
12
三、结论
电路设计完成后,通过进行分辨率、测量误差以及转换速度测试,测试结果表明本设计达到了设计的基本和发挥部分的全部要求,并且具备自动校零和自动转换量程的功能。
总结
本系统采用三斜积分式A/D转换器将输入的直流电压ui转换成与ui成正比的时间间隔,在此期间用MEGA8单片机计数器对恒定频率的时钟脉冲计数,计数结束时,计数器记录的数字量正比于输入的模拟电压,从而实现模拟量到数字量的转换。
在设计过程中,因为使用普通器件,元器件较多,而且输入信号较弱容易受到干扰,所以力求硬件电路简单,努力从工艺上下功夫,并对某些电路进行创新。
本系统达到了竞赛题目中的各项要求。
同时,设计过程中遇到了许多困难,设计上还存在许多值得改进的地方。
通过本次设计,我们深刻体会到共同协作和团队精神的重要性,提高了自己解决问题的能力。
参考文献:
1.张军.AVR单片机应用系统开发典型实例.中国电力出版社,2005年
2.曹建平.智能化仪器原理及应用.西安电子科技大学出版社.2004年
3.杨志忠.数字电子技术.高等教育出版社.2000年
附录一:
主程序流程
附录二:
元器件清单
元件清单
直流基准电压产生电路元件清单
器件名
规格(型号)
数量
备注
运算放大器
OP07
精密运算放大器
可调电阻
10KΩ
电阻
20Ω
200Ω
电容
47µ
F/16v
100µ
二极管
1N4007
可调压稳压二极管
TL431AA
精度0.5%
精密电位器
2.2KΩ/2W
十圈线绕式
三斜积分A/D转换电路元件清单
Op07
电压比较器
LM311
高速精密
模拟开关
CD4066
电容
0.22uF
电阻
1KΩ
20kΩ
9kΩ
单片机部分电路元件清单
单片机
Mega8
F
0.1µ
22pF
晶振
16MHz
显示电路元件清单
液晶
WYM1602A
可调电阻
电源电路元件清单
集成电路
CW7805
CW7905
CW7812
CW7912
10Ω
整流桥
RS307L
F、
8
1000µ
12
附录三:
部分源程序
#include<
iom8v.h>
macros.h>
#include"
lcd.h"
stdlib.h>
math.h>
#include<
string.h>
#defineS01<
<
0//pc0gnd
#defineS11<
1//2v
#defineS21<
7//200mvPD7
#defineS31<
2//-vref
#defineS41<
4//-20mv
#defineS51<
3//discharge
#defineS61<
5//Ux
#defineS71<
6//Ix
//全局变量
unsignedchartimetemp=0;
unsignedchartime100ms=0;
unsignedinttime500ms=0;
unsignedcharstepflag=0;
//转换阶段标志-uref?
-uref/27?
unsignedcharconflag=0;
//正在转换标志
unsignedintvoltcount=0;
//ad值
floatvolt=0;
//电压值
unsignedchartimeH=0;
//计数器值
unsignedchartimeL=0;
//函数
voidinit_devices(void);
voidport_init(void);
//1ms
voidtimer2_init(void);
voidtimer2_ovf_isr(void);
//100us
voidtimer1_init(void);
voidtimer1_ovf_isr(void);
voidadadjust(void)
voidadini(void);
voidadconvert(unsignedchardata);
//main()
voidmain()
{
unsignedchari;
unsignedcharlcdbuf[32];
unsignedchar*lcdp=lcdbuf;
init_devices();
Inti_Disp();
adadjust();
adini();
while
(1)
{
adconvert(0x08);
//
set_cur(0);
lcdp=ftoa(volt,0);
putstr(lcdp);
set_cur(16);
ltoa(lcdbuf,voltcount,10);
putstr(lcdbuf);
}
//abc();
}
voidadini(void)
PORDC=0x08;
//放电30ms
timetemp=30;
conflag=1;
voidadconvert(unsignedchardata)//充电
//充电196ms
PORDC=data;
//打开Ux
timetemp=196;
while(timetemp);
//等待
//反向放电
//读取U0值
if(PIND&
0x08)
PORDC=0x10;
//接入-uref/27
stepflag=1;
//qidongcounter
timeH=0;
timeL=0;
else
PORDC=0x04;
//接入-uref
stepflag=2;
//qidongcounter
timeH=0;
dischar1:
while(stepflag==2)
if(PIND&
{
}
else
PORDC=0x10;
}
}
while(PIND&
0x04);
voltcount=timeH;
voltcount=(voltcout<
7)+timeL;
voidport_init(void)
PORTB=0xFF;
DDRB=0xff;
PORTC=0x08;
//m103outputonly
DDRC=0xff;
PORTD=0x7F;
DDRD=0xf3;
//TIMER1initialisation-prescale:
64
//WGM:
0)Normal,TOP=0xFFFF
//desiredvalue:
500uSec
//actualvalue:
500.000uSec(0.0%)
voidtimer1_init(void)
TCCR1B=0x00;
//stop
TCNT1H=0xFF;
//setup
TCNT1L=0x83;
OCR1AH=0x00;
OCR1AL=0x7D;
OCR1BH=0x00;
OCR1BL=0x7D;
ICR1H=0x00;
ICR1L=0x7D;
TCCR1A=0x00;
TCCR1B=0x03;
//startTimer
#pragmainterrupt_handlertimer1_ovf_isr:
9
voidtimer1_ovf_isr(void)
//TIMER1hasoverflowed
//reloadcounterhighvalue
//reloadcounterlowvalue
if(stepflag==1)
//timeH
timeL++;
if(stepflag==2)
timeH++;
//TIMER2initialisation-prescale:
Normal
1mSec
1.000mSec(0.0%)
voidtimer2_init(void)
TCCR2=0x00;
ASSR=0x00;
//setasyncmode
TCNT2=0x06;
OCR2=0xFA;
TCCR2=0x04;
//start
#pragmainterrupt_handlertimer2_ovf_isr:
voidtimer2_ovf_isr(void)
//reloadcountervalue
if(timetemp!
=0)
timetemp--;
conflag=0;
if(time500ms==0)
PORTC^=0x20;
time500ms=500;
time500ms--;
//callthisroutinetoinitialiseallperipherals
voidinit_devices(void)
//stoperrantinterruptsuntilsetup
CLI();
//disableallinterrupts
port_init();
timer1_init();
timer2_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x44;
//timerinterruptsources
SEI();
//re-enableinterrupts
//allperipheralsarenowinitialised