DSP课程设计正余弦信号的产生

XXXX

DSP 课程设计

摘要:

在上学期数字信号处理(DSP)学习的基础上,本次课程设计的目的是,学会使用CCS(Code Composer Studio) 或matlab7.0集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个余弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。

目录

第一章 概述„„„„„„„„„„„„„„„„„„„„„„„04 1.1设计目的„„„„„„„„„„„„„„„„„„„„„04 1.2设计内容„„„„„„„„„„„„„„„„„„„„„04 1.3设计原理„„„„„„„„„„„„„„„„„„„„„04 第二章 总体方案设计„„„„„„„„„„„„„„„„„„„08

2.1 总体实现方案„„„„„„„„„„„„„„„„„„„08 2.2 具体实现步骤„„„„„„„„„„„„„„„„„„„10 第三章 源程序„„„„„„„„„„„„„„„„„„„„„„11 第四章 设计仿真结果及分析„„„„„„„„„„„„„„„„15 第五章 Matlab下产生该正弦信号„„„„„„„„„„„„„16 5.1 程序„„„„„„„„„„„„„„„„„„„„„„„16 5.2实验图形„„„„„„„„„„„„„„„„„„„„„16 第六章 设计总结„„„„„„„„„„„„„„„„„„„„„17

第一章 概述

1.1设计目的

学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。

1.2设计内容

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

1.3设计原理

正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。 1. 产生正弦波的算法

在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为

x 3x 5x 7x 9

sin(x ) =x -+-+-

3! 5! 7! 9!

x 2x 4x 6x 8

x () =1-+-+- c o s

2! 4! 6! 8!

若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前5项进行近似计算。

222⎛⎛⎫⎫⎫⎛⎫x 3x 5x 7x 9x 2⎛x x x 1- 1-⎪⎪⎪ ⎪sin(x ) =x -+-+=x 1-1- ⎪⎪⎪ 2⨯3 4⨯5 3! 5! 7! 9! ⎝6⨯7⎝8⨯9⎭⎭⎭⎪⎝⎝⎭222

⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x 1-⎪⎪ ⎪cos(x ) =1-+-+=1-1-1- ⎪ ⎪⎪2! 4! 6! 8! 2 ⎝3⨯4⎝5⨯6⎝7⨯8⎭⎭⎭

由上述两个式子可以推导出递推公式,即

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单元中。

实现计算一个角度的正弦值的程序片段如下: sinx:

.def d_xs,d_sinx .data

table_s .word 01C7H ;C1=1/(8*9) .word 030BH ;C2=1/(6*7) d_coef_s d_xs d_squr_xs d_temp_s d_sinx d_l_s .word 0666H ;C3=1/(4*5) .word 1556H ;C4=1/(2*3) .usect "coef_s",4 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .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

⑵计算一个角度的余弦值

利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将x 弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。

实现计算一个角度的余弦值的程序片段如下: 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 ⑶正弦波的实现

利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下: 第一步:利用sin_start和cos_start子程序,计算0 ~45 (间隔为0. 5 )的正弦和余弦值;

第二步:利用sin(2x)=2sin(x)cos(x)公式,计算0 ~90 的正弦值(间隔为1 ); 第三步:通过复制,获得0 ~359 的正弦值;

第四步:将0 ~359 的正弦值重复从PA 口输出,便可得到正弦波。 产生正弦波的程序片段如下:

.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

产生正弦波链接命令文件的程序片段如下: 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 }

在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。

第二章 总体方案设计

2.1. 总体实现方案

我们知道一个角度为x 的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:

2⎛222⎛⎫⎛⎛⎫⎫⎫x 3x 5x 7x 9x x x x ⎪ 1-⎪⎪ ⎪sin(x ) =x -+-+- ≈x 1-1-1- ⎪ ⎪ 2⨯3 4⨯5⎝6⨯7⎝8⨯9⎭⎪3! 5! 7! 9! ⎭⎭⎪⎝⎝⎭222

⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x ⎪⎪ ⎪cos(x ) =1-+-+- ≈1-1-1-1- ⎪ ⎪2! 4! 6! 8! 2⎝3⨯4⎝5⨯6⎝7⨯8⎭⎪⎭⎭

本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点

