可变量程的直流电压表

一、      实习内容、要求及指标

设计一个可变量程的直流电压表,要求及设计指标如下:

1.测量范围:0-20V直流电压,设置三个量程:0-200mV200 mV-2V2V-20V,实现自动换档。

2.测量精度:20 mV

3.测量误差允许范围:<=1%

4.显示:用四位七段数码管显示电压读数。

二、      方案分析及论证

1.      自动换档(模拟部分)设计方案分析与论证

方案一:考虑到ADC0809的八路模拟量输入通道本质上也是模拟开关,因此可以利用其八个模拟通道中的三个作为换档选择器,即根据通道对应的电压测量范围确定对应的电压放大倍数设计对应的前置放大电路。

方案二:选用模拟开关芯片4066实现换档。4066集成了4个模拟开关,每一路开关都有一个控制端控制对应开关的通断。用单片机对控制端进行控制,实现不同量程的转换。

方案论证:选用方案一可以节省一片CD4066芯片,但采用该方案时如果由于换档环节没有控制好的话很可能造成ADC0809芯片的损坏,而ADC0809远比CD4066高。另外采用ADC0809做模拟开关势必会增加所需运算放大器的数量并且增加单片机程序编写的难度,综合考虑之,我们采用方案二。

2.      译码显示部分方案分析与论证

方案一:选用优先译码器74LS138对四片用来显示电压读数的数码管进行片选,实现数码管的动态点亮。因为只用控制四个数码管,而74LS138又为38译码器,所以只用单片机控制前两个控制端,最高位控制端接地。另外选用用74LS244作为数码管的驱动,具体译码由软件控制。

方案二:同方案一选用74LS138进行片选,在译码驱动部分选用译码器CD4056,不用软件译码。

方案论证:两个方案都选用了74LS138,所不同的是数码管的驱动选用的芯片不一样,考虑到74LS244成本较CD4056高且使用它会增加单片机控制程序的编写难度,故选用方案二。

三、      软、硬件设计

1.      硬件设计

系统硬件设计主要分模拟部分设计、A/D转换模块设计、数据显示模块设计。

1)模拟部分设计

a.    电压跟随器设计

如图3-1所示,电压跟随器是用一个三极管构成的共集电路,它的电压增益是一,所以叫做电压跟随器。共集电路是输入高阻抗,输出低阻抗,这就使得它在电路中可以起到阻抗匹配的作用,能够使得后一级的放大电路更好的工作。它有功率放大作用。常用在测量仪表的输入极,以提高仪表的输入阻抗,减小对被测电路的影响。在这里我们设计电压跟随器正是这样一个目的。图中前端的电位器起电压衰减到输入电压1/5的作用,因为ADC0809能转换的电压范围为05V,而输入待测电压的范围为020V,所以必须先进行衰减。

可变量程的直流电压表-风君雪科技博客
                                                     3-1 电压跟随器

 

b.译码显示模块设计:

  可变量程的直流电压表-风君雪科技博客
该模块的主要功能是通过译码器将ADC0809转换出的数字量进行译码并用数码管显示。电路原理图如图3-5所示。四片数码管要动态点亮,用3线-8线译码器74LS138作为片选控制器,因为只有四片数码管需要控制,所以只用控制译码输出端中的与四片数码管接地端相连的高四位,因而译码输入码控制端的高位C端接地,A端和B端接单片机,在程序中通过控制AB端的逻辑状态实现数码管的动态点亮。另外数码管各段的点亮由通用译码器CD4066实现。CD4066可以作为数码管的驱动,也可以做液晶显示屏的驱动。CD40664个译码输入端,7个译码输出端分别接四片数码管的相应端,4个译码输入端接单片机的P1口,在单片机的软件设计中对译码加以控制。               

1.      软件设计:

四、调试过程

本次课程设计我们花在焊接和程序的编写上的时间并不多,电路设计、方案论证和系统调试才占用了大部分的时间。我们的调试试过程是按照先局部后整体的思路进行的。现详细叙述如下:

1.分局部调试

模拟部分的调试

模拟部分的设计主要是根据我们的设计检查跟随器工作是否正常、检查模拟开关4066是否工作、调节各量程放大倍数到设计指定值等。

