来自:weblib > 馆藏分类
配色: 字号:
2007年G题 积分型直流数字电压表设计
2020-02-01 | 阅:  转:  |  分享 
  
2007年G题积分型直流数字电压表设计

本设计为16位高分辨率的三斜积分式直流数字电压表,A/D转换器部分采用普通元器件构成模拟部分,利用MEGA8单片机借助软件实现数字计数显示功能,同时采用MEGA8单片机编程实现直流电压表量程





济南铁道职业技术学院 丁华、张亮、胡刚正

目录

摘要……………………………………………………………………1

第一部分:系统方案…………………………………………………1

第二部分:理论分析与计算…………………………………………2

第三部分:电路与程序设计…………………………………………4

第四部分:测试方案与测试结果……………………………………6

总结……………………………………………………………………6

参考文献………………………………………………………………6

附录一主程序流程图………………………………………………7

附录二元器件清单……………………………………………………8

附录三部分源程序……………………………………………………9

??

摘要:本设计为16位高分辨率的三斜积分式直流数字电压表,A/D转换器部分采用普通元器件构成模拟部分,利用MEGA8单片机借助软件实现数字计数显示功能,同时采用MEGA8单片机编程实现直流电压表量程的自动转换、自动校零、和液晶显示等功能。

关键词:三斜积分,A/D转换,电压测量



第一部分系统方案

一、??????总体电路构成

本系统由输入放大与量程转换电路、三斜积分A/D转换电路、单片机计数控制电路、LCD数字显示器构成。总体结构框图如图1所示。

?

图1总体电路框图

二、各单元电路设计

1.输入放大与量程自动转换电路的设计

输入放大与量程自动转换电路的主要作用是提高输入阻抗和完成量程转换,本设计采用OP07集成运算放大器构成同相比例放大电路,以提高电路的输入阻

抗,以达到题目要求,模拟开关CD4066在单片机的控制下形成不同的通断组合,实现量程的自动转换和自动校零功能。

2.积分式A/D转换器的设计

虽然双积分式A/D转换器具有抗干扰能力强的特点,在采用零点校准的前提下,其转换精度也可以做得很高,但显著的不足是转换速度较慢,并且分辨率越高,其转换速度也就越慢。因此本设计采用了分立元件构成的三斜积分式A/D转换器,可以较好的改善转换速度慢的缺点,它的转换速率分辨率的乘积比传统的双积分式A/D转换器提高至少两个数量级。

3、单片机计数、控制电路的设计

通过对A/D转换电路的方案分析,本设计采用三斜积分电路和单片机编程实现A/D转换。脉冲的计数功能由单片机实现,所以对单片机的速度提出了较高的要求。本课题基本要求分辨率为11位,转换速度不低于2次/S;发挥部分要求分辨率15位,若采用MCS-51单片机实现控制和脉冲计数,转换速度较慢。因此本设计采用了MEGA8单片机实现控制和脉冲计数。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×20=4V

由上述计算可见,输入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。则计数器中最后的读数为:



在一次测量过程中,积分器上电容器的充电电荷与放电电荷是平衡的,则

|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.04% 0.03% 0.03% ?

?

2V档 输入电压(V) 0.3 0.5 1 1.5 2 显示数据 2998 4996 10004 14998 19997 显示电压值 0.2998 0.4996 1.0004 1.4998 1.9997 测量误差 0.02% 0.04% 0.04% 0.02% 0.03% 从上述测试结果分析,本设计直流数字电压表的测量分辨率和测量误差均能达到题目基本和发挥部分的要求。

?

二、采样速率测试

A/D转换结束后,单片机输出一个信号驱动发光二极管闪烁,显示A/D转换速度。用脉冲计数器测得其转换速度大于10次/S,达到了题目要求,结果如表2

测试次数 1 2 3 4 转换速度(次/S) 11 13 12 12 三、结论