与x 轴的每一个角度值相对应,那么我们可以利用DSP 处理器处理大量重复计算的优势来计算,x 轴每一点对应的y 轴的值(在x 轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。

sin(π) 的弧度为0.7854

序得到N 又可以利用公式:sin 2α=2sin αcos α得到0~π之间的正弦值。而

0~π

之间的正弦曲线与π~π之间的正弦曲线通过x =π这条轴左右对称,

那么就可以得到π~π的正弦值,而0~π的正弦曲线的相反数通过x =π这条轴与π~2π左右对称。这样π~2π的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:

2.2. 具体实现步骤

本课程设计需要使用C54X 汇编语言产生正弦波,并通过 CCS 的图形显示工具观察波形。设计分以下几步完成: 启动 CCS ,操作如下:

1.建立新的工程文件:点击Project →New ,保存文件名为sinx.pjt 。

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

3.建立连接命令文件:点击Fil e →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 文件装入。然后选择 Debu g →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” 。 即将Graph Property Dialog对话框改为见下图:

这样,将在图形显示窗口中显示从sin_x(首地址)开始的360个点的 16 位有符号整数的图形。

第三章 源程序

主要参数

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 :

.title "sin.asm" ;为汇编文件取名为“sin.asm ” .mmregs ;定义存储器映像寄存器

.def _c_int00

.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号 sin_x: .usect "sin_x",360 ;为"sin_x"保留360个存储空间 STACK: .usect "STACK",10 ;为堆栈保留10个存储空间

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

PA0 .set 0

_c_int00

.text ;定义文本程序代码段

STM #STACK+10,SP ;设置堆栈指针

STM k_theta,AR0 ;AR0-->K_theta(increment) STM 0,AR1 ;(AR1)=X(rad)

STM #sin_x,AR6 ;AR6- - >sin(x)

STM #90,BRC ;form sin0(deg.)—sin90(deg)

;重复执行块语句(下条语句开始至

loop1-1 )91次

RPTB loop1-1

LDM AR1,A

LD #d_xs,DP ;DPd_xs

STL A,@d_xs ;(A)低16位→d_xs

STL A,@d_xc ;(A)低16位→d_xc

CALL sinx ;调用sinx 程序

CALL cosx ;调用conx 程序

LD #d_sinx,DP ;DP d_sinx

LD @d_sinx,16,A ;A=sin(x)

MPYA @d_cosx ;B= sin(x)*cos(x)

STH B,1,*AR6+ ;AR6- - >2*sin(x)*cos(x)

MAR *AR1+0 ;修改辅助寄存器AR1

loop1: STM #sin_x+89,AR7 ;sin91(deg.)- -sin179(deg.) STM #88,BRC ;重复执行下条指令至loop2-1 RPTB loop2-1 ;处90次

LD *AR7-,A ;((AR7)) →A, 然后AR7减去1 STL A,*AR6+ ;(A) 低16位→AR6

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

;(BRC)=179,重复执行180次

STM #sin_x,AR7 ;AR7指向sin_x首地址

RPTB loop3-1 ;

LD *AR7+,A ;((AR7)) →A ,然后AR7加1

NEG A ;累加器变负

STL A,*AR6+ ;A 低16位→AR6

loop3: STM #sin_x,AR6

STM #1,AR0

STM #360,BK

loop4: PORTW *AR6+0%,PA0

B loop4

sinx:

.def d_xs,d_sinx

.data

table_s .word 01c7h

.word 030bh

.word 0666h

.word 1556h

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

c_l_s .usect "sin_vars",1

.text

SSBX FRCT

STM #d_coef_s,AR5

RPT #3

MVPD #table_s,*AR5+

STM #d_coef_s,AR3

STM #d_xs,AR2

STM #c_l_s,AR4

ST #7FFFh,c_l_s

SQUR *AR2+,A

ST A,*AR2

||LD *AR4,B

;generate sin wave AR6指向sin_x ;AR ← 01 ;BK ←360 ;PA0=*AR6+0%,向PA0输出数据 ; ;定义标号d_xs,d_sinx ;定义数据代码段 ;c1=1/(8*9) ;c1=1/(6*7) ;c1=1/(4*5) ;c1=1/(2*3) ;为"coef_s"保留4个存储空间 ;为d_xs中sin_vars保留1个存储空间 ;为d_squr_xs中sin_vars保留1个存储空间 ;为d_temp_s中sin_vars保留1个存储空间 ;为d_sinx中sin_vars保留1个存储空间 ;为d_xs中sin_vars保留1个存储空间 ;定义代码开始段 ;设置FRCT=1以解决冗余符号位 ;AR5指向d_coef_s首地址 ;重复下条指令4次 ;table_s中的数复制到AR5指向的单元 ;AR3指向d_coef_s首地址 ;AR2指向d_xs首地址 ;AR4指向c_l_s首地址 ;7FFFh →c_l_s ;AR2指向累加器A 中的数值求其平方 ;(A )左移16位→AR2 ;(AR4)左移16位→B

MASR *AR2+,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA A ;操作数与累加器A 中高位相乘 STH A,*AR2 ;(A )高16位→AR2

MASR *AR2-,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA *AR2+ ;AR2指向的数与累加器A 的高16位相

ST B,*AR2 ;(B )左移16位→AR2

||LD *AR4,B ;(AR4)左移16位→B

MASR *AR2-,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA *AR2+

ST B,*AR2

||LD *AR4,B

MASR *AR2-,*AR3+,B,A

MPYA d_xs

STH B,d_sinx

RET

cosx:

.def d_xc,d_cosx

d_coef_c .usect "coef_c",4

.data

table_c .word 0249h

.word 0444h

.word 0aabh

.word 4000h

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

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

;与累加器A 中高16位相乘 ;(B )左移16位→AR2 ;(AR4)左移16位→B ;从累加器A 中减去(AR2)*(AR3) ;d_xs指向的操作数与累加器A 中高16位相乘 ;(B )高16位→d_sinx ;返回 ;定义标号d_xc,d_cosx ;为coef_c保留4个存储空间 ;定义数据代码段 ;c1=1/(7*8) ;c2=1/(6*5) ;c3=1/(3*4) ;c4=1/2 ;为d_xc中cos_vars保存1个存储单;为d_squr_xc中cos_vars保存1个存储单元 ;为d_temp_c中cos_vars保存1个存储单元 ;为d_cosx中cos_vars保存1个存储单元 ;为c_l_c中cos_vars保存1个存储单元 ;定义文本代码段 ;FRCT=1以清除冗余符号位 ;AR5指向d_coef_c首地址 ;重复下条指令4次 ;把table_c中的数复制到中AR5 ;AR3指向d_coef_c首地址 ;AR2 指向d_xc首地址 ;AR4指向c_l_c首地址 ;7FFFh →c_l_c

SQUR *AR2+,A ;求X 的平方存放在累加器A 中 ST A,*AR2 ;(A )左移16位→AR2

||LD *AR4,B ;(AR4)左移16位→B

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=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56)))

