基于单片机正弦波有效值的测量_第1页
基于单片机正弦波有效值的测量_第2页
基于单片机正弦波有效值的测量_第3页
基于单片机正弦波有效值的测量_第4页
基于单片机正弦波有效值的测量_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、基于单片机正弦波有效值的测量 一简介本作品以单片机STC12C5A60S2为主控芯片并以此为基础,通过二极管1N5819实现半波整流,使用单片机内部自带10位AD对整流后的输入信号进行采样,从而实现对峰值的检测;同时通过运放LM837对输入信号进行放大,之后通过施密特触发器,将原始信号整形成可被单片机识别的标准脉冲波形,之后配合内部计数器(定时器)达到测量其频率的目的;这样,整流和AD采样实现对输入信号峰值的检测;通过放大、整形实现对输入信号频率的检测。二基本功能与技术指标要求(1)输入交流电压:1mV50V,分五档: 1mV20mV, 20mV200mV, 200mV2V, 2V20V, 2

2、0v50V。(2)正弦频率;1Hz100kHz;(3)检测误差:2%;(4)具有检测启动按钮和停止按钮,按下启动按钮开始检测,按下停止按钮停止检测;(5)显示方式:数字显示当前检测的有效是,在停止检测状态下,显示最后一次检测到的有效值;(6)显示:LCD,显示分辨率:每档满量程的0.1%;三理论分析本文要求输入交流信号,通过电路测量其峰值,频率,有效值以及平均值,因为输入的交流信号为模拟信号,而一般处理数据使用的主控芯片单片机处理的是数字信号,所以我们选择使用数模转换器AD(Analog to Digital Converter)将输入的模拟信号转换为数字信号,并进行采样;由于要求输入交流信号

3、电压峰峰值Vpp为50mV10V,所以如果我们采用AD为8位,则最小采样精度为528-119.6mv,因此会产生78.4%的误差,并且题目要求输入交流信号的频率范围为40Hz50kHz,所以为了保证对高频率信号的单周期内采样个数,我们需要选择尽量高速度的AD;因此我们选用使用单片机STC12C5A60S2,其内部自带AD为8路10位最高速度可达到250KHz,所以我们可以将最小采样精度缩小到5210-14.87mv,并且在输入交流信号频率最大时(50KHz)在单个周期内可采集5个点,因此可保证测量精度。由于该AD只能接受05V的模拟信号输入,所以当我们直接输入一个双极性信号时可能损坏AD,因此

4、当信号进入AD之前我们要进行半波整流,为此我们设计了整流电路,在交流信号通过整流电路输入AD后,由AD实时输出对应模拟信号大小的二进制数,并存入变量MAX中,随着信号的不断输入MAX中只保存AD输出过的最大值,这样既可测出输入信号的峰值;由交流信号有效值表达式 U有效=1Ni=1Nui2可知检波器应当首先把输入的瞬时电压平方, 然后在一定平均时间内取平均值再开方。即可得到交流信号的有效值,然后通过比较峰值和有效值的关系即可知道该交流信号的波形;由于要检测交流信号的频率,所以我们使用单片机内部定时器和计数器,而计数器只能由上升沿或是下降沿触发,所以我们想通过施密特触发器将输入交流信号变为高低电平

5、,以便检测其频率,而施密特触发器CD40106在常温5V供电下门限电压VT-=1.4V,VT+=3.6V,而输入交流信号的峰值最小时为25mV,所以不能保证输入信号为正的时候施密特触发器就能发生跳变,因此我们要对输入交流信号进行放大,为此我们设计了放大电路。四.电路设计1.电源电路的设计本次实验我们采用+5V,5V,+12V,12V的电源,故采用了7805,7905,7812,7912这四块芯片组成电源电路对作品进行供电。如图一所示:图一经过测量实际输出电压为:+5.12V -5.06V +12.67V -12.02V2分档设计由于直接对信号测量时,对小信号的测量产生很大的误差,为了更有效的利

