ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:675.53KB ,
资源ID:19114601      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19114601.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于单片机正弦波有效值的测量Word格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于单片机正弦波有效值的测量Word格式.docx

1、 图四6.系统整体电路图如图五所示图五四软件设计AD流程图如图六 图七所示图六图七1.正弦波有效值的测量方法工频正弦电压信号频率f和初相位角已知,且0,现以t=0时可作为基准时间,并在t=0时刻开始进行等间隔采样,共得到正弦波u(t)的N个测量值(采样数据)u(0),u(1),u(N-1),希望利用这N个测量值来计算正弦波的幅值Um(有效值U)。设采样周期为TS,如果不存在噪音,且测量无偏差,则有我们可以设法利用测量值求解出正弦波参数。实际上,我们的测量存在误差,同时信号存在噪音,因此,对每一个测量信号u(k),它与对应时刻t=kTS的正弦波的值存在一个误差,其中k=0,1,N-1。定义为了利

2、用N个测量值来尽可能准确的计算正弦波幅值Um,我们定义指标函数为:它是频率f,幅值Um,初相位角的函数。我们的目的就是求频率f,幅值Um,初相位角使得目标函数最小。为此,令可以得到正弦波的幅值为了与正弦波的真正幅值Um表示上的区别,用UmC表示利用N个采样数据获得的正弦波幅值计算值,既对于f50Hz(以前面的测量值为准,这里仅为举例),选择采样周期TS 20/200=0.1ms=100us,既每个周期采样200点(每半个周波100次采样),是确定的(可以预先求出,存于sin表中),sin2(2fkTS)同样作为常数表,而且本身是一个常数,因此公式(2)变为当采样周期很小时,数值积分系数C可以用

3、来替代(可以认为C是一个周期类的数值积分,当采样周期很小时,就用积分项来表示)。就可利用N个等间隔测量值计算出正弦信号的峰值Um。正弦波的有效值与峰值的关系半波绝对值电路:在待测交流信号的正半波,输出待测信号送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

4、.695误差(%)-1.4-1.3-0.81.30.6-1.7表1频率的测量被测信号(Hz)1002001K2K5K10K20K30K40K读值(Hz)9919799920105032100402005630025400340.10.50.40.280.0830.08表23.数据分析由上图可知在输入信号vpp在0.7v到5v的区域内,实验作品的误差较小能够实现有效值的测量,当频率在100Hz到40KHz时,在误差允许范围内,作品基本能完成对该信号的准确测量。4.软件部分代码:#include intrins.h#define FOSC 12000000L#define BAUD 9600typ

5、edef unsigned char BYTE;typedef unsigned int WORD;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_SPEE

6、DL 0x20#define ADC_SPEEDH 0x40#define ADC_SPEEDHH 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 Re

7、adDataLCM(void);BYTE ReadStatusLCM(void);unsigned 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(BY

8、TE ch);unsigned int GetADCResult(BYTE a);unsigned 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

9、 = 0,nn1=0; unsigned int 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,T

