搜档网
当前位置:搜档网 › 双积分AD转换设计

双积分AD转换设计

双积分AD转换设计
双积分AD转换设计

2013年全国大学生电子设计竞赛

双积分AD转换(A题)

【高职高专组】

2013年7月2日

摘要:本系统是一个双积分AD转换设计,该系统能测量-5V到+5V的模拟电压,并在LCD1602上显示,并且精度为±1%。此设计选用的器件有单片机(STC89S52)、运放OP07,、模拟开关(CD4052)、比较器(LM311)和LCD1602等其他元件。由于单片机不能测出负电压,故将待

测电压和+5V基准电压做加法,通过单片机控制模拟开关闭合使电容充电,到了时间后在接

入相反的基准电压让电容放电,单片机计算出定值积分的时间后,就可以算出待测电压的值,并显示在LCD1602上。

关键词:双积分AD、模拟开关、LCD1602。

Abstract:This design is a double integral AD conversion experiment, this system can measure - 5 v and + 5 v analog voltage, and display on LCD1602, and accuracy was 0.5%. This design chooses the device with single chip microcomputer (STC89S52), op-amp OP07, and analog switch CD4052, comparator (LM311) and LCD1602 and other components. Due to the single-chip computer can't detect a negative voltage, the voltage under test and + 5 v voltage reference to do addition, through the single-chip microcomputer control the capacitor charging, the analog switch is closed in time after access instead of reference voltage capacitance discharge, single chip microcomputer to calculate the fixed value integral of time, you can calculate the value of the voltage under test, and in the LCD1602 display.

Keywords:Double integral of the AD Analog switch LCD1602

目录

1系统方案选择和论证

1.1课题任务及要求 (4)

1.2 指标及功能要求 (4)

1.3系统方案论证及选择 (4)

1.3.1方案一 (4)

1.3.2方案二 (5)

1.3.3方案论证 (5)

2系统理论分析与计算 (5)

2.1 总体的分析 (5)

2.2 整体的计算 (6)

3. 单元电路设计与计算 (6)

3.1 系统的总体设计,系统的计算 (7)

3.2 单元电路的设计,单元的参数计算 (7)

3.3 单元电路的功能以及工作原理的分析 (8)

3.4 发挥部分的设计与实现 (8)

3.5 电路原理图 (8)

4. 程序设计 (8)

4.1程序功能描述与设计思路 (9)

4.2程序总体流程图 (9)

4.3 各个功能模块流程图 .................................. 错误!未定义书签。

4.4 程序清单 (9)

5.测试方案与测试结果 (10)

5.1测试方案 (10)

5.2 测试条件与仪器 (10)

5.3 测试结果及分析 (10)

5.3.1测试结果(数据) (10)

5.3.2测试分析与结论 (10)

6. 结论 (11)

7. 参考文献 (11)

附录1:放大电路电路原理图 (11)

附录2:控制与显示部分 (13)

附录3:源程序 (12)

附录4:原器件清单 (12)

1系统方案选择和论证

1.1课题任务及要求

基本部分:测量-5V到+5V的电压,并显示出来,每秒至少测3次。

发挥部分:可以提高系统的精度、不测量时进入低功耗模式。

1.2 指标及功能要求

在测电压时,要求精确到毫伏级,并能测出负电压。

1.3系统方案论证及选择

1.3.1方案一

如图1所示,将输入的电压做绝对值变换,使输出到给电容充电的电压在0到5伏内,通过单片机选通模拟开关,第一步把电容两端短接使输出电压为0,第二步将绝对值转换后的电压选通给电容充电,第三步,选通-5伏的基准电压给电容放电,当放到0的那一刻,比较器翻转,单片机计算出定值积分的时间,就可测出待测电压了。

图1

1.3.2方案二

将待测电压经过电压跟随器与+5V电压做反相加法,输出的电压范围在-10到0V之间,通过单片机选通模拟开关,第一步把电容两端短接使输出电压为0,第二步将绝对值转换后的电压选通给电容充电,第三步,选通+5伏的基准电压给电容放电,当放到0的那一刻,比较器翻转,单片机计算出定值积分的时间,从而测出待测电压值。

1.3.3方案论证

我们选择的第二个方案,第一个方案做绝对值变换输出的电压有较大误差,第二种方案相对较简单,也易于实现,故选第二种方案。

2系统理论分析与计算

2.1总体的分析

图2

其总体设计如上图所示,将待测电压经过电压跟随器与+5V电压做反相加法,输出的电压范围在-10到0V,通过单片机选通模拟开关,第一步把电容两端短接使输出电压为0,第二步将反向加法器的基准电压选通给电容充电,第三步,选通+5伏的基准电压给电容放电,当放到0的那一刻,比较器翻转,单片机计算出定值积分的时间,测出待测电压,并在LCD1602上显示。

待测电压与+5V电压做反相加法

CD4052 单片机+5V反相充电基准电压