6、用单片机的资源,故要对待测信号进行分档处理,但在实际运行中,由于进入放大器之前存在大量电阻产生了很多的噪声干扰,使输出波形严重失真,不能有效的利用,故我们舍弃了该部分的电路。 3整流电路的设计我们使用整流二极管5819实现半波整流,但通过此电路输出波形会出现一个负电压,因此在此基础上,我们在二极管后加了一个上拉电阻,实现最大程度的消除输入波形的负电压,使其在单片机STC12C5A60S2内部AD的可接收信号范围内(0-5V)。输入信号经过整流后进入AD,由AD输出10位数字信号,再有单片机进行处理,得出信号的有效值。电路如图二所示:图二在实际的测试中,证明该方案可行,能够实现对信号的半波整流处

7、理。4正弦波转方波电路设计在该电路的设计中,我们一开始采用555芯片把正弦波转换为方波,但在实际的测试中发现555只能对高于6V的信号才能使正弦波转换为放波,与我们实习要求不符合,故舍弃了该方案。在老师的指导下,我们采用了滞回比较器来产生方波。本方案检测输入信号频率的核心电路,信号通过由三个运放LM324组成的运放电路后放大100倍,然后输入施密特触发器使其波形变为高低电平,将此波形输入到单片机主控芯片,利用单片机内部的计数器和定时器完成对频率的测量。大部分采用运放LM324构成放大100倍电路,位于图下方由5V电源供电的运放可以产生一个2.5V的直流电压,将此2.5V的直流电压输入到第一级运

8、放后,会使输入的交流信号上偏2.5V,变为0-5V,再经过100000pF的电容C3滤掉被放大的噪声以及2.5V直流后,变为-2.5+2.5的交流信号,之后进入二级放大;如图所示第二级运放在加入+2.5V直流电压后输出为05V的交流信号,至此外加交流信号已被放大100倍;在外加交流信号被放大100倍之后进入施密特触发器CD40106,该触发器在常温5V供电下门限电压 =1.4V ,输出高电平 ,低电平 , 此部分电路输出即为这个高低电平。电路如图三所示:图三在实际的检测中发现放大器并不能将信号放大100倍,故幅值较小的信号不能正常显示频率,只要当信号的峰峰值大于1.5V时才能使单片机正常显示信

9、号的频率。5.单片机电路采用STC12C5A60S2单片机,作为整个系统的控制器,控制各个模块协调工作。运用其内部集成的一个AD作为数模转换器。如图四所示 图四6.系统整体电路图如图五所示图五四软件设计AD流程图如图六 图七所示采样是否是大于最大值有效值AD采样输出有效值将采样值存入有效值中开始整流后的信号图六开始定时器1定时0.05us,定时20次计时器0下降沿计数CD40106整形后的脉冲定时已完成输出计数器的计数图七1.正弦波有效值的测量方法工频正弦电压信号频率f和初相位角已知,且0,现以t=0时可作为基准时间,并在t=0时刻开始进行等间隔采样,共得到正弦波u(t)的N个测量值(采样数据

10、)u(0),u(1),u(N-1),希望利用这N个测量值来计算正弦波的幅值Um(有效值U)。设采样周期为TS,如果不存在噪音,且测量无偏差,则有我们可以设法利用测量值求解出正弦波参数。实际上,我们的测量存在误差,同时信号存在噪音,因此,对每一个测量信号u(k),它与对应时刻t=k·TS的正弦波的值存在一个误差,其中k=0,1,N-1。定义为了利用N个测量值来尽可能准确的计算正弦波幅值Um,我们定义指标函数为:它是频率f,幅值Um,初相位角的函数。我们的目的就是求频率f,幅值Um,初相位角使得目标函数最小。为此,令可以得到正弦波的幅值为了与正弦波的真正幅值Um表示上的区别,用UmC表示

11、利用N个采样数据获得的正弦波幅值计算值,既对于f50Hz(以前面的测量值为准,这里仅为举例),选择采样周期TS 20/200=0.1ms=100us,既每个周期采样200点(每半个周波100次采样),是确定的(可以预先求出,存于sin表中),sin2(2·f·k·TS)同样作为常数表,而且本身是一个常数,因此公式(2)变为当采样周期很小时,数值积分系数C可以用来替代(可以认为C是一个周期类的数值积分,当采样周期很小时,就用积分项来表示)。就可利用N个等间隔测量值计算出正弦信号的峰值Um。正弦波的有效值与峰值的关系半波绝对值电路:在待测交流信号的正半波,输出待测信号

