DSP课程设计正弦波信号发生器报告

发布时间 : 星期三 文章DSP课程设计正弦波信号发生器报告更新完毕开始阅读

;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 \STACK: .usect \

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

4

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

总体方案设计

1. 总体实现方案

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

5

五项可以看为:

2?xsin(x)?x???????x?1??3!5!7!9!2?3?x3x5x7x92?x?1??4?5?2?x?1??6?7?2?????x?1?????????8?9??????

2?x?1?cos(x)?1???????1?2!4!6!8!2?3?4?x2x4x6x8x22?x?1??5?6?2????x?1???????7?8?????

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

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

sin(?4)的弧度为0.7854<1,即0~?4 之间的任意正弦、余弦值可以利用汇编程

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

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

??那么就可以得到?的正弦值,而0的正弦曲线的相反数通过x这条

轴与?~2?左右对称。这样?~2?的正弦值也得到了。一个周期内完整的正弦波就得到了。正弦波产生的流程图如下:

得到正弦值 得到余弦值 sin2a=2sinacosa

得到0~?2的值 得到?2~?的值 得到?~2?的值 得到0~2?的值 循环输出数据 6

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” 。 即将Graph Property Dialog对话框改为见下图:

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

7

联系合同范文客服:xxxxx#qq.com(#替换为@)