LM311比较器

积分器

2.2系统的总体设计与计算 2.2.1 系统的总体设计:

AD 转换器硬件电路 图3

2.2.2 系统总体计算:

第一次积分:对模拟量Vo1 进行积分,

积分时间为T1,积分后的电压为Vo2

2

112111t o o o t T V V dt V RC RC =-=-? (1) 第二次积分:对基准电压ref V 进行反向积分 ,当到 0v 时,比较器翻转,单片机控制模拟开关停止积分,由单片机计算出积分时间T2。

()3

2

2110t o o ref t V V V dt RC =--=?

(2) 由上1﹑2式得

2

11

o ref T V V T =- ))5((1+-=i o V V (3)

由于T 1和基准电压都为定值,所以Vo1与时间T 2成正比。

2.2.3 T1与T2的确定: 根据公式:

2

112111t o o o t T V V dt V RC RC

=-=-? 显然2o u 不能超过OP07-3的输出电压范围(<10V ),再根据V01的极限值(-10v ),可算出T1的最大取值:

V T V RC

10101

1

再根据公式(3)得

11

2O ref

V V T T =

由此可以计算出

1o V ,通过单片机处理就可算出输入电压。

3. 单元电路设计与计算

3.1单元电路的设计,单元的参数计算

积分电路:

图4

基准源电路:

图5

LM336组成的电路构成基准源,提供5V的基准电压。抬高反向加法器的输入电压,使之为0V~10V,从而使其输出电压为-10V~0V.

反相加法器电路:

图6

在正常转换过程中,Vin输入端的开关Ry断开,输入待测电压信号(-5v~+5v)此信号经过运放OP07-1构成的电压跟随器后输入

到运放OP07-2反向输入端,加入电压跟随器的目的是提高输入电阻。

运放OP07-2构成的加法器其输入为: Vo1=-(Vi+Vref)

Vref为补偿电压,将双极性输入电压Vi转换成单极性电压Vo1,方便单片机控制。

3.2发挥部分的设计与实现

我们实际做的精度很高,误差只有1个毫伏,满足设计的要求。

4. 程序设计

4.1程序功能描述与设计思路

通过51单片机控制模拟开关的闭合,使电容充放电,计算出放电的时间,从而求出输入电压。第一步,接通电容两端,让电容上的电放完。第二步,接通反相加法后的电压。计时时间到了后接通5V的基准电压,给电容放电,当放到0时比较器翻转,单片机计算出放电时间,经过公式计算算出待测电压。

4.2程序总体流程图

初始化

进入死循

电容两端短

正向积分

是否溢出反向积分是否中断计算并显

N Y

N Y

5.测试方案与测试结果

5.1测试方案

先测基准电压那个模块,这个比较简单,然后检测把待测电压输入端接

地时加法器的输出,确定是-5V 后,再测比较器,用信号发生器产生一个正弦波,观察比较器输出是否为方波。测试通过后,最后测试模拟开关与积分器,编了一个测试代码,按照三个步骤,先电容两端短接,让电容上的电为0,延时,正向充电,延时一会,放电, 当比较器翻转时,把电容再短接,如此重复,用示波器可以观察到一个三角波。

5.2 测试条件与仪器

测试温度:室温

测试仪器:直流稳压电源﹑数字示波器﹑信号发生器、万用表等。

5.3 测试结果及分析

5.3.1测试结果(数据)

实际值 被测值 误差 备注 -5.000 -5.000 0 -4.002 -4.002 0 -3.001 -3.001 0 -2.002 -2.002 0 -1.003 -1.004 0.001 0.000 0.001 0.001 1.004 1.004 0 1.999 2.000 0.001 3.001 3.000 0.001 4.002 4.001 0.001

4.122 4.120 0.002 4V 到5V 之间电压误差较大可以通过软件矫正,用switch case 判断看电压值所在区间和标准之比

较,多减少加

4.499 4.496 0.003 4.722 4.717 0.005

5.000

4.995

0.005

5.3.2测试分析与结论

根据测试结果可以看出,在一定程度上基本达到了题目要求,但是还是存在一定的误差,加上电路板的合理布局和电容的选择及外界的干扰(主要是工频干扰)等因素都会引起电压的变化,导致测试的结果不准.可以通过加大电阻,在不失真的情况下提高T1的计时时间,使最大输入电压接近运放的最大输出电压,这样来提高精度。

6. 结论与体会

本电路的设计保留了双积分A/D转换的主要特点,且整个电路组成的成本低廉,转换精度高,速度快等优点。因此在数据采集系统及其他应用系统中有很好的使用价值。

经过两周的焊接与调试,加上老师的精心辅导,终于完成了本次双积分AD转换的设计。在硬件调试的过程中遇到了很多问题。在测试反向加法器时,输出电压居然是个正值,然后检查同相端与反相端的电位,发现都不为0,而理论应该是0V,经过查找,发现是负电源没接好。后面测试模拟开关就用单片机编了一个小测试程序观察输出波形是否正常。最后整个板子调试没什么问题了。把程序下载到单片机进行控制就没有波形了。在老师的指导下,把把计时方式由自动重装改为工作方式一16位计时器,最大可以到65535,可以满足设计的要求,把外部中断也改为查询法,有效的避免了出现漏波的情况。改了后波形很完美,但就是计算的结果没有出来,这个问题纠结了很长时间都没解决,于是就去怀疑硬件有问题,把控制部分和显示部分又焊了一个,最后发现还是不行。再去仔细检查程序时,直接找到计算处理部分,就是一个小问题,运算优先级的问题没解决,改了后结果通过软件处理后误差较低,基本满足设计要求。

7.参考文献

1.模拟电子基础(第四版)童诗白华成英

2.电子技术基础(模拟部分)庚华光

附录1:测量部分原理图

附录2:控制和显示部分

元器件名称元器器件型号元器件个数单片机STC89S52 1

液晶显示屏LCD1602 1

比较器LM311 1

运放OP07 4

模拟开关CD4052 1

电压基准LM336 1

电容聚苯电容1uF 1

导线若干

电阻若干

附录:3:源程序

/************************************************** Filename:双积分AD

2013.6.28

**************************************************/

#include

#include"LCD1602.H"

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit Key_A=P1^0; //模拟开关,控制选通不同的模式sbit Key_B=P1^1;

sbit INH=P1^2;

sbit down_flag=P3^2;

uchar Voltage_buff[]={"Voltage:00.000v"};

uchar test_count[]={"00000us"};

uint Voltage;

uint T2_count;

bit flag;

sbit Int=P3^2;

/**延时**/

void delayms(uint z)

{

uint i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

/**主函数**/

void main()

{

uint temp;

uchar num=0;

P0=0xFF;

P1=0xFF;

P2=0xFF;

P3=0xFF;

INH=0; //使能开关

TMOD=0x11;

TH0=0xd8; //10ms

TL0=0xf0;

TH1=0;

TL1=0;

lcd_init();

while(1)

{

Key_A=0; //第一步,将电容上的电放完Key_B=1;

delayms(10); //等电放完

Key_A=0; //第二步,正向充电

Key_B=0;

TR0=1; //开始定时

while(!TF0); //T1计时时间到

TF0=0;

TR0=0;

TH0=0xd8;TL0=0xf0;

Key_A=1; //开始反向积分

Key_B=0;

TR1=1; //开始定时

while(down_flag);

TR1=0; //停止计时

Key_A=0; //电容两端短接

Key_B=1;

temp=TH1;

temp<<=8;

T2_count=temp+TL1;

TH1=0;TL1=0;

Voltage=(T2_count)*0.5042;

if(Voltage>=5071)

{

Voltage=Voltage-5051-20; //电压修正

if(Voltage<4000)

Voltage=Voltage-1;

else if(Voltage<4500)

Voltage=Voltage+0;

else if(Voltage<4800)

Voltage=Voltage+1;

else if(Voltage<4900)

Voltage=Voltage+2;

Voltage=Voltage+3;

else if(Voltage<4950)

Voltage=Voltage+4;

else if(Voltage<4970)

Voltage=Voltage+5;

else

Voltage=Voltage+7;

Voltage_buff[8]=' ';

Voltage_buff[9]=Voltage/1000+0x30;

Voltage_buff[11]=Voltage/100%10+0x30;

Voltage_buff[12]=Voltage/10%10+0x30;

Voltage_buff[13]=Voltage%10+0x30;

}

else

{

Voltage=5071-Voltage;

if(Voltage<20)

Voltage=Voltage+1;

else if (Voltage<3000) //电压修正Voltage=Voltage-0;

Voltage=Voltage-2; else if(Voltage<4000) Voltage=Voltage-3; else if(Voltage<4300) Voltage=Voltage-4; else if(Voltage<4500) Voltage=Voltage-5; else if(Voltage<4700) Voltage=Voltage-6; else if(Voltage<4800) Voltage=Voltage-8; else if(Voltage<4900) Voltage=Voltage-9; else if(Voltage<4950) Voltage=Voltage-12; else

Voltage=Voltage-13; Voltage_buff[8]='-';

Voltage_buff[9]=Voltage/1000+0x30;

Voltage_buff[11]=Voltage/100%10+0x30;

Voltage_buff[12]=Voltage/10%10+0x30;

Voltage_buff[13]=Voltage%10+0x30;

}

LCD_disp_chars(0,0,Voltage_buff);

test_count[0]=T2_count/10000+0x30;

test_count[1]=T2_count/1000%10+0x30;

test_count[2]=T2_count/100%10+0x30;

test_count[3]=T2_count/10%10+0x30;

test_count[4]=T2_count%10+0x30;

LCD_disp_chars(0,1,test_count);

delayms(200);

T2_count=0;

}

}

相关主题