12、送AD变换电路,在待测信号的负半波,输出0.正半波时,Px.y=0,单片机利用该信号识别是正半波信号,进行AD转换,获得N个采样值。在Px.y=1时,单片机暂停AD变换,利用正半波获得的N个检测信号计算正弦波的有效值U,频率f。2.数据测量幅值的测量输入幅值vpp(v)54.543532521.51单片机读数(v)3.4863.1432.80421522.092174214051.0450.695误差(%)-1.4-1.3-0.81.3-1.3-1.40.6-1.4-1.7表1频率的测量被测信号(Hz)1002001K2K5K10K20K30K40K读值(Hz)9919799920105032

13、10040200563002540034误差(%)11.50.10.50.60.40.280.0830.08表23.数据分析由上图可知在输入信号vpp在0.7v到5v的区域内,实验作品的误差较小能够实现有效值的测量,当频率在100Hz到40KHz时,在误差允许范围内,作品基本能完成对该信号的准确测量。4.软件部分代码:#include <reg52.h> #include <intrins.h>#define FOSC 12000000L#define BAUD 9600typedef unsigned char BYTE;typedef unsigned int WO

14、RD;sbit LCM_E=P25;/定义接口sbit LCM_RW=P26;sbit LCM_RS=P27;sfr ADC_CONTR = 0xBC; sfr ADC_RES = 0xBD;sfr ADC_LOW2 = 0xBE;sfr P1ASF = 0x9D;sfr AUXR = 0x8e; #define ADC_POWER 0x80#define ADC_FLAG 0x10#define ADC_START 0x08#define ADC_SPEEDLL 0x00#define ADC_SPEEDL 0x20#define ADC_SPEEDH 0x40#define ADC_SPE

15、EDHH 0x60#define LCM_Data P0/数据接口void InitUart();void SendData(BYTE dat);void Delay(unsigned int n);void IO_ADinit() ;void ADC_Power_On() ;void get_ad_result() ;void ADCONVERT() ;void WriteDataLCM(BYTE WDLCM);void WriteCommandLCM(BYTE WCLCM,BuysC);BYTE ReadDataLCM(void);BYTE ReadStatusLCM(void);unsi

16、gned int GetADCResult(BYTE ch);void LCMInit(void);void DisplayOneChar(BYTE X, BYTE Y, BYTE DData);void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData);void Delay5Ms(void);void Delay400Ms(void);void Disp_number(unsigned int num,BYTE n);void ShowResult(BYTE ch);unsigned int GetADCResult(BYTE a);unsi

17、gned int data_max = 0;unsigned long data_max1,count =0;unsigned int data_change = 150;/0.7Vunsigned char code VP4="Amp:",Freq5="Freq:"unsigned int Counter = 0;unsigned int data_last = 0;BYTE ch = 0;unsigned int Frequency = 0;unsigned int nn =0,flag = 0,flag1 = 0,nn1=0; unsigned i

18、nt PrintFre5 ; unsigned int Print4; unsigned int number4;unsigned int D;void main()unsigned int n=0;Delay400Ms();/启动等待,等LCM讲入工作状态LCMInit();/LCM初始化Delay5Ms();/延时片刻(可不要)ET1 = 1;EA=1;InitUart();TMOD = 0x15;/均为16位计数器 TH0 = 0x00;TL0 = 0x00;TH1 = 0x3C;TL1 = 0xAF; TCON = 0x50;/T1,T0均工作,t1做定时器,t0做计数器; while