MAR *AR2+ ;

RETD ;

ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56)))

STH B,*AR2 ;cos(theta)

RET ;

.end ;

2. *.cmd文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序段、堆栈及复位向量和中断向量等安排在什么地方。其中MEMORY 段就是用来规定目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;SECTIONS 段说明如何将输入段组合成输出段以及在可执行文件中定义输出段、规定输出段在存储器中的位置等。正弦波程序链接命令文件sin.cmd :

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

;文本代码段其实地址为0E000h ,长度为1000h

.data :>EPROM PAGE 0 ;数据代码段其实地址为0D000h

STACK :>SPRAM PAGE 1 ;堆栈起始地址为0060h ,长度为0020h sin_vars :>DARAM1 PAGE 1 ;标号为sin_vars段的起始地址为0080

;长度为0010h

coef_s :>DARAM1 PAGE 1 ;标号为coef_s段的起始地址为0070h ;长度为0010h

cos_vars :>DARAM2 PAGE 1 ;标号为cos_vars段的起始地址为0090h ;长度为0010h

coef_c :>DARAM2 PAGE 1 ;标号为coef_c段的起始地址为0080h ;长度为0020h

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

.vectors :>VECS PAGE 0

}

3. 复位向量文件sin_v.asm:

.title "sin_v.asm"

.ref _c_int00

.sect ".vectors"

B _c_int00

.end

第四章 设计仿真结果及分析

在ccs 集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波形的线性失真。同时我们也能从中看出ccs 能够精确地对各个角度进行计算得出相应的正弦值,幅度和频率易于调节,波形也较为稳定,抗干扰能力较强。 最重要的是这种设计方案简单可行,新颖实用,具有很高的实践和推广价值。

XXXX

DSP 课程设计

摘要:

在上学期数字信号处理(DSP)学习的基础上,本次课程设计的目的是,学会使用CCS(Code Composer Studio) 或matlab7.0集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个余弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。