10、0均工作,t1做定时器,t0做计数器; while(1) ADCONVERT(); n+; if(n10000)data_max=0;n=0;void To_interrupt(void)interrupt 3 using 1 int i ,j; unsigned int Change1,Print4; unsigned long int Change2; TL1 = 0xAF; Counter = Counter+; if(Counter = 20) Frequency = (TH0=2000)Change1 = (Frequency/100)*92; else if (Frequency=

11、200)Change1 = (Frequency/10)*92)/10; else Change1 = (Frequency*97)/100; for( i=0;i=0;i-) if(i0)DisplayOneChar(4-i,0,PrintFrei+48); elseDisplayOneChar(4-i,0,PrintFrei+48); DisplayListChar(5-i,0,Hz); Change2 = data_max*50; Change2 = Change2/10/1.414; for(j=0;jj-) if(j0) DisplayOneChar(10-j,0,Printj+48

12、); else DisplayOneChar(10-j,0,Printj+48); DisplayListChar(11-j,0,mV TH1 = 0x3C; TH0 = 0xFF; TL0 = 0xFC; Counter = 0; void IO_ADinit() ADC_CONTR=0xe0; /设置P1.0为输入AD转换口 _nop_(); /ADC_CONTR需要四个指令延时 void ADC_Power_On() ADC_CONTR|=0x80;void get_ad_result() unsigned int q=0,ad_average_result; ADC_RES=0; AD

13、C_LOW2=0; ADC_CONTR|=0x08; while(!(ADC_FLAG&ADC_CONTR) ; ADC_CONTR&=0xE7; ad_average_result=(ADC_RES2)+ADC_LOW2; if(data_max 0; i-) for(j = 200; j j-) ;void WriteDataLCM(BYTE WDLCM)ReadStatusLCM(); /检测忙LCM_Data = WDLCM;LCM_E = 0;LCM_RS = 1;LCM_RW = 0; /若晶振速度太高可以在这后加小的延时LCM_E = 1;void WriteCommandLCM

14、(BYTE WCLCM,BuysC) /BuysC为0时忽略忙检测if (BuysC) ReadStatusLCM(); /根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;BYTE ReadDataLCM(void)LCM_RW = 1;return(LCM_Data);BYTE ReadStatusLCM(void)LCM_Data = 0xFF;while (LCM_Data & 0x80) /检测忙信号 LCM_E=0; LCM_E=1;void LCMInit(void) /LCM初始化LCM_Data = 0;WriteCommandLCM(0x38,0); /

15、三次显示模式设置,不检测忙信号WriteCommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号WriteCommandLCM(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; /当要显示第二行时地

16、址码 0x40; X += 0x80; / 算出指令码WriteCommandLCM(X, 0); /这里不检测忙信号,发送地址码WriteDataLCM(DData);void DisplayListChar(BYTE X, BYTE Y, BYTE code *DData)BYTE ListLength;ListLength = 0;while (DDataListLength) /若到达字串尾则退出 if (X = 0xF) /X坐标应小于0xF DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+ ; X+ ;void D

17、isp_number(unsigned int num,BYTE n)BYTE a; /个位 BYTE b; /十位BYTE c; /百位BYTE d; /千位/ BYTE e; /万位switch(n)case 1:WriteDataLCM(num);break;case 2:b=num/10;a=num%10;WriteDataLCM(numberb);WriteDataLCM(numbera);case 3:c=num/100;b=num%100/10;WriteDataLCM(numberc);case 4:d=num/1000;c=num%1000/100;b=num%1000%10

18、0/10;WriteDataLCM(numberd);/5ms延时void Delay5Ms(void)unsigned int TempCyc = 5552;while(TempCyc-);/400ms延时void Delay400Ms(void)BYTE TempCycA = 5;unsigned int TempCycB;while(TempCycA-)TempCycB=7269;while(TempCycB-);五实习总结:匆匆的4周过去了,我们的实习也将步入结束。4周的实习让我感受良多;在这4周中我们从一开始的原理图方案的设计到实习实物的制作再到对作品的调试到最后的验收,经历了种种挫

19、折与挑战。但在同伴的不懈努力以及老师的细心指导下,我们的作品在不断的辩证下产生了,虽然它简陋而粗糙,但它却依旧是我们汗水与努力的结晶。经过此次实习使我们学到许多,我们拥有了能够独立完成作品的能力,同时加强了我们的动手能力,增进了同学间的友谊。当在实习中也出现了种种问题,比如由于设计方案的不合理使我们一度陷入了进退两难的境地,最终只能浪费一块板,重新做了块新板。又例如由于焊接的粗心导致了多次数据的检测错误等等。不管怎么说这都是一次有意义的实习。最后感谢我们可敬的老师,感谢他们辛苦的付出。六参考文献单片微机原理及应用 清华大学 主编: 方方模拟电子电路 北京大学出版社 主编 :宋树祥电子系统设计创新与实践实习指导书 模拟电子技术基础简明教程清华大学 主编: 杨素行

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1