基于DSP的正弦波信号发生器(汇编语言).doc
正弦波信号发生器
一、实验目的
1.了解用泰勒级数展开法计算角度正弦值和余弦值;
2.了解产生正弦信号的方法;
3.熟悉使用汇编语言编写较复杂的程序;
4.熟悉在CCS环境下计算角度正弦值和余弦值及产生正弦波的方法;
二、实验原理
泰勒级数展开法是根据泰勒展开式进行计算来实现正弦信号,它能精确地计算出一个角度的正弦和余弦值,且只需要较小的存储空间。
正弦函数和余弦函数可以展开成泰勒级数,其表达式:
递推公式:
由递推公式可以看出,在计算正弦和余弦值时,需要已知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
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
****************