当前位置:文档之家› 正弦信号发生器的设计

正弦信号发生器的设计

XXXX大学现代科技学院DSP硬件电路设计基础课程设计设计名称正弦信号发生器的设计专业班级学号姓名DENG指导教师XXXX课程设计任务书注:上交(大张图纸不必装订)2.可根据实际内容需要续表,但应保持原格式不变。

日期:2014-12-10专业班级 XXXXXXX 学号 姓名 DENG 成绩设计题目正弦波信号发生器 设计目的学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。

同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。

设计内容编写一个产生正弦波信号的程序,在CCS 软件下进行模拟运行,观察输出结果。

设计原理正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。

通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。

查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。

泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。

本次课程设计只要使用泰勒级数展开法来实现正弦波信号。

1. 产生正弦波的算法在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前5项进行近似计算。

……………………………………装………………………………………订…………………………………………线………………………………………由上述两个式子可以推导出递推公式,即sin(nx)=2cos(x)sin[(n-1)x]-sin[(n-2)x]cos(nx)=2cos(x)sin[(n-1)x]-cos[(n-2)x]由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知cos(x),而且还需要sin[(n-1)x]、sin[(n-2)x]和cos[(n-2)x]。

2. 正弦波的实现⑴计算一个角度的正弦值利用泰勒级数的展开式,可计算一个角度x的正弦值,并采用子程序的调用方式。

在调用前先在数据存储器d_xs单元中存放x的弧度值,计算结果存放在d_sinx单元中。

⑵计算一个角度的余弦值利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。

调用前先将x弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。

⑶正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波。

其实现步骤如下:第一步:利用sin_start和cos_start 子程序,计算 45°~0°(间隔为 0.5°)的正弦和余弦值;第二步:利用sin(2x)=2sin(x)cos(x)公式,计算 90°~0°的正弦值(间隔为1°);第三步:通过复制,获得359°~0°的正弦值;第四步:将359°~0°的正弦值重复从PA口输出,便可得到正弦波。

在实际应用中,正弦波是通过D/A口输出的。

选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。