a.跟随器的检查

我们首先将与待测电压输入端相连的204电位器接入的部分调到50K(即进行1/4衰减),接着为LM324接通了5V电压,然后将输入待测电压调到3V,接下来用万用表测量了LM324芯片3腿的电压,发现电压居然达到2.8V。这是很不正常的,因为按照我们的设计电压应该衰减到为原来的1/4,即便是我们的电位器调得不够准的话,电压也至少应该出现衰减的现象才对。我们判断可能是电路在焊接方面出了问题,于是对照着电路原理图仔细检查电路的焊接,经过检查,我们发现我们在电位器的焊接上出了问题,按我们的接法,电位器根本就没有接入电路,难怪电压也不衰减了。我们改焊了电路。按前面的方法去检查,发现电压又出奇的低,还有问题?这次我们又仔细检查了电路,发现无论是原理上还是焊接上都不应该存在问题。我静下心来查阅芯片资料并与指导老师讨论了问题,发现原来是LM324的工作电压出了问题,其工作电压应设为12V而我们只用了5V。改接12V电压后我们再测,发现与理论计算值已经非常接近,电压跟随器工作正常。

b.检查模拟开关4066是否工作

    4066集成了四个开关。共有四个控制端。如果某一控制端为高电平则对应的开关将接通。为测量其是否工作,我们将它的四个控制端用导线引出分别接高低电平,发现测量结果与理论分析结果一致,4066工作正常。

c.各量程放大倍数的调节

    这一步调试是建立在上述两步调试的基础上的。针对不同的档位,我们通过接入不同的待测的模拟输入电压来调节放大电路的放大倍数。调试测量520V档的放大倍数时,我们选择的输入电压为8V,按照设计,该电压在经过衰减电路后不放大。前面已经说过,我们设定的衰减比例为1/4,因此LM324输出端(7腿)的电压应该为2V,经过万用表测量,电压为2V,调试成功。在调节25V档的放大倍数时,我们选择的电压为3V,该电压应该先衰减到原来值的1/4再经过4倍放大电路后大小不变。我们通过调节控制放大倍数的电位器使LM3247腿的电压为3V达到放大倍数调节的目的。同理,在调节其他档位的放大倍数时也是通过上述方法调节相应的电位器实现的。

译码部分的调试

    译码部分主要是检验74LS138片选和4056译码是否正常。如前,我们仍是将74LS138的两个控制端和4056的四个译码控制端用长导线引出,分别接高低电平。当74LS138A  B分别为00011011时,分别是第一个、第二个、第三个和第四个数码管被点亮,这说明片选是正常的。在测试4056时结合起真值表用上述方法进行了译码检测,发现其也是正常工作的。

单片机与译码部分整体调试

上面是对译码部分单独进行了调试,而741LS1384056的工作是要在单片机的控制下工作的,所以我们做了这样一步测试。我为单片机编写了在数码管上动态点亮数码管并让四个数码管依次显示“1”、“2”、“3”、“4”的程序,烧录并将单片机接入电路后发现数码管上显示的为“0224”。是程序出了问题还是其他原因?我反复检查了我的程序,发现没有问题。我又向暑假参加过省电子设计大赛的同学请教单片机可以烧录是否仍可能坏的问题,他们的回答模棱两可。我只好自己测试。我检查了单片机的30腿发现有1MHz的矩形波,说明单片机在工作,但工作是否正常呢?我找同学借了一个经过测试可以正常工作的单片机,一样的程序烧录并接入我的电路发现正常显示,我这才确定是单片机坏了。通过这个测试我知道即使是可以烧录程序的单片机也不一定可以正常工作。

2.整机调试:

在进行电路的分局部调试之后,我们又进行了系统整机调试。首先为LM324接上12V的电压,为其他芯片接上5V的工作电压。另外还要输入待测的模拟电压,该电压从200mV以下的电压开始输起,依次增大。直到达到待测电压的上限20V为止,在这过程中,记录测量数据如上表所示。由于前面的分局部调试进行得比较细致,因此整机调试较为顺利。

