单片机课程设计---信号发生器_第1页
单片机课程设计---信号发生器_第2页
单片机课程设计---信号发生器_第3页
单片机课程设计---信号发生器_第4页
单片机课程设计---信号发生器_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计信号发生器学生姓名:安小鹏学号:131001201学院:理学院专业:应用物理指导教师:任世伟刘天山2016年06月28日信号发生器摘要:本文以STC89C5件片机为核心设计了一个低频函数信号发生器。信号发生器采用数字波形合成技术,通过硬件电路和软件程序相结合,可输出自定义波形,如正弦波、方波、三角波、锯齿波、波形的频率和幅度在一定范围内可任意改变。波形和频率的改变通过软件控制,幅度的改变通过硬件实现。介绍了波形的生成原理、硬件电路和软件部分的设计原理。关键词:单片机,信号发生器,D/A转换一、设计要求利用单片机的控制及编程能力,采用查询法设计一个函数发生器,要求能够产生方波、正弦波,分

2、析采样点数量与频率之间的关系。二、设计原理向单片机输入所需要的程序并通过扩展D/A转换接口就可以方便地产生正弦信号。正弦波的产生比较特殊,它不是由单片机直接产生波形的,它只能产生连续的阶梯波来向正弦波不断地逼近。很显然,在一个周期内阶梯波的阶梯数目越多,单片机输出的波形也就越接近正弦波。如图所所示一般而言,计算机要形成正弦波信号的最简便办法就是使用D/A转换器,因计算机可以隔一定时间向D/A转换器输出一个数字量,而输出的该数字量为相应时刻的函数值,则在D/A转换器输出端就可以得到一个相应的函数信号。D/A转换器形成的函数信号实际上是一个阶梯状波。所以用D/A转化器形成的正弦波信号除了正弦基频分

3、量(所需要的信号)外,还包含了各种高次谐波与余弦基频分量。因而形成的正弦波信号只能是一逼近的正弦波信号。为了正弦信号的数字量逼近,可以有多种方案。而逼近一个正弦函数的精确程度是和正弦波信号的细分度N和D/A转换器的分辨率直接有关。细分度N越大产生的正弦信号就越精确,但是这要求计算机速度也相应的高;D/A转化器的分辨率越高产生的正弦信号也就越精确,但是D/A转化器的分辨率受其价格和计算速度以及字长的制约,不宜过高,应取一个合理的分辨率。故对正弦信号逼近方案的讨论,是在确定的细分度N和D/A转化器的分辨率基础上比较的。把其结果转换为十六进制,并把计算的十六进制以表格的形式存放于EPROM1存中,然

4、后以查表的方式来形成正弦信号。采用查表的方式单片机正弦波发生器的工作原理如下:对正弦信号进行采样,将正弦波的第一个周期的波形均分为若干等份,设正弦波一个周期采样点数共N个。则有:上式中n取0,1,2,N-1,考虑到正弦函数值的范固层*从-10+1,将它们转化为定点无符号数值存放,例如存放的位数(即M)是8,那么对公式:进行数值迁移,则有:360cXn127sin?n128N这样正弦函数值范围-1->0->+1,因为00HFFH寸应的数字量为0255,存放的8位(即M)二进制数据则相应为0->128->255(十进制表示)。依次对公式采样可得X(n),n=0,1,2,N-

5、1共N个数据,组成了一张正弦数据表,单片机将这一个周期的数据表存入EPROMP。EPRO附地址线和地址发生器的输出端相连。地址发生器在时钟作用下依次产生选通地址,就会依次选中EPROM0单元、1单元、2单元N-1单元地址,再由D/A转化器输出相应幅值的模拟信号,当地址发生器输出满N个地址时,一个完整的正弦波就产生了。假设从数据表中每取一个数据,并将它从D/A转化器输出至少需要时间为ts,那么输出一个完整的正弦波所需要的时间为Tm,则有Tm=tsNo查表程序周而复始进行下去,便可产生连续的正弦波信号。固定周期Ts是由若干机器周期组成,机器周期Tm一般又是单片机时钟周期ts的若干倍,则有:一旦时钟

6、确定,Tm也就固定了。一个固定周期Tn内的计数脉冲数就可以通过下式计算出来:MintTNts三、程序设计:3.1 、设计流程图:检测有按键按下3.2 程序源代码:(见附录1)3.3 产生波形图:(见附录2)四、正弦波误差分析4.1 计数脉冲数M对正弦波的影响固定周期Ts是由若干机器周期组成,机器周期Tm一般又是单片机时钟周期ts的若干倍,产生的正弦波周期为:TsNTnNMts在一个与周期内相对误差为:Nts_1_tsNMts"M"TM若用16MHz时钟的单片机产生的正弦波,设其定时器输入脉冲周期是时钟脉冲的2倍时,则ts计算如下:ts=-2二20.125(.)sf01610

