基于DSP的正弦波信号发生器(汇编语言)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

正弦波信号发生器

一、实验目的

1.了解用泰勒级数展开法计算角度正弦值和余弦值;

2.了解产生正弦信号的方法;

3.熟悉使用汇编语言编写较复杂的程序;

4.熟悉在CCS 环境下计算角度正弦值和余弦值及产生正弦波的方法;

二、实验原理

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

正弦函数和余弦函数可以展开成泰勒级数,其表达式:

递推公式: sin()2cos()sin[(1)]sin[(2)]

cos()2cos()sin[(1)]cos[(2)]nx x n x n x nx x n x n x =---=---

由递推公式可以看出,在计算正弦和余弦值时,需要已知cos(x )、sin(n -1)x 、sin(n -2)x 和cos(n -2)x 。用这种方法求少数点还可以,如产生连续正弦波、余弦波,则积累误差太大,不可取。

下面主要用泰勒级数展开法求正弦和余弦值,以及产生正弦波的方法。

三、实验内容与步骤

1.用泰勒级数展开法计算sin(x)的值;

(1)在 CCS 中新建项目:sinx.pjt ,建立文件sinx.asm 、vectors.asm 和sinx.cmd 。 并将此三个文件加入到项目中。

******************************************************

* 用泰勒级数开展开式计算一个角度的正弦值 *

*sin(x)=x(1-x*x/2*3(1-x*x/4*5(1-x*x/6*7(1-x*x/8*9))))*

******************************************************

.title "sinx.asm"

.mmregs .def start

STACK: .usect "STACK",10

start: STM #STACK+10,SP

LD #d_x,DP 3579

2222sin()3!5!7!9! 111123456789(((())))x x x x x x x x x x x =-+-+=----⨯⨯⨯⨯24682222cos()12!4!6!8! 11112345678((()))

x x x x x x x x x =-+-+=----⨯⨯⨯

ST #6487H,d_x ;x-->d_x

CALL sin_start

end: B end

sin_start:

.def sin_start

d_coeff .usect "coeff",4

.data

table: .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_x .usect "sin_vars",1

d_squr_x .usect "sin_vars",1

d_temp .usect "sin_vars",1

d_sinx .usect "sin_vars",1

c_1 .usect "sin_vars",1

.text

SSBX FRCT

STM #d_coeff,AR5

RPT #3

MVPD #table,*AR5+

STM #d_coeff,AR3

STM #d_x,AR2

STM #c_1,AR4

ST #7FFFH,c_1

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_x ;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

.end

******************************************************

*中断向量文件vectors.asm

******************************************************

.title "vectors.asm"

.ref start

.sect ".vectors"

B start

.end

******************************************************

*链接命令文件

******************************************************

vectors.obj

sinx.obj

-O sinx.out

-m sinx.map

-estart

MEMORY

{

PAGE 0:

EPROM: org=0090H,len=0F70H

VECS: org=0080H,len=0010H

PAGE 1:

SPRAM: org=1000H,len=1000H

DARAM: org=2000H,len=2000H

}

SECTIONS

{

.text :>EPROM PAGE 0

.data :>EPROM PAGE 0

STACK :>SPRAM PAGE 1

sin_vars :>DARAM PAGE 1

coeff :>DARAM PAGE 1

.vectors :>VECS PAGE 0

}

(2)编译、链接项目文件sinx.pjt。点击按钮或Debu g→Run运行程序。

(3)在程序sinx.asm 中,给出的x 的值为pi/4=6487 弧度。如果改变x 在程序中的值,便可以计算其他角度的正弦值。

(4)执行结果sin(pi/4)=5A81H,存储在数据存储器d_sinx(2003H)单元中。用查看寄存器的方法可以看到此结果。如图6.1所示。

相关文档
最新文档