直流电压的测量.doc_第1页
直流电压的测量.doc_第2页
直流电压的测量.doc_第3页
直流电压的测量.doc_第4页
直流电压的测量.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安科技大学综合实验报告 学 院: 专业名称: 设计题目: 直流电压的测量 姓 名: 学 号: 指导教师: 直流电压的测量1. 实习内容、要求及指标1.1设计一个可变量程的数字式直流电压表,要求及设计指标如下:(1)测量范围:20mV-1000V 设置4个量程:200mV-2V,2V-20V,20V-200V,200V-2000V.(2)测量精度:200mV(3)测量误差允许范围:=1%。(4)显示:用四位七段数码管显示电压读数。1.2设计方案中能用软件完成功能的尽量用软件实现,这样可以减少产片的成本,也减少精简的一些干扰。1.3本实验采用的是STC12C5A32AD单片机。2. 测量原理及电路设计2.1数字式直流电压测量原理数字式直流电压表的组成结构图如下图所示:图1数字直流电压表结构图直流电压经过输入电路变换为合适的电压后,用A/D转换器将模拟电压变换成数字量,再由电子计数器对数字计数得到测量结果,逻辑控制电路控制电路的协调工作,在时钟的作用下顺序完成整个测量过程。这次设计采用多的是STC12C5A32AD系列带A/D转换的单片机,电压输入型A/D,可做温度检测,电池电压检测,按键扫描,频谱检测等。10位A/D转换结果计算公式如下:(ADC_DATA7:0,ADC_LOW1:0=1024*Vin/Vcc.2.2直流电压测量原理框图如下:图2,电压测量原理框图2.3直流大电压信号的测量在AD采样前面加一级分压电路即分压器,可以扩展直流电压测量的量程。如下图所示:U0位电压表的量程,r位其内阻,r1,r2位分压电阻U0为扩展后的量程。以下是各种与直流电压测量相关的原理图及电路图:2.3.1分压电路原理图:数字电压表0ui0r 1r 2r0u0 图3,分压电路原理图2.3.2多量程分压器原理:图4,多量程分压器原理采用这种分压电路虽然可以扩展电压表的量程,但在小量程档明显降低了电压表的输入阻抗,着在实际使用中是所部希望的,所以,实际数字万用表的直流电压档为下图所示:他能在不降低输入阻抗的情况下达到相同的分压效果。2.4直流小电压信号图5,直流小信号放大电路对于直流小信号( 20Mv-200Mv )的测量,需要设计信号放大电路将信号适当的放大再进行AD采样,放大电路原理如下图所示:3. 硬件电路原理图及调试过程:图6.外接硬件电路原理图这次课程设计我们花在焊接和程序的编写上的时间并不是太多,电路设计和系统调试才占用了大部分的时间。调试试过程是按照先局部后整体的思路进行的。详细叙述如下:3.1.分局部调试:3.1.1模拟部分的调试模拟部分的设计主要是根据我们的检查模拟开关是否工作、调节各量程放大倍数是否到设计指定值等。检查模拟开关是否工作:模拟开关集成了四个开关。共有四个控制端。如果某一控制端为高电平则对应的开关将接通。为测量其是否工作,我们将它的四个控制端用导线引出分别接高低电平,发现测量结果与理论分析结果一致,工作正常。各量程放大倍数的调节:这一步调试是建立在上述两步调试的基础上的。针对不同的档位,我们通过接入不同的待测的模拟输入电压来调节放大电路的放大倍数。调试测量20到200V档的放大倍数时,我们选择的输入电压为80V,按照设计,该电压在经过衰减电路后不放大。前面已经说过,我们设定的衰减比例为1/4,因此LM358输出端(7腿)的电压应该为20V,经过万用表测量,电压为20V,调试成功。在调节20到200V档的放大倍数时,我们选择的电压为30V,该电压应该先衰减到原来值的1/4再经过4倍放大电路后大小不变。我们通过调节控制放大倍数的电位器使LM358的7腿的电压为30V达到放大倍数调节的目的。同理,在调节其他档位的放大倍数时也是通过上述方法调节相应的电位器实现的。3.1.2译码部分的调试图7,74HC595结构图译码部分主要是检验74HC595片选和译码是否正常。我们选用了检测数码管以及74HC595是否完好的程序进行下载并检测,这样不仅可以检测这两部分是否完好,而且还可以检测电路板及单片机是否完好。我们通过给单片机下载检测程序,结果在数码管上显示的数字与我们预期的结果又很大的出入,经过我们一番检查也没找出原因之所在,最后我们问王老师才知道原来是我们的74HC595芯片给焊接错了,由于我焊接时出心大导致把74HC595的两根管脚短焊了,这才没有达到预期的效果,经过后来的一番改进,终于实现了检测功能。3.1.3单片机与译码部分整体调试上面是对译码部分单独进行了调试,而74HC595和数码管的工作是要在单片机的控制下工作的,所以我们做了这样一步测试。我为单片机编写了在数码管上动态点亮数码管并让四个数码管依次显示“0,1,2,3,到9”的程序,烧录并将单片机接入电路后发现数码管上显示的为“0000,1111,.9999.说明一切工作正常。3.2整机调试:在进行电路的分局部调试之后,我们又进行了系统整机调试。首先为LM358接上5V的电压,为其他芯片接上2V的工作电压。另外还要输入待测的模拟电压,该电压从200mV以下的电压开始输起,依次增大。直到达到供端电压的上限5V为止,在这过程中,记录测量数据如下表所示。由于前面的分局部调试进行得还比较顺利,因此整机调试较为顺利。4. 数据测量及分析4.1.实验数据测量结果如表4-1所示: 表4-1 实验数据测量记录表测量档测量值真实值误差0-200mV档50mV60mV10mV100mV95mV5mV150mV125mV25mV200mV-2V档0.64V0.62V20mV1.16V1.08V80mV1.50V1.45V50mV1.90V1.85V50mV2V-20V档3.10V2.80V0.3V3.40V3.20V0.2V4.50V4.25V0.25V4.2实验测试结果分析从上表可以看出,系统测试结果基本满足200mV精度的测量要求,但精度不是很稳定,有的精度很高,而最高的误差达到了350mV。造成这种结果的原因主要是系统前端模拟部分的不稳定性和放大倍数的不精确性,另外就是数字部分的TC12C5A32AD进行A/D转换造成的误差。我们曾经测量过模拟部分中开关调压的电阻,我觉得它的电阻过大可能也是造成误差的一个原因。5. 软件相关源程序及相关程序:外接电路控制程序:#include reg51.h#include intrins.htypedef unsigned char BYTE;typedef unsigned int WORD;/*Declare SFR associated with the ADC */sfr ADC_CONTR = 0xBC; /ADC control registersfr ADC_RES = 0xBD; /ADC hight 8-bit result registersfr ADC_RESL = 0xBE; /ADC low 2-bit result registersfr P1ASF = 0x9D; /P1 secondary function control register/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER 0x80 /ADC power control bit#define ADC_FLAG 0x10 /ADC complete flag#define ADC_START 0x08 /ADC start control bit#define ADC_SPEEDLL 0x00 /420 clocks#define ADC_SPEEDL 0x20 /280 clocks#define ADC_SPEEDH 0x40 /140 clocks#define ADC_SPEEDHH 0x60 /70 clocks/* 定义位变量*/ sbit SCL=P03; /移位; sbit RCL1=P01; /RCL1,RCL2位码锁存时钟; sbit RCL2=P02; sbit SDATA=P00; /数据位;/* 定义数组*/ unsigned char code led1 =0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x38,0x39,0x00; /09,r,l,c不带小数点; unsigned char code led2 =0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xb8,0xb9; /带小数点;/* 段位代码宏定义*/ #define k00 0x8000 #define k01 0x4000 #define k02 0x2000 #define k03 0x1000 #define k10 0x0800 #define k11 0x0400 #define k12 0x0200 #define k13 0x0100 #define k20 0x0080 #define k21 0x0040 #define k22 0x0020 #define k23 0x0010sbit key1=P24;/200mv-2vsbit key2=P25;/2v-20vsbit key3=P26;/20v-200vsbit key4=P27;/200v-2000vunsigned state=0;float result;float result2;unsigned char a4=0;int key;void InitUart();void SendData(BYTE dat);void Delay(WORD n);void InitADC();BYTE ch = 0; /ADC channel NO./*-ADC interrupt service routine-*/void adc_isr() interrupt 5 using 1 ADC_CONTR &= !ADC_FLAG; /Clear ADC interrupt flag state=ADC_RES*4+ADC_RESL;result2=(state*5)/1023.0;if(key=0)result=result2/23;if(key=1)result=result2/23*10;if(key=2)result=result2/23*100;if(key=3)result=result2/23*1000;if(key=4)result=result2/23*10000; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 0;/*-Initial ADC sfr-*/void InitADC() P1ASF = 0x01; /Set all P1 as analog input port ADC_RES = 0; /Clear previous result ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch; Delay(2); /ADC power-on delay and Start A/D conversion/*-Software delay function-*/void Delay(WORD n) WORD x;while (n-) x = 5000; while (x-); /*函数名: Dtat_Out(unsigned int n_LED,unsigned char Data_595) 出口参数:无入口参数:n_led,data_595;段码及显示的数据功能:发送数据并显示*/void Dtat_Out(unsigned int n_LED,unsigned char Data_595) unsigned char y; unsigned int yy; RCL2=1;/ 输出锁存时钟,上升有效 RCL1=1; RCL2=0; /段码清零; for(y=0;y8;y+) SCL=0; /数据 输入时钟, 上升沿有效SDATA=0;SCL=1; RCL2=1; RCL1=0; /发送位选信号; for(y=0;y=1;SCL=1; RCL1=1; RCL2=0; /发送段信号; for(y=0;y8;y+) SCL=0;if(Data_595&0x80)=0x80) SDATA=1; if(Data_595&0x80)!=0x80) SDATA=0; Data_595=1;SCL=1; RCL2=1; for(yy=0;yy2000;yy+); /延迟一会;void Data_con(float x)/数据分离 unsigned int result1;if(key=0)result1=(int)(x*10000);if(key=1)result1=(int)(x*1000);if(key=2)result1=(int)(x*100);if(key=3)result1=(int)(x*10); a0=result1/1000; a1=(result1/100)%10; a2=(result1%100)/10; a3=result1%10;/*函数名:xianshi() 出口参数:无入口参数:无功能:给出显示的数据位码及段码*/ /*函数名:xianshi() 出口参数:无入口参数:无功能:给出显示的数据位码及段码*/ void xianshi_2()/数据显示 if(key=0) /单位是mv Dtat_Out(k23,led1a0); Dtat_Out(k22,led1a1); Dtat_Out(k21,led2a2); Dtat_Out(k20,led1a3); if(key=1) Dtat_Out(k23,led2a0); Dtat_Out(k22,led1a1); Dtat_Out(k21,led1a2); Dtat_Out(k20,led1a3); if(key=2) Dtat_Out(k23,led1a0); Dtat_Out(k22,led2a1); Dtat_Out(k21,led1a2); Dtat_Out(k20,led1a3); if(key=3) Dtat_Out(k23,led1a0); Dtat_Out(k22,led1a1); Dtat_Out(k21,led2a2); Dtat_Out(k20,led1a3); if(key=4) Dtat_Out(k23,led1a0); Dtat_Out(k22,led1a1); Dtat_Out(k21,led1a2); Dtat_Out(k20,led1a3); unsigned char getkey(void) unsigned int i; if ( key1=0) /200mv-2v for(i=0;i5000;i+); while (key1=0); key=1; if ( key2=0) /2v-20v for(i=0;i5000;i+); while(key2=0); key=2; if (key3=0) /20v-200v for(i=0;i5000;i+); while(key3=0); key=3; if (key4=0) /200v-2000v for(i=0;i5000;i+); while(key4=0); key=4; /200mv-20mvvoid main() P2=0xFF; /InitUart(); /Init UART, use to show ADC result InitADC(); /Init ADC sfr IE = 0xa0; /Enable ADC interrupt and Open master interrupt switch /Start A/D conversion while (1) getkey(); Data_con(result); xianshi_2(); 6. 实习体会这次的实习却给了我们一个在实践中灵活运用知识的机会,我们通过在实践中发现问题,进而去书本中找相关的知识去解决问题,从而巩固了理论知识。那样的知识是你从根本上去认识它,理解它,所以你的记忆时间会很长。焊接电路虽是我们以前已经多次接触到的操作,但是在这次实习中却不是那么轻松,因为有些元器件特别小,不易焊接或者容易出现短焊现象等问题。焊接电路的好坏直接影响你的实验结果。在这次实验之前,我们用了一天的时间去学习查找有关电压表量程变换的单片机知识。在这次实验的过程中,我们首先是在电路板按照设计好的方案图焊接,检查焊接有无问题,再把写好程序写入STC12C5A32AD单片机上,进行测试。很庆幸一切焊接都很好,单片机数码管达到预期效果。这只是我们这次综合实验的一小部分,用老师的话说就是仅仅只是开了个头,只能说第一步做好了,我们很庆幸开头还是很顺利的。经过这次的综合实验,我个人得到了不少的收获,一方面加深了我对焊接操作的认识,另一方面也提高了实验操作能力及对单片机及与其相关软件的的认识。 这次的实验跟我以前做过的实验不同,虽然以前也做过类似的实验,但是以前仅仅是根据原理图而焊接,直接把单片机板子焊接好就可以了,而这次却需要我们自己写程序,自己画外接电路原理图等。并没有真正把做好的设计运用到实际当中,但是这次却运用到实际当中了。实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。在这里我深深体会到哲学上理论对实践的指导作用:弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。 我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。实验总是与课本知识相关的,在实验过程中,我们应该尽量减少操作的盲目性提高实验效率的保证,有的人一开始就赶着做,结果却越做越忙,主要就是这个原因。我也犯过这样的错误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论