三相交流电压表.docx
《三相交流电压表.docx》由会员分享,可在线阅读,更多相关《三相交流电压表.docx(15页珍藏版)》请在冰豆网上搜索。
三相交流电压表
电控学院
08级测控专业综合实验
题目:
三相交流电压表(软件)
院(系):
电气与控制工程学院
专业班级:
测控技术与仪器0802班
姓名:
学号:
指导老师:
2012年3月14日
一、实验要求:
3
二、测量原理:
3
三、电压采样信号调理电路:
5
四、电压表原理框图:
6
五、程序流程图:
6
六、参考文献:
7
七、设计完成的功能:
8
八、总结及体会:
8
九、程序:
9
三相交流电压表设计
在发电厂、工矿、企业,经常要监测供电状况,所供的电压通常在几百伏,必须设计一种仪表来测量这种电压,因此诞生了三相交流电压表。
一、实验要求:
1.设计方案中能用软件完成的尽量用软件实现,这样可以减少产片的成本,也减少硬件的一些干扰。
2.本实验采用stc12c5A32AD单片机,由实验提供了该单片机的最小系统,线路板,在该线路板上扩展了部分功能,多余的I/O口也扩展出来,另外,实验室统一提供了显示路板,在该板子上有四个按键,一组四位一体数码管,采用74h164,扩展进行动态扫描显示。
3.系统以STC51单片机最小系统为基础,在此基础上叫外围电路,由于单片机内部集成了A/D转换通道,因此将模拟电压输出通道与单片机的A/D输出通道直接相连,通过显示电路将得到的数据显示出来,并对A相电压进行4-20mA的变送输出。
系统主要由键盘输入模块、被测电压输入模块、显示模块、电源及复位模块和CPU处理模块等组成。
4.设计时分工进行,未提供原理图的设计自己必须画出原理图。
二、测量原理:
由于被测量的信号为交流信号,且信号幅度比较大,必须把这种大的信号变成小信号进行采样,根据采样的信号不同可以分为直流采样和交流采样两种。
直流采样,顾名思义,采样对象为直流信号。
它是把交流电压电流信号经过各种转化为直流电压,再有MCU采集。
此方法软件设计简单,对采集值只做一次比例变换即可得到被测量的数值。
但直流采样法存在一些问题:
测量精度直接受整流电路的精度和稳定性影响;整流电路参数调整困难且受波形因素影响比较大,此外用直流采样法测量工频电压,电流是通过测量平均值来求出有效值的,当电路中谐波含量不同时,平均值与有效值之间的关系也将发生变化,给计算带来误差。
因此,要获得高精度、高稳定的测量结果,必须采用交流采样技术。
交流采样技术是按照一定规律对被测信号的瞬时值进行采样,按一定算法进行数值处理,从而获得被测量的测量方法。
该方法的理论基础是采样定理,即要求采样频率为被测信号频率中最高频率的2倍以上,这就要求硬件处理电路能提供高的采样速度和数据处理速度。
目前单片机、DSP及高速A/D转换器的大量涌现,为交流采样技术提供了强有力硬件支持。
交流采样法包括同步采样、准同步采样、非同步采样几种。
交流采样技术是将二次测得电压、电流变成MCU可以测量的交流小信号,然后直接送入MCU直接处理。
由于这种方法能够对被测量的瞬时值进行采样,因而实时性好,相位失真小。
它用软件的功能代替硬件的功能又使硬件的投资大大减少。
随着微机技术的不断发展,交流采样必将以其优异的性价比逐步取代传统的直流采样方法。
设交流电压电流表达式为:
u(t)=
式中:
u(t)——t时刻电压瞬时值;
——电压峰值;
U——电压有效值;
——角频率;
电压有效值公式:
U=
若将电压有效值公式离散化,以一个周期内有限个采样电压数字量来代替一个周期内连续变化的函数值,则:
U
式中:
——响亮采样的时间间隔;
——第m-1个时间间隔的电压采样瞬时值;
N——1个周期的采样点数。
若相邻两采样的时间间隔相等,即
为常数
,考虑到N=(
)+1,则有
U=
式中就是根据一个周期各采样瞬时值及每周期,采样点数计算电压信号的有效值的公式。
要求离散公式求得准确的测量结果,必须采样何时的采样频率,通常应大于采样定理规定的理论采样频率3倍以上,以保证一周内有足够的采样点数。
当然,采样速度的高低取决于A/D转换器的转换速度、DSP的处理速度及实际需要等。
当然,要获得高的精确测量结果,还需要采取软件数字滤波,硬件看干扰等有效措施。
三、电压采样信号调理电路:
电压取样电路如图1表示,交流电压是通过电阻分压来得到一需要的小电压。
在交流电压表中,取样信号中均叠加了一个2.5V的支流电压信号,这是因为有的A/D转换器不能接受负的电压信号。
图1.交流电压取样电路
四、电压表原理框图:
系统以ST51单片机最小系统为基础,在此基础上叫外围电路,由于单片机内部集成了A/D转换通道,因此将模拟电压输出通道与单片机的A/D输出通道直接相连,通过显示电路将得到的数据显示出来,并对A相电压进行4-20mA的变送输出。
系统主要由键盘输入模块、被测电压输入模块、显示模块、电源及复位模块和CPU处理模块等组成,整个系统的原理图如下所示:
图2.电压表原理框图
5、程序流程图:
6、参考文献:
[1]陆彬.21天学通51单片机开发(第2版.电子工业出版社.2011.9
[2]汪吉鹏.工业控制技术的应用现状和发展方向[J].潍坊学院学报,2002,4
(2):
47~52.
[3]余永权,汪明慧,黄英.单片机在控制系统中的应用[M].北京:
电子工业出版社,2003.
[4]纪宗南.单片机外围用手册[M]器件实.北京:
北京航天航空大学出版社,2004.
[5]薛弘晔.计算机控制技术[M].西安:
西安科技大学出版社,2006.
[6]黄智伟.全国大学生电子设计竟赛系统设计[M].北京航空航天大学出版社,2006.
[7]柴钰.单片机原理及应用.西安电子科技大学出版社.
[8]汪德彪.MCS-51单片机原理及接口技术[M].电子工业出版社,2007.
[9]张永瑞.电子测量技术基础[M].西安c电子科技大学出版社,1994.
[10]张元良.单片机原理及应用教程.清华大学出版社.
[11]张文祥,李志军,张子红,张小清.单片机系统设计与开发教程.
七、设计完成的功能:
1、本实验要求设计者能够实时的测量三相交流电电压,并把A相电压进行隔离变送输出输出为4-20mA的电流信号,精度达到0.2级。
2、本实验采用stc12c5A32AD单片机,由实验提供了该单片机的最小系统,线路板,在该线路板上扩展了部分功能,多余的I/O口也扩展出来,另外,实验室统一提供了显示路板,在该板子上有四个按键,一组四位一体数码管,采用74h164,扩展进行动态扫描显示。
八、总结及体会:
一周的实习结束了,我们学到了很多很多,总体来说这次的课程设计总的来说并不是特别容易,虽然我们在课堂上学到了不少有用的知识,可真正实践起来就发现自己缺少的太少。
我到图书馆来找过资料,也上网差了不少资料,在查找和阅读的过程中真的学到不少的知识。
当然,在做作业的时候我遇到了不少问题,在和周围同学的探讨中我们找到了答案,大家共同进步。
通过课程设计让我们更加深刻的体会到实践的重要性,平时我们多是学习理论知识,上机实践的机会少,自己也少练习,在实践方面确实欠缺不少,需要我们今后加强练习。
通过这次实习,我知道了任何事都要靠自己,只有自己的知识才是真正的知识,这让我在以后的工作生活中有了更好的动力!
感谢老师的耐心指导和悉心教导。
通过此次实习,开阔了我们的视野,使我们的理论和实践结合在一起,也培养了我的实际动手能力,增加了实际的操作经验,更好地为我们今后的工作积累经验。
同时也使我们对课本一些比较模糊的概念、抽象的原理有了一个崭新的认识和理解。
使我们对以往所学的知识有了更进一步的巩固,对以前没接触过的知识有了深刻地了解,让我们对以后的基本动作有了深入认识。
同时也使我掌握了一些stc12c5A32AD单片机的使用方法、单片机最小系统,元件件连线、电路焊接等。
课程设计能帮助我们除了掌握课本上的理论知识外,更能帮助我们提高我们的动手实践能力。
最后,感谢王老师的孜孜不倦的教诲,让我们更加全面的掌握了有关单片机的一些知识。
同时,我们会牢记老师的指导,把老师的意见牢记在心里,相信这会对以后我们走向社会提供有力的保障!
再次感谢王老师的辛勤指导!
九、程序:
#include
#include"reg51.h"
#include"intrins.h"
#include"math.h"
#defineFOSC11059200L
#defineBAUD9600
floatSample[20];
unsignedcharFlag=0;
unsignedintResult;
floatU=0.0;
unsignedchari=0;
typedefunsignedcharBYTE;
typedefunsignedintWORD;
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};//0~9,r,l,c不带小数点;
unsignedcharcodeled2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xb8,0xb9};//带小数点;
unsignedchara1,a2,a3,a4,a5;//a1~a5为数码管代码位置;
unsignedcharData_595;//数据;
unsignedintn_LED,yy;//数码管所在位置的段位代码;
/************************************************
段位代码宏定义
*************************************************/
#definek000x8000
#definek010x4000
#definek020x2000
#definek030x1000
#definek100x0800
#definek110x0400
#definek120x0200
#definek130x0100
#definek200x0080
#definek210x0040
#definek220x0020
#definek230x0010
/*DeclareSFRassociatedwiththeADC*/
sfrADC_CONTR=0xBC;//ADCcontrolregister
sfrADC_RES=0xBD;//ADChight8-bitresultregister
sfrADC_LOW2=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
voidDtat_Out(unsignedintn_LED,unsignedcharData_595)
{
unsignedchary;
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<5000;yy++);//延迟一会;
}
/************************************************
函数名:
xianshi()
出口参数:
无
入口参数:
无
功能:
给出显示的数据位码及段码
*************************************************/
voidxianshi()
{
Dtat_Out(k20,led1[a4]);//显示电压;
Dtat_Out(k21,led2[a3]);
Dtat_Out(k22,led1[a2]);
Dtat_Out(k23,led1[a1]);
}
/************************************************
函数名:
part()
出口参数:
无
入口参数:
无
功能:
分离电压的各个位的数据
*************************************************/
voidpart()
{
unsignedintzhongjian;
/*if(Flag>=19)
{
Flag=0;
for(i=0;i<20;i++)
U+=Sample[i]*Sample[i];
U=sqrt(U/19);
}
TR0=1;*/
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|0;
while(ADC_FLAG==1)
{
ADC_CONTR&=!
ADC_FLAG;//ClearADCinterruptflag
Result=ADC_RES*4+ADC_LOW2;
Sample[Flag]=Result*5.272/1023.0;
Flag++;
};
if(Flag>=19)
{
U=0.0;
Flag=0;
for(i=0;i<20;i++)
U+=(Sample[i]-2.502)*(Sample[i]-2.502);
U=sqrt(U/19);
}
zhongjian=(U*1241.34);
if(zhongjian<900.0)
{
zhongjian=(zhongjian-710.0);
if((zhongjian>0.0)&&(zhongjian<=200.0))
zhongjian=zhongjian*10;
}
if((zhongjian>200.0)&&(zhongjian<=300.0))
zhongjian=(zhongjian-200.0);
if((zhongjian>300.0)&&(zhongjian<=500.0))
zhongjian=(zhongjian-200.0);
if((zhongjian>500.0)&&(zhongjian<=900.0))
zhongjian=zhongjian-200.0;
if((zhongjian>900.0)&&(zhongjian<1100.0))
zhongjian=zhongjian-100.0;
a1=zhongjian/1000;
a2=(zhongjian/100)%10;
a3=(zhongjian/10)%10;
a4=zhongjian%10;
}
voidDelay(WORDn);
voidInitADC();
/*----------------------------
InitialADCsfr
----------------------------*/
voidInitADC()
{
P1ASF=0xff;//SetallP1asanaloginputport
ADC_RES=0;//Clearpreviousresult
ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START|0;
Delay
(2);//ADCpower-ondelayandStartA/Dconversion
}
/*----------------------------
InitialUART
----------------------------*/
voidInitTimer()
{
TMOD=0x11;//t0t1配制成十六位定时器
TH1=0xfc;TL1=0x18;//定时一毫秒
TH0=0xb1;TL0=0xe0;//定时0.02秒
TR0=TR1=1;//T1t0startrunning
}
/*----------------------------
Softwaredelayfunction
----------------------------*/
voidDelay(WORDn)
{
WORDx;
while(n--)
{
x=5000;
while(x--);
}
}
voidmain()
{
InitTimer();//InitUART,usetoshowADCresult
InitADC();//InitADCsfr
IE=0xa0;//EnableADCinterruptandOpenmasterinterruptswitch
//StartA/Dconversion
while
(1)
{
part();
xianshi();
}
}
/*----------------------------
ADCinterruptserviceroutine
----------------------------*/
voidadc_isr()interrupt5using1
{
ADC_CONTR&=!
ADC_FLAG;//ClearADCinterruptflag
Result=ADC_RES*4+ADC_LOW2;
Sample[Flag]=Result*5.05/1023.0;
Flag++;
}
//voidt0()interrupt1using1//采样周期
//{
//TR0=0;
//TH0=0xb1;TL0=0xe0;
//if(Flag>=19)
//for(i=0;i<20;i++)
//U+=Sample[i]*Sample[i];
//U=sqrt(U/19);
//U=5.46;
//TR0=1;
//}
voidt1()interrupt3using1//采样间隔
{
TR0=0;
TH1=0xfc;TL1=0x18;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|0;
TR0=1;
}