电路设计完成后,通过进行分辨率、测量误差以及转换速度测试,测试结果表明本设计达到了设计的基本和发挥部分的全部要求,并且具备自动校零和自动转换量程的功能。

总结

本系统采用三斜积分式A/D转换器将输入的直流电压ui转换成与ui成正比的时间间隔,在此期间用MEGA8单片机计数器对恒定频率的时钟脉冲计数,计数结束时,计数器记录的数字量正比于输入的模拟电压,从而实现模拟量到数字量的转换。

在设计过程中,因为使用普通器件,元器件较多,而且输入信号较弱容易受到干扰,所以力求硬件电路简单,努力从工艺上下功夫,并对某些电路进行创新。本系统达到了竞赛题目中的各项要求。同时,设计过程中遇到了许多困难,设计上还存在许多值得改进的地方。通过本次设计,我们深刻体会到共同协作和团队精神的重要性,提高了自己解决问题的能力。

参考文献:

1.张军.AVR单片机应用系统开发典型实例.中国电力出版社,2005年

2.曹建平.智能化仪器原理及应用.西安电子科技大学出版社.2004年

3.杨志忠.数字电子技术.高等教育出版社.2000年

附录一:主程序流程

?

?

?

附录二:元器件清单

元件清单 直流基准电压产生电路元件清单 器件名 规格(型号) 数量 备注 运算放大器 OP07 2 精密运算放大器 可调电阻 10KΩ 1 电阻 20Ω 1 200Ω 1 电容 47μF/16v 3 100μF/16v 2 二极管 1N4007 2 可调压稳压二极管 TL431AA 1 精度0.5% 精密电位器 2.2KΩ/2W 1 十圈线绕式 三斜积分A/D转换电路元件清单 运算放大器 Op07 2 精密运算放大器 电压比较器 LM311 2 高速精密 模拟开关 CD4066 2 ? 电容 0.22uF 1 ? 电阻 1KΩ 1 20kΩ 1 9kΩ 1 ? 电压比较器 LM311 1 可调电阻 10KΩ 4 单片机部分电路元件清单 单片机 Mega8 1 电容 100μF 1 0.1μF 1 22pF 2 电阻 10KΩ 1 晶振 16MHz 1 显示电路元件清单 液晶 WYM1602A 1 可调电阻 1KΩ 1 电源电路元件清单 集成电路 CW7805 1 CW7905 1 CW7812 1 CW7912 1 电阻 10Ω 4 整流桥 RS307L 2 电容 0.1μF、 8 1000μF 12 ? 附录三:部分源程序

#include

#include

#include"lcd.h"

#include

#include

#include

#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];

unsignedcharlcdp=lcdbuf;



init_devices();

Inti_Disp();

adadjust();

adini();



while(1)

{

adini();

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;

conflag=1;

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;

timeL=0;

}

dischar1:

while(stepflag==2)

{

if(PIND&0x08)

{



}

else

{

PORDC=0x10;//接入-uref/27

stepflag=1;//qidongcounter

}



}

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

TCNT1H=0xFF;//reloadcounterhighvalue

TCNT1L=0x83;//reloadcounterlowvalue

if(stepflag==1)

{

//timeH

timeL++;



}



if(stepflag==2)

{

timeH++;

}



}

?

//TIMER2initialisation-prescale:64

//WGM:Normal

//desiredvalue:1mSec

//actualvalue:1.000mSec(0.0%)

voidtimer2_init(void)

{

TCCR2=0x00;//stop

ASSR=0x00;//setasyncmode

TCNT2=0x06;//setup

OCR2=0xFA;

TCCR2=0x04;//start

}

?

//1ms

#pragmainterrupt_handlertimer2_ovf_isr:5

voidtimer2_ovf_isr(void)

{

TCNT2=0x06;//reloadcountervalue



if(timetemp!=0)

timetemp--;

else

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

}

?



献花(0)
+1
(本文系weblib首藏)