总体方案设计1. 总体实现方案我们知道一个角度为x的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点与x轴的每一个角度值相对应,那么我们可以利用DSP处理器处理大量重复计算的优势来计算,x轴每一点对应的y轴的值(在x轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。

可由于正弦波的特殊的对称形式给程序的编制找到了出口。

Sin(∏/4)的弧度为0.7854<1,即0~∏/4之间的任意正弦、余弦值可以利用汇编程序得到N又可以利用公式:sin(2a)=2sin(a)cos(a) 得到0~∏/2 之间的正弦值。

而0~∏/2 之间的正弦曲线与∏/2~∏之间的正弦曲线通过x=∏/2这条轴左右对称,那么就可以得到∏/2~∏的正弦值,而0~∏的正弦曲线的相反数通过x=∏这条轴与∏~2∏左右对称。

这样∏~2∏的正弦值也得到了。

一个周期内完整的正弦波就得到了。

正弦波产生的流程图如下:2. 具体实现步骤本课程设计需要使用C54X汇编语言产生正弦波,并通过CCS的图形显示工具观察波形。

设计分以下几步完成:启动CCS,操作如下:1.建立新的工程文件:点击Project→New,保存文件名为sinx.pjt。

2.建立汇编源程序:点击File→New→Source File菜单命令,打开一个空白文档,将汇编源程序逐条输入后,单击Flie→Save菜单命令,文件类型保存为(*.asm),单击“保存”按钮,以上汇编程序被存盘。

3.建立连接命令文件:点击File→New→Source File菜单命令,打开一个空白文档,将链接命令文件逐条输入后,单击Flie→Save菜单命令,文件类型保存为(*.cmd),单击“保存”按钮,以上链接命令文件被存盘。

4.选择Project 菜单中的Add File to Project 选项,将汇编源程序sin.asm和链接定位sin.cmd文件依次添加到工程文件中。

5.选择Project 菜单中的Options 选项,并选择build options 项来修改或添加编译、连接中使用的参数。

选择Linker 窗口,在“Output Filename”栏中写入输出OUT 文件的名字,如sin.out,还可以设置生成的map文件名。

6.完成汇编,编译和链接,正确产生.out文件:点击Project菜单中的Rebuild all,请注意在监视窗口显示的汇编,编译和链接的相关信息。

如果没有错误,将产生sin.out文件;如果有错,在监视窗口以红色字体显示出错误行,用鼠标双击该行,光标跳将至源程序相应的出错行。

修改错误后,重新汇编链接。

7.在Project 选项中打开sin.pjt 文件,使用Build 选项完成编译、连接。

8.使用File 菜单中的Load Program 将OUT 文件装入。

然后选择Debug→Run,程序执行过程中可以使用Debug →Halt 暂停程序的执行。

9.选择View -> Graph -> Time/Frequency菜单打开一个图形显示窗口。

将“Start Address”项改为地址sin_x,将“Acquisition Buffer Size”项设置为360,将“Display Data Size”项设置为360,将“DSP Data Type”改为“16-bit signed integer”。

主要参数1.sin(theta)=x(1-x^2/2*3(1-x^2/4*5(1-x^2/6*7(1-x^2/8*9))))2. cos(theta)=1-x^2/2*3(1-x^2/4*5(1-x^2/6*7(1-x^2/8*9)))3. sin(2*theta)=2*sin(theta)*cos(theta)源程序1. 产生正弦波程序清单sin.asm.mmregs.def start.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x: .usect "sin_x",360STACK: .usect "STACK",10Hk_theta .set 286 ;theta=pi/360(0.5deg)start:.textSTM #STACK+10H,SPSTM k_theta,AR0STM 0,AR1STM #sin_x,AR6STM #90,BRCRPTB loop1-1LDM AR1,ALD #d_xs,DPSTL A,@d_xsSTL A,@d_xcCALL sinx ;d_sinx=sin(x)CALL cosx ;d_cosx=cos(x)LD #d_sinx,DPLD @d_sinx,16,A ;A=sin(x)MPYA @d_cosx ;B=sin(x)*cos(x)STH B,1,*AR6+ ;AR6----2*sin(x)MAR *AR1+0loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.) STM #88,BRCRPTB loop2-1LD *AR7-,ASTL A,*AR6+loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.) STM #sin_x,AR7RPTB loop3-1LD *AR7+,ANEG ASTL A,*AR6+loop3: STM #sin_x,AR6 ;generate sin waveSTM #1,AR0STM #360,BKB loop3sinx:.def d_xs,d_sinx.datatable_s .word 01C7H ;C1=1/(8*9).word 030BH ;C2=1/(6*7).word 0666H ;C3=1/(4*5).word 1556H ;C4=1/(2*3)d_coef_s .usect "coef_s",4d_xs .usect "sin_vars",1d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_vars",1d_l_s .usect "sin_vars",1.textSSBX FRCTSTM #d_coef_s,AR5 ;move coeffs table_sRPT #3MVPD #table_s,*AR5+STM #d_coef_s,AR3STM #d_xs,AR2STM #d_l_s,AR4ST #7FFFH,d_l_sSQUR *AR2+,A ;A=x^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2MPYA A ;A=T*A=x^2(1-x^2/72)STH A,*AR2 ;(d_temp)=x^2(1-x^2/72)MASR *AR2-,*AR3+,B,A ;A=1-x^2/42(1-x^2/72);T=x^2(1-x^2/72)MPYA *AR2+ ;B=x^2(1-x^2/42(1-x^2/72))ST B,*AR2 ;(d_temp)=x^2(1-x^2/42(1-x^2/72))||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/20(1-x^2/42(1-x^2/72))MPYA *AR2+ ;B=x^2(1-x^2/20(1-x^2/42(1-x^2/72)))ST B,*AR2 ;(d_temp)=B||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72)))MPYA d_xs ;B=x(1-x^2/6(1-x^2/20(1-x^2/42(1-x^2/72))))STH B,d_sinx ;sin(theta)RETcosx:.def d_xc,d_cosxd_coef_c .usect "coef_c",4.datatable_c .word 0249H ;C1=1/(7*8).word 0444H ;C2=1/(5*6).word 0AABH ;C3=1/(3*4).word 4000H ;C4=1/2d_xc .usect "cos_vars",1d_squr_xc .usect "cos_vars",1d_temp_c .usect "cos_vars",1d_cosx .usect "cos_vars",1c_l_c .usect "cos_vars",1.textSSBX FRCTSTM #d_coef_c,AR5 ;move coeffs table_cRPT #3MVPD #table_c,*AR5+STM #d_coef_c,AR3STM #d_xc,AR2STM #c_l_c,AR4ST #7FFFH,c_l_cSQUR *AR2+,A ;A=x^2ST A,*AR2 ;(AR2)=x^2||LD *AR4,B ;B=1MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2MPYA A ;A=T*A=x^2(1-x^2/56)STH A,*AR2 ;(d_temp)=x^2(1-x^2/56)MASR *AR2-,*AR3+,B,A ;A=1-x^2/30(1-x^2/56); T=x^2(1-x^2/56)MPYA *AR2+ ;B=x^2(1-x^2/30(1-x^2/56))ST B,*AR2 ;(d_temp)=x^2(1-x^2/30(1-x^2/56))||LD *AR4,B ;B=1MASR *AR2-,*AR3+,B,A ;A=1-x^2/12(1-x^2/30(1-x^2/56))SFTA A,-1,A ;-1/2NEG AMPYA *AR2+ ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))MAR *AR2+RETDADD *AR4,16,B ;B=-x^2/2(1-x^2/12(1-x^2/30(1-x^2/56)))STH B,*AR2 ;cos(theta)RET.end2. 产生连接程序清单sin.cmdMEMORY{PAGE 0:EPROM: org=0E000H, len=1000HVECS: org=0FF80H, len=0080HPAGE 1:SPRAM: org=0060H, len=0020HDARAM1: org=0080H, len=0010HDARAM2: org=0090H, len=0010HDARAM3: org=0200H, len=0200H}SECTIONS{.text :> EPROM PAGE 0.data :> EPROM PAGE 0STACK :> SPRAM PAGE 1sin_vars :> DARAM1 PAGE 1coef_s :> DARAM1 PAGE 1cos_vars :> DARAM2 PAGE 1coef_c :> DARAM2 PAGE 1sin_x : align(512) {} > DARAM3 PAGE 1.vectors :>VECS PAGE 0}设计仿真结果及分析在ccs集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波形的线性失真。

相关主题