目录

第一章 概述„„„„„„„„„„„„„„„„„„„„„„„04 1.1设计目的„„„„„„„„„„„„„„„„„„„„„04 1.2设计内容„„„„„„„„„„„„„„„„„„„„„04 1.3设计原理„„„„„„„„„„„„„„„„„„„„„04 第二章 总体方案设计„„„„„„„„„„„„„„„„„„„08

2.1 总体实现方案„„„„„„„„„„„„„„„„„„„08 2.2 具体实现步骤„„„„„„„„„„„„„„„„„„„10 第三章 源程序„„„„„„„„„„„„„„„„„„„„„„11 第四章 设计仿真结果及分析„„„„„„„„„„„„„„„„15 第五章 Matlab下产生该正弦信号„„„„„„„„„„„„„16 5.1 程序„„„„„„„„„„„„„„„„„„„„„„„16 5.2实验图形„„„„„„„„„„„„„„„„„„„„„16 第六章 设计总结„„„„„„„„„„„„„„„„„„„„„17

第一章 概述

1.1设计目的

学会使用CCS(Code Composer Studio)集成开发环境软件,在此集成开发环境下完成工程项目创建,程序编写,编译,链接,调试以及数据的分析。同时完成一个正弦波信号发生器的程序的编写,并在集成开发环境下进行模拟运行,观察结果。

1.2设计内容

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

1.3设计原理

正弦波信号发生器已被广泛地应用于通信、仪器仪表和工业控制等领域的信号处理系统中。通常有两种方法可以产生正弦波,分别为查表法和泰勒级数展开法。查表法是通过查表的方式来实现正弦波,主要用于对精度要求不很高的场合。泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。本次课程设计只要使用泰勒级数展开法来实现正弦波信号。 1. 产生正弦波的算法

在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为

x 3x 5x 7x 9

sin(x ) =x -+-+-

3! 5! 7! 9!

x 2x 4x 6x 8

x () =1-+-+- c o s

2! 4! 6! 8!

若要计算一个角度x 的正弦和余弦值,可取泰勒级数的前5项进行近似计算。

222⎛⎛⎫⎫⎫⎛⎫x 3x 5x 7x 9x 2⎛x x x 1- 1-⎪⎪⎪ ⎪sin(x ) =x -+-+=x 1-1- ⎪⎪⎪ 2⨯3 4⨯5 3! 5! 7! 9! ⎝6⨯7⎝8⨯9⎭⎭⎭⎪⎝⎝⎭222

⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x 1-⎪⎪ ⎪cos(x ) =1-+-+=1-1-1- ⎪ ⎪⎪2! 4! 6! 8! 2 ⎝3⨯4⎝5⨯6⎝7⨯8⎭⎭⎭

由上述两个式子可以推导出递推公式,即

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单元中。

实现计算一个角度的正弦值的程序片段如下: sinx:

.def d_xs,d_sinx .data

table_s .word 01C7H ;C1=1/(8*9) .word 030BH ;C2=1/(6*7) d_coef_s d_xs d_squr_xs d_temp_s d_sinx d_l_s .word 0666H ;C3=1/(4*5) .word 1556H ;C4=1/(2*3) .usect "coef_s",4 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .usect "sin_vars",1 .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

⑵计算一个角度的余弦值

利用余弦函数展开的泰勒级数的前五项计算一个角度的余弦值,可采用子程序的调用方式来实现。调用前先将x 弧度值放在数据存储器d_xc单元中,计算结果存放在d_cosx单元中。

实现计算一个角度的余弦值的程序片段如下: 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 ⑶正弦波的实现

利用计算一个角度的正弦值和余弦值程序可实现正弦波。其实现步骤如下: 第一步:利用sin_start和cos_start子程序,计算0 ~45 (间隔为0. 5 )的正弦和余弦值;

第二步:利用sin(2x)=2sin(x)cos(x)公式,计算0 ~90 的正弦值(间隔为1 ); 第三步:通过复制,获得0 ~359 的正弦值;

第四步:将0 ~359 的正弦值重复从PA 口输出,便可得到正弦波。 产生正弦波的程序片段如下:

.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

产生正弦波链接命令文件的程序片段如下: 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 }

在实际应用中,正弦波是通过D/A口输出的。选择每个正弦周期中的样点数、改变每个样点之间的延迟,就能够产生不同频率的波形,也可以利用软件改变波形的幅度以及起始相位。