19、(1) ADCONVERT(); n+; if(n>10000)data_max=0;n=0;void To_interrupt(void)interrupt 3 using 1int i ,j;unsigned int Change1,Print4; unsigned long int Change2; TH1 = 0x3C; TL1 = 0xAF;Counter = Counter+;if(Counter = 20) Frequency = (TH0<<8)+TL0;/读取此时计数器0的读数 if(Frequency>=2000)Change1 = (Frequen

20、cy/100)*92; else if (Frequency>=200)Change1 = (Frequency/10)*92)/10; else Change1 = (Frequency*97)/100; for( i=0;i<5;i+)PrintFrei = Change1 % 10;Change1 = Change1 / 10; for(i=4;i>=0;i-) if(i>0)DisplayOneChar(4-i,0,PrintFrei+48); elseDisplayOneChar(4-i,0,PrintFrei+48); DisplayListChar(5-i

21、,0,"Hz"); Change2 = data_max*50; Change2 = Change2/10/1.414;for(j=0;j<=3;j+)Printj = Change2 % 10;Change2 = Change2 / 10; for(j=3;j>=0;j-) if(j>0) DisplayOneChar(10-j,0,Printj+48); else DisplayOneChar(10-j,0,Printj+48); DisplayListChar(11-j,0,"mV"); TH1 = 0x3C; TL1 = 0xA

22、F; TH0 = 0xFF; TL0 = 0xFC; Counter = 0; void IO_ADinit() ADC_CONTR=0xe0; /设置P1.0为输入AD转换口 _nop_(); /ADC_CONTR需要四个指令延时 _nop_(); _nop_(); _nop_(); void ADC_Power_On() ADC_CONTR|=0x80; _nop_(); _nop_(); _nop_(); _nop_(); void get_ad_result() unsigned int q=0,ad_average_result; ADC_RES=0; ADC_LOW2=0; ADC

23、_CONTR|=0x08; while(!(ADC_FLAG&ADC_CONTR) ; ADC_CONTR&=0xE7; ad_average_result=(ADC_RES<<2)+ADC_LOW2; if(data_max<ad_average_result)data_max=ad_average_result; void ADCONVERT() ADC_Power_On(); IO_ADinit(); get_ad_result(); void InitUART()SCON = 0x5a;PCON|= 0x80;void SendData(BYTE da

24、t) while(!TI); TI = 0;SBUF = dat; void Delay(unsigned int i)unsigned char j;for(i; i > 0; i-)for(j = 200; j > 0; j-) ;void WriteDataLCM(BYTE WDLCM)ReadStatusLCM(); /检测忙LCM_Data = WDLCM;LCM_E = 0;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; /若晶振速度太高可以在这后加小的延时LCM_E = 1;LCM_E = 0;void WriteCommandLCM(BYTE WC

25、LCM,BuysC) /BuysC为0时忽略忙检测if (BuysC) ReadStatusLCM(); /根据需要检测忙LCM_Data = WCLCM;LCM_E = 0;LCM_RS = 0;LCM_RW = 0; LCM_E = 1; LCM_E = 0;BYTE ReadDataLCM(void)LCM_E = 0;LCM_RS = 1; LCM_RW = 1;LCM_E = 1;LCM_E = 0;return(LCM_Data);BYTE ReadStatusLCM(void)LCM_Data = 0xFF;LCM_E = 0; LCM_RS = 0;LCM_RW = 1;LCM

26、_E = 1;LCM_E = 0;while (LCM_Data & 0x80) /检测忙信号 LCM_E=0; LCM_E=1; return(LCM_Data);void LCMInit(void) /LCM初始化LCM_Data = 0;WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); WriteCommandLCM(0x38,0);Delay5Ms(); WriteCommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号Write

27、CommandLCM(0x08,1); /关闭显示WriteCommandLCM(0x01,1); /显示清屏WriteCommandLCM(0x06,1); / 显示光标移动设置WriteCommandLCM(0x0C,1); / 显示开及光标设置void DisplayOneChar(BYTE X, BYTE Y, BYTE DData)Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1if (Y) X |= 0x40; /当要显示第二行时地址码 0x40; X += 0x80; / 算出指令码WriteCommandLCM(X, 0); /这里不检测

28、忙信号,发送地址码WriteDataLCM(DData);void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData)BYTE ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1while (DDataListLength) /若到达字串尾则退出 if (X <= 0xF) /X坐标应小于0xF DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+ ; X+ ; void Disp_number(unsigned int num,BYTE n) BYTE a; /个位 BYTE b; /十位BYTE c; /百位BYTE d; /千位/ BYTE e; /万位switch(n)case 1:WriteDataLCM(num);break;

温馨提示

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

评论

0/150

提交评论