文档库 最新最全的文档下载
当前位置:文档库 › DSP课程设计正弦信发生器的设计

DSP课程设计正弦信发生器的设计

DSP课程设计正弦信发生器的设计
DSP课程设计正弦信发生器的设计

D S P课程设计正弦信发

生器的设计

SANY标准化小组 #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#

太原理工大学

DSP课程设计:

正弦信号发生器的设计

学号:

班级:

姓名:

指导教师:

一、设计目的

1、通过实验掌握DSP的软件开发过程

2、学会运用汇编语言进行程序设计

3、学会用CCS仿真模拟DSP芯片,通过CCS软件平台上应用C54X汇编语言来实现正弦信号发生装置。

二、设计原理

三、本实验产生正弦波的方法是泰勒级数展开法。泰勒级数展开法需要的单元少,具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。求一个角度的正弦值取泰勒级数的前5项,得近似计算式:

四、总体方案设计

本实验是基于CCS开发环境的。CCS是TI公司推出的为开发TMS320系列DSP软件的集成开发环境,是目前使用最为广泛的DSP开发软件之一。它提供了环境配置、源文件编译、编译连接、程序调试、跟踪分析等环节,并把软、硬件开发工具集成在一起,使程序的编写、汇编、程序的软硬件仿真和调试等开发工作在统一的环境中进行,从而加速软件开发进程。通过CCS软件平台上应用C54X汇编语言来实现正弦信号发生装置。

总体思想是:正弦波的波形可以看作由无数点组成,这些点与x轴的每一个角度值相对应,可以利用DSP处理器处理大量重复计算的优势来计算x轴每一点对应的y的值(在x轴取N个点进行逼近)。整个系统软件由主程序和基于泰勒展开法的SIN子程序组成,相应的软件流程图如图。

五、设计内容

1、设置

在Family下选择C55xx,将看到所有C55xx的仿真驱动,包括软件仿真和硬件仿真;

在Platform下选择Simulator,在Available Factory Boards中只显示软件仿真驱动,选中相应的驱动;

双击C55xx Rev4.0 CPU Functional Simulator,可以在My System下看到所加入的驱动;

点击Save & Quit,将保存设置退出Setup CCStudio v3.1并启动运行CCStudio。

2、编写汇编源程序sin。

3.、建立汇编源程序

在CCS环境下,点击file/new/source file菜单命令,打开一个空白文档,将汇编程序输入。

单击file/save菜单命令,在D:\program files\ti\myprojects下保存文件名为sin,并选择保存类型为*.asm。

4、建立链接命令文件。

5、创建新的工程文件

启动CCS,在Project菜单中选择New项,在Project中输入denglin,CCS将创建一个名为denglin.pjt的工程。

6、将文件添加到工程中

在工程中添加源文件,执行菜单project/add files to project,把sin文件添加到工程中。

7、生成和运行程序

(1)选择菜单命令Project→Rebuild All,对工程重新编译、汇编和链接,主窗口下方的信息窗口将显示build进行汇编、编译和链接的相关信息。

(2)选择菜单命令File→Load Program,在当前目录的Debug目录下选择sin并打开,将Build生成的程序加载到DSP中。

(3)选择菜单命令Debug→Run或在Debug工具栏上单击Run按钮,运行该程序。

8、观察运行结果

点击view/gragh菜单命令观看图像

六、主要参数

七、源程序

汇编源程序sin

.mmregs

.def start

.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx

sin_x: .usect "sin_x",360

STACK: .usect "STACK",10H

k_theta .set 286 ;theta=pi/360(0.5deg)

start:

.text

STM #STACK+10H,SP

STM k_theta,AR0

STM 0,AR1

STM #sin_x,AR6

STM #90,BRC

RPTB loop1-1

LDM AR1,A

LD #d_xs,DP

STL A,@d_xs

STL A,@d_xc

CALL sinx ;d_sinx=sin(x)

CALL cosx ;d_cosx=cos(x)

LD #d_sinx,DP

LD @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+0

loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.)

STM #88,BRC

RPTB loop2-1

LD *AR7-,A

STL A,*AR6+

loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.)

STM #sin_x,AR7

RPTB loop3-1

LD *AR7+,A

NEG A

STL A,*AR6+

loop3: STM #sin_x,AR6 ;generate sin wave

STM #1,AR0

STM #360,BK

B loop3

sinx:

.def d_xs,d_sinx

.data

table_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",4

d_xs .usect "sin_vars",1

d_squr_xs .usect "sin_vars",1

d_temp_s .usect "sin_vars",1

d_sinx .usect "sin_vars",1

d_l_s .usect "sin_vars",1

.text

SSBX FRCT

STM #d_coef_s,AR5 ;move coeffs table_s RPT #3

MVPD #table_s,*AR5+

STM #d_coef_s,AR3

STM #d_xs,AR2

STM #d_l_s,AR4

ST #7FFFH,d_l_s

SQUR *AR2+,A ;A=x^2

ST A,*AR2 ;(AR2)=x^2

||LD *AR4,B ;B=1

MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2

MPYA 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=1

MASR *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=1

MASR *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)

RET

cosx:

.def d_xc,d_cosx

d_coef_c .usect "coef_c",4

.data

table_c .word 0249H ;C1=1/(7*8)

.word 0444H ;C2=1/(5*6)

.word 0AABH ;C3=1/(3*4)

.word 4000H ;C4=1/2

d_xc .usect "cos_vars",1

d_squr_xc .usect "cos_vars",1

d_temp_c .usect "cos_vars",1

d_cosx .usect "cos_vars",1

c_l_c .usect "cos_vars",1

.text

SSBX FRCT