第二章 总体方案设计

2.1. 总体实现方案

我们知道一个角度为x 的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以看为:

2⎛222⎛⎫⎛⎛⎫⎫⎫x 3x 5x 7x 9x x x x ⎪ 1-⎪⎪ ⎪sin(x ) =x -+-+- ≈x 1-1-1- ⎪ ⎪ 2⨯3 4⨯5⎝6⨯7⎝8⨯9⎭⎪3! 5! 7! 9! ⎭⎭⎪⎝⎝⎭222

⎛⎛⎫⎫⎫x 2x 4x 6x 8x 2⎛x x x ⎪⎪ ⎪cos(x ) =1-+-+- ≈1-1-1-1- ⎪ ⎪2! 4! 6! 8! 2⎝3⨯4⎝5⨯6⎝7⨯8⎭⎪⎭⎭

本程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点

与x 轴的每一个角度值相对应,那么我们可以利用DSP 处理器处理大量重复计算的优势来计算,x 轴每一点对应的y 轴的值(在x 轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍。可由于正弦波的特殊的对称形式给程序的编制找到了出口。

sin(π) 的弧度为0.7854

序得到N 又可以利用公式:sin 2α=2sin αcos α得到0~π之间的正弦值。而

0~π

之间的正弦曲线与π~π之间的正弦曲线通过x =π这条轴左右对称,

那么就可以得到π~π的正弦值,而0~π的正弦曲线的相反数通过x =π这条轴与π~2π左右对称。这样π~2π的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:

2.2. 具体实现步骤

本课程设计需要使用C54X 汇编语言产生正弦波,并通过 CCS 的图形显示工具观察波形。设计分以下几步完成: 启动 CCS ,操作如下:

1.建立新的工程文件:点击Project →New ,保存文件名为sinx.pjt 。

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

3.建立连接命令文件:点击Fil e →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 文件装入。然后选择 Debu g →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” 。 即将Graph Property Dialog对话框改为见下图:

这样,将在图形显示窗口中显示从sin_x(首地址)开始的360个点的 16 位有符号整数的图形。

第三章 源程序

主要参数

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 :

.title "sin.asm" ;为汇编文件取名为“sin.asm ” .mmregs ;定义存储器映像寄存器

.def _c_int00

.ref sinx,d_xs,d_sinx,cosx,d_xc,d_cosx;定义标号 sin_x: .usect "sin_x",360 ;为"sin_x"保留360个存储空间 STACK: .usect "STACK",10 ;为堆栈保留10个存储空间

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

PA0 .set 0

_c_int00

.text ;定义文本程序代码段

STM #STACK+10,SP ;设置堆栈指针

STM k_theta,AR0 ;AR0-->K_theta(increment) STM 0,AR1 ;(AR1)=X(rad)

STM #sin_x,AR6 ;AR6- - >sin(x)

STM #90,BRC ;form sin0(deg.)—sin90(deg)

;重复执行块语句(下条语句开始至

loop1-1 )91次

RPTB loop1-1

LDM AR1,A

LD #d_xs,DP ;DPd_xs

STL A,@d_xs ;(A)低16位→d_xs

STL A,@d_xc ;(A)低16位→d_xc

CALL sinx ;调用sinx 程序

CALL cosx ;调用conx 程序

LD #d_sinx,DP ;DP d_sinx

LD @d_sinx,16,A ;A=sin(x)

MPYA @d_cosx ;B= sin(x)*cos(x)

STH B,1,*AR6+ ;AR6- - >2*sin(x)*cos(x)

MAR *AR1+0 ;修改辅助寄存器AR1

loop1: STM #sin_x+89,AR7 ;sin91(deg.)- -sin179(deg.) STM #88,BRC ;重复执行下条指令至loop2-1 RPTB loop2-1 ;处90次

LD *AR7-,A ;((AR7)) →A, 然后AR7减去1 STL A,*AR6+ ;(A) 低16位→AR6

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

;(BRC)=179,重复执行180次

STM #sin_x,AR7 ;AR7指向sin_x首地址

RPTB loop3-1 ;

LD *AR7+,A ;((AR7)) →A ,然后AR7加1

NEG A ;累加器变负

STL A,*AR6+ ;A 低16位→AR6

loop3: STM #sin_x,AR6

STM #1,AR0

STM #360,BK

loop4: PORTW *AR6+0%,PA0

B loop4

sinx:

.def d_xs,d_sinx

.data

table_s .word 01c7h

.word 030bh

.word 0666h

.word 1556h

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

c_l_s .usect "sin_vars",1

.text

SSBX FRCT

STM #d_coef_s,AR5

RPT #3

MVPD #table_s,*AR5+

STM #d_coef_s,AR3

STM #d_xs,AR2

STM #c_l_s,AR4

ST #7FFFh,c_l_s

SQUR *AR2+,A

ST A,*AR2

||LD *AR4,B

;generate sin wave AR6指向sin_x ;AR ← 01 ;BK ←360 ;PA0=*AR6+0%,向PA0输出数据 ; ;定义标号d_xs,d_sinx ;定义数据代码段 ;c1=1/(8*9) ;c1=1/(6*7) ;c1=1/(4*5) ;c1=1/(2*3) ;为"coef_s"保留4个存储空间 ;为d_xs中sin_vars保留1个存储空间 ;为d_squr_xs中sin_vars保留1个存储空间 ;为d_temp_s中sin_vars保留1个存储空间 ;为d_sinx中sin_vars保留1个存储空间 ;为d_xs中sin_vars保留1个存储空间 ;定义代码开始段 ;设置FRCT=1以解决冗余符号位 ;AR5指向d_coef_s首地址 ;重复下条指令4次 ;table_s中的数复制到AR5指向的单元 ;AR3指向d_coef_s首地址 ;AR2指向d_xs首地址 ;AR4指向c_l_s首地址 ;7FFFh →c_l_s ;AR2指向累加器A 中的数值求其平方 ;(A )左移16位→AR2 ;(AR4)左移16位→B

MASR *AR2+,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA A ;操作数与累加器A 中高位相乘 STH A,*AR2 ;(A )高16位→AR2

MASR *AR2-,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA *AR2+ ;AR2指向的数与累加器A 的高16位相

ST B,*AR2 ;(B )左移16位→AR2

||LD *AR4,B ;(AR4)左移16位→B

MASR *AR2-,*AR3+,B,A ;从累加器A 中减去(AR2)*(AR3) MPYA *AR2+

ST B,*AR2

||LD *AR4,B

MASR *AR2-,*AR3+,B,A

MPYA d_xs

STH B,d_sinx

RET

cosx:

.def d_xc,d_cosx

d_coef_c .usect "coef_c",4

.data

table_c .word 0249h

.word 0444h

.word 0aabh

.word 4000h

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

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

;与累加器A 中高16位相乘 ;(B )左移16位→AR2 ;(AR4)左移16位→B ;从累加器A 中减去(AR2)*(AR3) ;d_xs指向的操作数与累加器A 中高16位相乘 ;(B )高16位→d_sinx ;返回 ;定义标号d_xc,d_cosx ;为coef_c保留4个存储空间 ;定义数据代码段 ;c1=1/(7*8) ;c2=1/(6*5) ;c3=1/(3*4) ;c4=1/2 ;为d_xc中cos_vars保存1个存储单;为d_squr_xc中cos_vars保存1个存储单元 ;为d_temp_c中cos_vars保存1个存储单元 ;为d_cosx中cos_vars保存1个存储单元 ;为c_l_c中cos_vars保存1个存储单元 ;定义文本代码段 ;FRCT=1以清除冗余符号位 ;AR5指向d_coef_c首地址 ;重复下条指令4次 ;把table_c中的数复制到中AR5 ;AR3指向d_coef_c首地址 ;AR2 指向d_xc首地址 ;AR4指向c_l_c首地址 ;7FFFh →c_l_c

SQUR *AR2+,A ;求X 的平方存放在累加器A 中 ST A,*AR2 ;(A )左移16位→AR2

||LD *AR4,B ;(AR4)左移16位→B

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=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56)))

