直流电压的测量.
- 格式:doc
- 大小:205.00 KB
- 文档页数:16
直流电压的测量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_DATA[7:0],ADC_LOW[1:0]=1024*Vin/Vcc.2.2直流电压测量原理框图如下:图4,多量程分压器原理采用这种分压电路虽然可以扩展电压表的量程,但在小量程档明显降低了电压表的输入阻抗,着在实际使用中是所部希望的,所以,实际数字万用表的直流电压档为下图所示:他能在不降低输入阻抗的情况下达到相同的分压效果。
2.4直流小电压信号图5,直流小信号放大电路对于直流小信号( 20Mv-200Mv )的测量,需要设计信号放大电路将信号适当的放大再进行AD采样,放大电路原理如下图所示:3.硬件电路原理图及调试过程:图6.外接硬件电路原理图这次课程设计我们花在焊接和程序的编写上的时间并不是太多,电路设计和系统调试才占用了大部分的时间。
调试试过程是按照先局部后整体的思路进行的。
详细叙述如下:3.1.分局部调试:3.1.1模拟部分的调试模拟部分的设计主要是根据我们的检查模拟开关是否工作、调节各量程放大倍数是否到设计指定值等。
①检查模拟开关是否工作:模拟开关集成了四个开关。
共有四个控制端。
如果某一控制端为高电平则对应的开关将接通。
为测量其是否工作,我们将它的四个控制端用导线引出分别接高低电平,发现测量结果与理论分析结果一致,工作正常。
○2各量程放大倍数的调节:这一步调试是建立在上述两步调试的基础上的。
针对不同的档位,我们通过接入不同的待测的模拟输入电压来调节放大电路的放大倍数。
调试测量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.数据测量及分析sfr 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=P0^3; //移位;sbit RCL1=P0^1; //RCL1,RCL2位码锁存时钟;sbit RCL2=P0^2;sbit SDATA=P0^0; //数据位;/************************************************定义数组*************************************************/unsigned char code led1[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x38,0x39,0x00 }; //0~9,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=P2^4; //200mv--2vsbit key2=P2^5; //2v--20vsbit key3=P2^6; //20v--200vsbit key4=P2^7; //200v--2000vunsigned state=0;float result;float result2;unsigned char a[4]={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 flagstate=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 portADC_RES = 0; //Clear previous resultADC_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;y<8;y++){SCL=0; // 数据输入时钟,上升沿有效SDATA=0;SCL=1;}RCL2=1;RCL1=0; //发送位选信号;for(y=0;y<16;y++){SCL=0;if((n_LED&0x0001)==0x0001) { SDATA=1; } if((n_LED&0x0001)!=0x0001) { SDATA=0; }n_LED>>=1;SCL=1;}RCL1=1;RCL2=0; //发送段信号;for(y=0;y<8;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;yy<2000;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);a[0]=result1/1000;a[1]=(result1/100)%10;a[2]=(result1%100)/10;a[3]=result1%10;}/************************************************ 函数名:xianshi()出口参数:无入口参数:无功能:给出显示的数据位码及段码*************************************************/ /************************************************ 函数名:xianshi()出口参数:无入口参数:无功能:给出显示的数据位码及段码*************************************************/ void xianshi_2()//数据显示{if(key==0) //单位是mv{Dtat_Out(k23,led1[a[0]]);Dtat_Out(k22,led1[a[1]]);Dtat_Out(k21,led2[a[2]]);Dtat_Out(k20,led1[a[3]]);}if(key==1){Dtat_Out(k23,led2[a[0]]);Dtat_Out(k22,led1[a[1]]);Dtat_Out(k21,led1[a[2]]);Dtat_Out(k20,led1[a[3]]);}if(key==2){Dtat_Out(k23,led1[a[0]]);Dtat_Out(k22,led2[a[1]]);Dtat_Out(k21,led1[a[2]]);Dtat_Out(k20,led1[a[3]]);}if(key==3){Dtat_Out(k23,led1[a[0]]);Dtat_Out(k22,led1[a[1]]);Dtat_Out(k21,led2[a[2]]);Dtat_Out(k20,led1[a[3]]);}if(key==4){Dtat_Out(k23,led1[a[0]]);Dtat_Out(k22,led1[a[1]]);Dtat_Out(k21,led1[a[2]]);Dtat_Out(k20,led1[a[3]]);}}unsigned char getkey(void){unsigned int i;if ( key1==0) //200mv--2v { for(i=0;i<5000;i++);while (key1==0);key=1;}if ( key2==0) //2v--20v{ for(i=0;i<5000;i++);while(key2==0);key=2;}if (key3==0) //20v--200v{ for(i=0;i<5000;i++);while(key3==0);key=3;}if (key4==0) //200v--2000v{ for(i=0;i<5000;i++);while(key4==0);key=4;}//200mv--20mv}void main(){P2=0xFF;//InitUart(); //Init UART, use to show ADC resultInitADC(); //Init ADC sfrIE = 0xa0; //Enable ADC interrupt and Open master interrupt switch//Start A/D conversionwhile (1){getkey();Data_con(result);xianshi_2();}}6.实习体会这次的实习却给了我们一个在实践中灵活运用知识的机会,我们通过在实践中发现问题,进而去书本中找相关的知识去解决问题,从而巩固了理论知识。