五、数据测量及分析

1.实验数据测量结果如表5-1所示:

5-1 实验数据测量记录表

测量档

测量值

真实值

误差

 

0-200mV

0.006V

0.0063V

0.3mV

0.078V

0.076V

2mV

0.168V

0.143V

25mV

 

 

200mV-2V

0.619V

0.603V

16mV

1.086V

1.080V

6mV

1.427V

1.450V

23mV

1.892V

1.910V

18mV

 

2V-5V

2.505V      

2.510V

5mV

3.640V

3.660V

20mV

4.044V

4.050V

6mV

 

 

 

 

5-20V

5.415V

5.450V

35mV

7.603V

7.640V

37mV

8.492V

8.490V

2mV

10.76V

10.72V

40mV

11.13V

11.13V

0mV

12.33V

12.34V

10mV

13.43V

13.42V

10mV

15.09V

15.11V

20mV

17.09V

17.08V

10mV

18.31V

18.35V

40mV

19.25V

19.30V

50mV

2.实验测试结果分析

从上表可以看出,系统测试结果基本满足20mV精度的测量要求,但精度不是很稳定,有的精度很高,而最高的误差达到了50mV。造成这种结果的原因主要是系统前端模拟部分的不稳定性和放大倍数的不精确性,另外就是数字部分的ADC0809进行A/D转换造成的误差。我曾经测量过模拟部分中CD4066的电阻,我觉得它的电阻过大可能也是造成误差的一个原因。

六、实习体会

     这次的实习却给了我们一个在实践中灵活运用知识的机会,我们通过在实践中发现问题,进而去书本中找相关的知识去解决问题,从而巩固了理论知识。那样的知识是你从根本上去认识它,理解它,所以你的记忆时间会很长。

焊接电路是我们这次实习新学到的一个基本操作,而又是很重要的一个操作。焊接电路的好坏直接影响你的实验结果。在这次实验之前,我们用了一天的时间去学习查找有关电压表量程变换的单片机知识。在这次实验的过程中,我们首先是在电路板按照设计好的方案图焊接,检查焊接有无问题,再把写好程序写入89ATS51单片机上,进行测试。当看到数码管数字与电源的数字相差无几时,很幸运,我们一下就成功了,并且量程精度完全符合要求,相信我们组的每个人这时都有一种自豪感和成就感。

在此也非常感谢老师陪伴着我们,在我们遇到问题时给予我们的指导和帮助。

七、参考文献

1. 胡致强,刘振明。单片机实现的自动转换量程电压测试仪,哈尔滨学院学报,20019月刊。

2. 刘焕平,韩树新。ADC0809 AT89C51的一种接口方法,石家庄师范专科学校学报,20026月刊。

3. 任永强,徐百荣。一种基于单片机的量程自动转换技术,仪器仪表用户,20022月刊。

4.   剑。一种用于A/D转换的量程自动控制电路,华东地质学院学报,199912月刊。

5. 李广第等编,单片机技术基础,北京,北京航空航天大学出版社,2002年版。

6. www.21ic.com.

附录

附录1.软件设计源代码

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

//单片机课程设计程序:可变量程直流电压表的设计

//小组成员:石进  刘锐

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

//电压表的程序

//BY WXH

//Copyright 2007

//All right reserved

//==============================

#include<at89x51.h>

#include<intrins.h>

typedef unsigned char uchar;

//==============================

//P0口接ADC0809的数据输出端

//#define adc_data P0;

//P2

sbit v20   =P2^4;    //P2_71选通20V量程,X0.25

sbit v5            =P2^5;   //P2_60选通5V量程,X1

sbit v2            =P2^6;    //P2_50选通2V量程,X2.5

sbit v02   =P2^7;    //P2_40选通0.2V量程,X25

sbit START    =P2^0;    //P2_3通过非门接ADC0809ALESTART

sbit EOC=P2^3;    //P2_2ADC0809EOC

sbit OE          =P2^1;    //P2_1ADC0809OE

 

//P1_0P1_34056的数据输入

 

//P3

sbit dp1   =P3^0;    //P3_1接第一个数码的小数点   