STM #d_coef_c,AR5 ;move coeffs table_c

MVPD #table_c,*AR5+

STM #d_coef_c,AR3

STM #d_xc,AR2

STM #c_l_c,AR4

ST #7FFFH,c_l_c

SQUR *AR2+,A ;A=x^2

ST A,*AR2 ;(AR2)=x^2

||LD *AR4,B ;B=1

MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2

MPYA 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=1

MASR *AR2-,*AR3+,B,A ;A=1-x^2/12(1-x^2/30(1-

x^2/56))

SFTA A,-1,A ;-1/2

NEG A

MPYA *AR2+ ;B=-x^2/2(1-x^2/12(1-

x^2/30(1-x^2/56)))

MAR *AR2+

RETD

ADD *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

.end .mmregs

.def start

.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx

sin_x: .usect "sin_x",360

STACK: .usect "STACK",10H

k_theta .set 286 ;theta=pi/360(0.5deg)

start:

.text

STM #STACK+10H,SP

STM k_theta,AR0

STM 0,AR1

STM #sin_x,AR6

STM #90,BRC

RPTB loop1-1

LD #d_xs,DP

STL A,@d_xs

STL A,@d_xc

CALL sinx ;d_sinx=sin(x)

CALL cosx ;d_cosx=cos(x)

LD #d_sinx,DP

LD @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+0

loop1: STM #sin_x+89, AR7 ;sin91(deg.)-sin179(deg.)

STM #88,BRC

RPTB loop2-1

LD *AR7-,A

STL A,*AR6+

loop2: STM #179,BRC ;sin180(deg.)-sin359(deg.)

STM #sin_x,AR7

RPTB loop3-1

LD *AR7+,A

NEG A

STL A,*AR6+

loop3: STM #sin_x,AR6 ;generate sin wave

STM #1,AR0

STM #360,BK

B loop3

sinx:

.def d_xs,d_sinx

.data

table_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",4

d_xs .usect "sin_vars",1

d_squr_xs .usect "sin_vars",1

d_temp_s .usect "sin_vars",1

d_sinx .usect "sin_vars",1

d_l_s .usect "sin_vars",1

.text

SSBX FRCT

STM #d_coef_s,AR5 ;move coeffs table_s RPT #3

MVPD #table_s,*AR5+

STM #d_coef_s,AR3

STM #d_xs,AR2

STM #d_l_s,AR4

ST #7FFFH,d_l_s

SQUR *AR2+,A ;A=x^2

ST A,*AR2 ;(AR2)=x^2

||LD *AR4,B ;B=1

MASR *AR2+,*AR3+,B,A ;A=1-x^2/72,T=x^2

MPYA 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=1

MASR *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=1

MASR *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)

RET

cosx:

.def d_xc,d_cosx

d_coef_c .usect "coef_c",4

.data

table_c .word 0249H ;C1=1/(7*8)

.word 0444H ;C2=1/(5*6)

.word 0AABH ;C3=1/(3*4)

.word 4000H ;C4=1/2

d_xc .usect "cos_vars",1

d_squr_xc .usect "cos_vars",1

d_temp_c .usect "cos_vars",1

d_cosx .usect "cos_vars",1

c_l_c .usect "cos_vars",1

.text

SSBX FRCT

STM #d_coef_c,AR5 ;move coeffs table_c

RPT #3

MVPD #table_c,*AR5+

STM #d_coef_c,AR3

STM #d_xc,AR2

STM #c_l_c,AR4

ST #7FFFH,c_l_c

SQUR *AR2+,A ;A=x^2

ST A,*AR2 ;(AR2)=x^2

||LD *AR4,B ;B=1

MASR *AR2+,*AR3+,B,A ;A=1-x^2/56,T=x^2

MPYA 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=1

MASR *AR2-,*AR3+,B,A ;A=1-x^2/12(1-x^2/30(1-

x^2/56))

SFTA A,-1,A ;-1/2

NEG A

MPYA *AR2+ ;B=-x^2/2(1-x^2/12(1-

x^2/30(1-x^2/56)))

MAR *AR2+

RETD

ADD *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

链接命令文件

MEMORY

{

PAGE 0:

EPROM: org=0E000H, len=1000H

VECS: org=0FF80H, len=0080H

PAGE 1:

SPRAM: org=0060H, len=0020H

DARAM1: org=0080H, len=0010H

DARAM2: org=0090H, len=0010H

DARAM3: org=0200H, len=0200H

}

SECTIONS

{

.text :> EPROM PAGE 0

.data :> EPROM PAGE 0

STACK :> SPRAM PAGE 1

sin_vars :> DARAM1 PAGE 1

coef_s :> DARAM1 PAGE 1

cos_vars :> DARAM2 PAGE 1

coef_c :> DARAM2 PAGE 1

sin_x : align(512) {} > DARAM3 PAGE 1

.vectors :>VECS PAGE 0

}

八、实验结果及分析

结果成功生成了正弦波图像,表明改程序能通过TMS320C54x产生正弦信号

九、设计总结

这次实验通过与小组的探讨研究使我对这门学科的基本知识、理论解起来更加方便直观和深刻。我同时明白了,做实验不是一味的砖牛角,而是需要相互探讨研究充分发挥团队力量才可在最短时间做出结果。通过实验我基本了解了DSP应用系统开发方法和设计过程,掌握了汇编源程序的编辑、汇编和链接过程,熟悉了CCS集成开发环境,CCS的安装及设置,CCS集成开发环境,CCS的基本使用,调试应用程序。我成功通过CCS软件应用C54X汇编语言实现了正弦信号发生装置,这次实验使我能够更真实地体会到DSP的功能和用途。

相关文档