
DSP课程设计18272.doc
9页一、 设计目的1、掌握用汇编语言编写输出正弦波信号的程序2、掌握正弦波信号的 DSP 实现原理和 C54X 编程技巧3、进一步加深对CCS的认识4、能通过 CCS 的图形显示工具观察正弦信号波形二、 实验设备 PC 兼容机一台,安装Code Composer Studio 3.1软件三、 设计原理在通信、仪器和工业控制等领域的信号处理系统中常常会用到信号发生器来产生正弦波! 产生正弦波的方法一是查表法,二是泰勒级数展开法!查表法主要用于对精度要求不很高的场合,而泰勒级数展开法是一种比查表法更为有效的方法,它能精确地计算出一个角度的正弦和余弦值,且只需要较少的存储空间本实验将利用泰勒级数展开法利用计算一个角度的正弦值和余弦值程序可实现正弦波产生正弦波的算法:在高等数学中,正弦函数和余弦函数可以展开成泰勒级数,其表达式为:若要计算一个角度的正弦和余弦值,可取泰勒级数的前五项进行近似计算 由这两个式子可推导出递推公式,即 由递推公式可以看出,在计算正弦和余弦值时,不仅需要已知,而且还需要、和2)、正弦波的实现利用计算一个角度的正弦值和余弦值程序可实现正弦波其实现步骤如下:第一步:利用sin_start和cos_start子程序,计算(间隔为)的正弦和余弦值;第二步:利用sin(2x)=2sin(x)cos(x)公式,计算的正弦值(间隔为);第三步:通过复制,获得的正弦值;第四步:将的正弦值重复从PA口输出,便可得到正弦波。
产生正弦波的程序片段如下:.mmregs .def start .def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x: .usect "sin_x",360STACK: .usect "STACK",10Hk_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+0loop1: 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}四、 设计内容本实验需要使用C54X汇编语言产生正弦波,并通过 CCS的图形显示工具观察波形。
总体方案设计我们知道一个角度为x的正弦和余弦函数,都可以展开为泰勒级数,且其前五项可以近似看为: 这个程序的编程思想是这样的,正弦波的波形可以看为由无数点组成,这些点与轴的每一个角度值相对应,那么我们可以利用DSP处理器处理大量重复计算的优势来计算,轴每一点对应的y轴的值(在x轴取360个点来进行逼近),由于程序的编制采用小数形式,其弧度大于1的正弦值得不到,这就对正弦波的产生造成了障碍可由于正弦波的特殊的对称形式给程序的编制找到了出口的弧度为0.7854<1,即 之间的任意正弦、余弦值可以利用汇编程序得到N又可以利用公式:得到之间的正弦值而之间的正弦曲线与之间的正弦曲线通过这条轴左右对称,那么就可以得到的正弦值,而的正弦曲线的相反数通过这条轴与左右对称这样的正弦值也得到了一个周期内完整的正弦波就得到了正弦波产生的流程图如下:得到余弦值得到正弦值Sin2a=2sinacosa 得到的值得到的值得到的值得到的值循环输出数据 正弦波产生流程图五、 源程序1、产生正弦波源程序sin.asm如下: .mmregs .def start .def d_xs,d_sinx,d_xc,d_cosx,sinx,cosxsin_x: .usect "sin_x",360STACK: .usect "STACK",10Hk_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+0loop1: 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 loop3sinx: .def d_xs,d_sinx .datatable_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",4d_xs .usect "sin_vars",1d_squr_xs .usect "sin_vars",1d_temp_s .usect "sin_vars",1d_sinx .usect "sin_。