MAR *AR2+ ;

RETD ;

ADD *AR4,16,B ;B=1-x^2/2(1-x^2/12(1-x^2/30 ;(1-x^2/56)))

STH B,*AR2 ;cos(theta)

RET ;

.end ;

2. *.cmd文件描述输入文件和输出文件,说明系统中有哪些可用存储器、程序段、堆栈及复位向量和中断向量等安排在什么地方。其中MEMORY 段就是用来规定目标存储器的模型,通过这条指令,可以定义系统中所包含的各种形式的存储器,以及它们占据的地址范围;SECTIONS 段说明如何将输入段组合成输出段以及在可执行文件中定义输出段、规定输出段在存储器中的位置等。正弦波程序链接命令文件sin.cmd :

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

;文本代码段其实地址为0E000h ,长度为1000h

.data :>EPROM PAGE 0 ;数据代码段其实地址为0D000h

STACK :>SPRAM PAGE 1 ;堆栈起始地址为0060h ,长度为0020h sin_vars :>DARAM1 PAGE 1 ;标号为sin_vars段的起始地址为0080

;长度为0010h

coef_s :>DARAM1 PAGE 1 ;标号为coef_s段的起始地址为0070h ;长度为0010h

cos_vars :>DARAM2 PAGE 1 ;标号为cos_vars段的起始地址为0090h ;长度为0010h

