直流电压的测量.docx
《直流电压的测量.docx》由会员分享,可在线阅读,更多相关《直流电压的测量.docx(19页珍藏版)》请在冰豆网上搜索。
直流电压的测量
直流电压的测量
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直流电压测量原理框图如下:
图2,电压测量原理框图
2.3直流大电压信号的测量
在AD采样前面加一级分压电路即分压器,可以扩展直流电压测量的量程。
如下图所示:
U0位电压表的量程,r位其内阻,r1,r2位分压电阻U0为扩展后的量程。
以下是各种与直流电压测量相关的原理图及电路图:
2.3.1分压电路原理图:
图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档
50mV
60mV
10mV
100mV
95mV
5mV
150mV
125mV
25mV
200mV-2V档
0.64V
0.62V
20mV
1.16V
1.08V
80mV
1.50V
1.45V
50mV
1.90V
1.85V
50mV
2V-20V档
3.10V
2.80V
0.3V
3.40V
3.20V
0.2V
4.50V
4.25V
0.25V
4.2实验测试结果分析
从上表可以看出,系统测试结果基本满足200mV精度的测量要求,但精度不是很稳定,有的精度很高,而最高的误差达到了350mV。
造成这种结果的原因主要是系统前端模拟部分的不稳定性和放大倍数的不精确性,另外就是数字部分的TC12C5A32AD进行A/D转换造成的误差。
我们曾经测量过模拟部分中开关调压的电阻,我觉得它的电阻过大可能也是造成误差的一个原因。
5.软件相关源程序及相关程序:
外接电路控制程序:
:
#include"reg51.h"
#include"intrins.h"
typedefunsignedcharBYTE;
typedefunsignedintWORD;
/*DeclareSFRassociatedwiththeADC*/
sfrADC_CONTR=0xBC;//ADCcontrolregister
sfrADC_RES=0xBD;//ADChight8-bitresultregister
sfrADC_RESL=0xBE;//ADClow2-bitresultregister
sfrP1ASF=0x9D;//P1secondaryfunctioncontrolregister
/*DefineADCoperationconstforADC_CONTR*/
#defineADC_POWER0x80//ADCpowercontrolbit
#defineADC_FLAG0x10//ADCcompleteflag
#defineADC_START0x08//ADCstartcontrolbit
#defineADC_SPEEDLL0x00//420clocks
#defineADC_SPEEDL0x20//280clocks
#defineADC_SPEEDH0x40//140clocks
#defineADC_SPEEDHH0x60//70clocks
/*************************************************
定义位变量
*************************************************/
sbitSCL=P0^3;//移位;
sbitRCL1=P0^1;//RCL1,RCL2位码锁存时钟;
sbitRCL2=P0^2;
sbitSDATA=P0^0;//数据位;
/************************************************
定义数组
*************************************************/
unsignedcharcodeled1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x38,0x39,0x00};//0~9,r,l,c不带小数点;
unsignedcharcodeled2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xb8,0xb9};//带小数点;
/************************************************
段位代码宏定义
*************************************************/
#definek000x8000
#definek010x4000
#definek020x2000
#definek030x1000
#definek100x0800
#definek110x0400
#definek120x0200
#definek130x0100
#definek200x0080
#definek210x0040
#definek220x0020
#definek230x0010
sbitkey1=P2^4;//200mv--2v
sbitkey2=P2^5;//2v--20v
sbitkey3=P2^6;//20v--200v
sbitkey4=P2^7;//200v--2000v
unsignedstate=0;
floatresult;
floatresult2;
unsignedchara[4]={0};
intkey;
voidInitUart();
voidSendData(BYTEdat);
voidDelay(WORDn);
voidInitADC();
BYTEch=0;//ADCchannelNO.
/*----------------------------
ADCinterruptserviceroutine
----------------------------*/
voidadc_isr()interrupt5using1
{
ADC_CONTR&=!
ADC_FLAG;//ClearADCinterruptflag
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;
}
/*----------------------------
InitialADCsfr
----------------------------*/
voidInitADC()
{
P1ASF=0x01;//SetallP1asanaloginputport
ADC_RES=0;//Clearpreviousresult
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
Delay
(2);//ADCpower-ondelayandStartA/Dconversion
}
/*----------------------------
Softwaredelayfunction
----------------------------*/
voidDelay(WORDn)
{
WORDx;
while(n--)
{
x=5000;
while(x--);
}
}
/************************************************
函数名:
Dtat_Out(unsignedintn_LED,unsignedcharData_595)
出口参数:
无
入口参数:
n_led,data_595;段码及显示的数据
功能:
发送数据并显示
*************************************************/
voidDtat_Out(unsignedintn_LED,unsignedcharData_595)
{
unsignedchary;
unsignedintyy;
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++);//延迟一会;
}
voidData_con(floatx)//数据分离
{
unsignedintresult1;
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()
出口参数:
无
入口参数:
无
功能:
给出显示的数据位码及段码
*************************************************/
voidxianshi_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]]);
}
}
unsignedchargetkey(void)
{
unsignedinti;
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
}
voidmain()
{
P2=0xFF;
//InitUart();//InitUART,usetoshowADCresult
InitADC();//InitADCsfr
IE=0xa0;//EnableADCinterruptandOpenmasterinterruptswitch
//StartA/Dconversion
while
(1)
{
getkey();
Data_con(result);
xianshi_2();
}
}
6.实习体会
这次的实习却给了我们一个在实践中灵活运用知识的机会,我们通过在实践中发现问题,进而去书本中找相关的知识去解决问题,从而巩固了理论知识。
那样的知识是你从根本上去认识它,理解它,所以你的记忆时间会很长。
焊接电路虽是我们以前已经多次接触到的操作,但是在这次实习中却不是那么轻松,因为有些元器件特别小,不易焊接或者容易出现短焊现象等问题。
焊接电路的好坏直接影响你的实验结果。
在这次实验之前,我们用了一天的时间去学习查找有关电压表量程变换的单片机知识。
在这次实验的过程中,我们首先是在电路板按照设计好的方案图焊接,检查焊接有无问题,再把写好程序写入STC12C5A32AD单片机上,进行测试。
很庆幸一切焊接都很好,单片机数码管达到预期效果。
这只是我们这次综合实验的一小部分,用老师的话说就是仅仅只是开了个头,只能说第一步做好了,我们很庆幸开头还是很顺利的。
经过这次的综合实验,我个人得到了不少的收获,一方面加深了我对焊接操作的认识,另一方面也提高了实验操作能力及对单片机及与其相关软件的的认识。
这次的实验跟我以前做过的实验不同,虽然以前也做过类似的实验,但是以前仅仅是根据原理图而焊接,直接把单片机板子焊接好就可以了,而这次却需要我们自己写程序,自己画外接电路原理图等。
并没有真正把做好的设计运用到实际当中,但是这次却运用到实际当中了。
实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。
在这里我深深体会到哲学上理论对实践的指导作用:
弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。
我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。
实验总是与课本知识相关的,在实验过程中,我们应该尽量减少操作的盲目性提高实验效率的保证,有的人一开始就赶着做,结果却越做越忙,主要就是这个原因。
我也犯过这样的错误。
就在此次实验当中,开始没有认真搞懂其中的相关知识,结果在实际运作中,我们焊接的单片机出现了问题,由于我的粗心,是得595芯片焊接上出现了短焊,最终导致数码管显示出现了问题,12个只有9个灯亮,其余的各灯不亮,刚开始我还不知道是怎么回事,最终经过老师的指点我才恍然大悟,经过改修才终于达到了预期的效果。
通过这些我了解到实际上,在弄懂了实验原理的基础上,我们的时间是充分的,做实验应该是游刃有余的,但是在没有搞懂其工作原理以及具体细节时盲目做,到最后我们只能白忙一场。
在实验的过程中我们要培养自己的独立分析问题,和解决问题的能力。
培养这种能力的前题是你对每次实验的态度。
如果你在实验这方面很随便,抱着等老师教你怎么做,拿同学的报告去抄,尽管你的成绩会很高,但对将来工作是不利的。
比如在这次实现当中,我们焊接的单片机板子时,由于没有自己认真观察,把外接电路焊接出现了问题,电压输入不进去,事后我们又对这些原因进行改善,终于相关功能有所改善,最后解决问题,兴奋异常。
我个人认为,在做这次的综合实验中,学习DXP,Keil软件以及知道如何运用STC软件工作其原理是一件最有趣的事情,因为DXP软件是一个画电路的平台,你可以在平台上设计几乎各种相关功能的连接图,然后进行相关方面的改进,这样就可以在实际操作焊接中出现明显的错误。
最后,通过这次的综合实验,我不但对理论知识以及与单片机相关方面的软件有了更加深的理解,对于实际的操作也有了质的飞跃,而且还对DXP软件有了更深一步的认识,经