7、6若要产生2300Hz的正弦波,其周期应为11,Ts=434.783(Ffs2300取N=128则:丁'工4347833.397(N128'MTN=织97=27.174ts0.125因为MintTs,所以M=27则最大相对误差ts为:11=3.7%M27由此可见,要减小误差,只能通过减小ts,就可以是误差接近真实值。4.2采样点N对正弦波的影响正弦波发生器是用Nt顺序的以正弦变化的数值来驱动D/A芯片来产生正弦波的。按前面假设的来说,当每输出一点X(n),需要的最少时间为ts,那么输出一个完整的正弦波(即一个周期)需要的时间为Tm,则TM=tsNo此时正弦波的最高频率为:设编制

8、的子程序ts。约为1s,如NX300则fmax-163333HztsN1300106即如果要求输出正弦波的频率f大于3333Hz,只能使NJ、于300。所以可以得出这样的结论:N!大,正弦波的精确度越高,但正弦波最高频率限fmax也越小。正弦波的波形精度R这一概念,R的定义式为:一?100%min将公式代入公式,可得sin变?1N?100%微机化正弦波是取出正弦波数据表中的数值,由D/A转化器输出产生阶跃状的模拟量正弦波。正弦波表格中的数据值直接影响着阶跃状正弦波的形状。波形精度R是对正弦波表格中的数据优劣的一种描述。对模拟正弦波的描述波形精度等价于失真度。根据理想采样的原则,数据X(n)点与

9、点之间的采样时间的间隔是恒定的,即前面的ts,即X(n)序列在时间上是均匀地分布在正弦波上的N个点的采样值。因为N是有限的,所以这些点不能组成光滑的正弦波波形,而是有落差R的波形,且R=X(n)X(n1),它的大小反映了曲线的不光滑程度。正弦波的斜率变化最大应在n=0处,所以RmaxX1X0。下面分别用公式定量计算N=30QN=200的波形精度R300和R200:,360sin?1300?100%=1.04%2360sin?1200?100%=1.57%显然2R300<R200,可以知道N=30的比N=200W言其阶跃状正弦波更趋向于光滑的理论值。五、总结与体会参考文献:1、胡汉才单片机

10、原理及其接口技术(第2版)北京:清华大学出版社20082、阎石数字电子技术基础(第三版)北京:高等教育出版社19893、郭天祥新概念51单片机C®言教程入门、提高、开发全;北京电子工业出版社4、童诗白模拟电路技术基础M北京:高等教育出版社1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.附录1:设计源程序:(c语言)#includeunsigned255,127,0,2,;unsigned0,128255128;unsigned<reg52.h>char252,102,9,charcodeSinWave176,198,217,

11、245,233,217,78,56,37,21,37,56,codeTriWave21,78,16,32,144,240,112,char0,8,16,64,128,192,48,160,224,96,233,198,9,102/正弦波波表245,252,176,152,2,/三角波波表64,80,96,112,176,192,208,192,80,64,48,208,176,32,224,240,160,144,16codeSawWave24,32,40,72,80,88,136,144,96,152,200,208,216,/锯齿波表48,56,104,112,120,160,168,17

12、6,184,224,232,240,24821.unsignedcharcode*pWave;/波表指针22.unsignedcharT0RH=0;/T0重载值的高字节23.unsignedcharT0RL=0;/T0重载值的低字节24.unsignedcharT1RH=1;/T1重载值的高字节25.unsignedcharT1RL=1;/T1重载值的低字节;20.26.27.voidConfigTimer0(unsignedintms);29.externvoidKeyScan();30.externvoidKeyDriver();31.externvoidI2CStart();32.ext

13、ernvoidI2CStop();33.externbitI2CWrite(unsigned34.35.voidmain()36.EA_=1;/开总中断28.voidchardat);SetWaveFreq(unsignedcharfreq);37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.ConfigTimer0(1);/配置T0定时1mspWave=SinWave;/默认正弦波SetWaveFreq(

14、10);/默认频率10Hzwhile(1)KeyDriver();/调用按键驱动/*按键动作函数,根据键码执行相应的操作,keycode-按键键码*/voidKeyAction(unsignedcharkeycode)staticunsignedchari=0;if(keycode=0x26)/向上键,切换波形/在3种波形间循环切换if(i=0)i=1;pWave=TriWave;elseif(i=1)i=2;pWave=SawWave;elsei=0;pWave=SinWave;/*设置DAC输出值,val-设定值*/voidSetDACOut(unsignedcharval)I2CStar

15、t();if(!I2CWrite(0x48<<1)/寻址PCF8591,如未应答,则停止操作并返回I2CStop();return;I2CWrite(0x40);/写入控制字节I2CWrite(val);/写入DA值I2CStop();/*设置输出波形的频率,freq-设定频率*/voidSetWaveFreq(unsignedcharfreq)unsignedlongtmp;77.tmp的32倍=(11059200/12)/(freq*32);/定时器计数频率,是波形频率78.79.80.81.82.83.84.85.86.87.88.89.90.tmp=65536-tmp;/计

16、算定时器重载值tmp=tmp+33;/修正中断响应延时造成的误差T1RH=(unsignedchar)(tmp>>8);/定时器重载值拆分为高低字节T1RL=(unsignedchar)tmp;TMOD&=0x0F;/清零T1的控制位TMOD|=0x10;/配置T1为模式1TH1=T1RH;/加载T1重载值TL1=T1RL;ET1=1;/使能T1中断PT1=1;/设置为高优先级TR1=1;/启动T1/*配置并启动T0,ms-T0定时时间*/91.voidConfigTimer0(unsignedintms)92.unsignedlongtmp;/临时变量93.tmp-110

17、59200/12;/定时器计数频率94.tmp=(tmp*ms)/1000;/计算所需的计数值95.tmp=65536-tmp;/计算定时器重载值96.tmp-tmp+28;/补偿中断响应延时造成的误差97.T0RH=(unsignedchar)(tmp>>8);/te时器重载值拆分为局低子下98.T0RL=(unsignedchar)tmp;99.TMOD&=0xF0;/清零T0的控制位100.TMOD|=0x01;/配置T0为模式1101.TH0-T0RH;/加载T0重载值102.TL0-T0RL;103.ET0-1;/使能T0中断104.TR0-1;/启动T0105.106./*T0中断服务函数,执行按键扫描*/107.voidInterruptTimer0()interrupt1108.T

温馨提示

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

评论

0/150

提交评论