coef_c :>DARAM2 PAGE 1 ;标号为coef_c段的起始地址为0080h ;长度为0020h

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

.vectors :>VECS PAGE 0

}

3. 复位向量文件sin_v.asm:

.title "sin_v.asm"

.ref _c_int00

.sect ".vectors"

B _c_int00

.end

第四章 设计仿真结果及分析

在ccs 集成环境中实现正弦波能够起到防止干扰的作用,同时也大大地减小了波形的线性失真。同时我们也能从中看出ccs 能够精确地对各个角度进行计算得出相应的正弦值,幅度和频率易于调节,波形也较为稳定,抗干扰能力较强。 最重要的是这种设计方案简单可行,新颖实用,具有很高的实践和推广价值。


相关文章

  • 基于dsp的正弦波信号发生器课程设计
  • 目录 第1章 绪论 ............................................. 1 1 DSP简介 ............................................... 1 第2章 ...查看


  • 正弦波的dsp实现
  • 正弦波的dsp 实现 1. 计算一个角度x 的正弦值,可利用泰勒级数的展开式,采用子程序的调用方式来实现. 在调用前先在数据存储器d_xs单元中存放x 的弧度值,计算结果存放在d_sinx单元中. 程序中要用到一些存储单元存放数据和变量,存 ...查看


  • 基于DSP的设计正弦波信号发生器
  • 一.设计目的 设计一个基于DSP的正弦信号发生器 二.设计内容 利用基于CCS开发环境中的C54X汇编语言来实现正弦信号发生装置. 三.设计原理 一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法.查表法是使用比较普遍的方法,优点是处 ...查看


  • sincos编码器数据采集卡
  • sincos 编码器数据采集卡 sincos 编码器数据采集卡为电机编码器的脉冲发生器,是将sincos 输出形式的编码器的信号进行转换.隔离,输出可以适应控制器的信号的设备,主要有:电平转换.模数转换.整形及分频等.常用于测量旋转角速度或 ...查看


  • DSP课程设计--信号发生器(方波)
  • 成 绩 评 定 表 课程设计任务书 目录 1 绪论............................................................................................... ...查看


  • 旋转变压器 [兼容模式]
  • 6. 旋转变压器 旋转变压器 普通高等教育"十一五"国家级规划教材 6. 旋转变压器 旋转变压器(Rotational transformer或Resolver ) ,是一种将转子转角变换成与之呈某一函数关系电信号某函数 ...查看


  • DSP在捷联惯性导航技术中的应用
  • @9M在捷联惯性导航技术中的应用 王 勇 (国防科技大学电子科学工程与技术学院,长沙('""B#) 由于没有稳定平台,需要进行大量的数学运算来实现摘要对于捷联惯性导航系统, 数学平台,所以导航对计算装置的性能要求就很高. ...查看


  • matlab实现线性卷积和循环卷积
  • 编号: 数字信号处理 实训 (论文) 说明书 题 目: 用matlab 实现两信号的卷积 院 (系): 应用科技学院 专 业: 电子信息工程 学生姓名: 蒋耀华 学 号: 0801130215 指导教师: 严素清 童有为 纪元法 2011 ...查看


  • 基于D S P/B I O S的门禁系统设计与实现 - 中国一卡通网
  • 基于D S P/B I O S的门禁系统设计与实现 来源:中国一卡通网  作者:曹磊,范彩霞  发布时间:2010-08-09 17:48:48  字体:[大中小] 关键字:D S P  B I O S  门禁系统  生物特征 摘   要: ...查看


热门内容