sbit dp2   =P3^1;    //P3_2接第二个数码的小数点

sbit A138=P3^6;    //P3_674ls138A

sbit B138=P3^7;    //P3_774ls138B

//===============macro define=====================

#define v20_on {v20=1;v5=v2=v02=1;}

#define v5_on {v5=0;v20=0;v2=v02=1;}

#define v2_on {v2=0;v20=0;v5=v02=1;}

#define v02_on {v02=0;v20=0;v5=v2=1;}

 

#define ADC_ST {START=1;_nop_();START=0;}

#define OE_on {OE=1;}

#define OE_off {OE=0;}

#define dpy0 {A138=0;B138=0;}

#define dpy1 {A138=1;B138=0;}

#define dpy2 {A138=0;B138=1;}

#define dpy3 {A138=1;B138=1;}

#define DP1 {dp1=1;dp2=0;}

#define DP2 {dp1=0;dp2=1;}

//==================================

uchar temp[5];

float vol;

uchar num_disp[4];

//================delay_5ms=============================

delay_5ms() //5k T

{

       int i = 624;                  

       for(;i>0;i–);

}

//=====================================

main()

{

       char i;

       //===initialize===

       OE_off;

       //===========

_20v:

       v20_on;

       for(i=0;i<5;i++)

       {

              ADC_ST;

              while(EOC==0);

              OE_on;

              temp[i]=P0;

              OE_off;

              if(temp[i]<51)

                     goto _5v;

       }

       vol=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4])/51.0;

       goto disp;

_5v:

       v5_on;

       for(i=0;i<5;i++)

       {

              ADC_ST;

              while(EOC==0);

              OE_on;

              temp[i]=P0;

              OE_off;

              if(temp[i]<82)

                     goto _2v;

              else if(temp[i]>204)

                     goto _20v;

       }

       vol=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4])/204.0;

       goto disp;

_2v:

       v2_on;

       for(i=0;i<5;i++)

       {

              ADC_ST;

              while(EOC==0);

              OE_on;

              temp[i]=P0;

              OE_off;

              if(temp[i]<82)

                     goto _02v;

              else if(temp[i]>204)

                     goto _2v;

       }

       vol=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4])/510.0;

       goto disp;

_02v:

       v02_on;

       for(i=0;i<5;i++)

       {

              ADC_ST;

              while(EOC==0);

              OE_on;

              temp[i]=P0;

              OE_off;

              if(temp[i]>204)

                     goto _2v;

       }

       vol=(temp[0]+temp[1]+temp[2]+temp[3]+temp[4])/5100.0;

disp:

       if(vol<10.0)

       {

              DP1;

              num_disp[0]=(uchar)vol;

              num_disp[1]=((uchar)(vol*10))%10;

              num_disp[2]=((uchar)(vol*100))%10;

              num_disp[3]=((uchar)(vol*1000))%10;

       }

       else

       {

              DP2;

              num_disp[0]=((uchar)vol)/10;

              num_disp[1]=((uchar)vol)%10;

              num_disp[2]=((uchar)(vol*10))%10;

              num_disp[3]=((uchar)(vol*100))%10;

       }

       for(i=0;i<10;i++)

       {

              P1=num_disp[0];

              dpy0;

              delay_5ms();

              P1=num_disp[1];

              dpy1;

              delay_5ms();

              P1=num_disp[2];  

              dpy2;

              delay_5ms();

              P1=num_disp[3];

              dpy3;

              delay_5ms();

       }

       goto _20v;

}

附录3.元器件清单列表

附表1 元器件清单

器件名称

数量

备注

AT89S52单片机

1

 

ADC0809

1

A/D转换芯片

七段数码显示管

4

显示用

20pF电容

2

 

10uF电容

1

 

12M晶振

1

 

CD4066

1

四路集成模拟开关

运放LM324

1

 

74LS13874HC138

1

 

74LS7474HC74

1

分频用

204电位器

3

 

105电位器

1

 

CD4056

1

七段译码器

         

附录4.整机原理图:

可变量程的直流电压表-风君雪科技博客

实习报告下载地址:
http://www.freefilehosting.net/files/MTE5OTYx”>01.doc