一.设计目的
设计一个基于 DSP 的正弦信号发生器
二.设计内容
利用基于 CCS 开发环境中的 C54X 汇编语言来实现正弦信号发生装置。
三.设计原理
一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法。查表
法是使用比较普遍的方法,优点是处理速度快,调频调相容易,精度高,但
需要的存储器容量很大。泰勒级数展开法需要的存储单元少,具有稳定性好,
算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。本文采
用了泰勒级数展开法。一个角度为θ的正弦和余弦函数,可以展开成泰勒级
数,取其前 5 项进行近似得:
式中:x 为θ的弧度值,x=2πf/fs(fs 是采样频率;f 是所要发生的信
号频率。
正弦波的波形可以看作由无数点组成,这些点与 x 轴的每一个角度值相
对应,可以利用 DSP 处理器处理大量重复计算的优势来计算 x 轴每一点对应
的 y 的值(在 x 轴取 N 个点进行逼近)。整个系统软件由主程序和基于泰勒展
开法的 SIN 子程序组成,相应的软件流程图如图。
四.设计方案
本设计采用 TMS320C54X 系列的 DSP 作为正弦信号发生器的核心控制芯
片。
通过计算一个角度的正弦值和余弦值程序可实现正弦波,其步骤如下:
1.利用 sinx 和 cosx 子程序,计算 0°~45°(间隔为 0.5°)的正弦和
余弦值
2.利用 sin(2x)=2sin(x)cos(x)公式,计算 0°~90°的正弦值(间隔为
1°)
3.通过复制,获得 0°~359°的正弦值
4.将 0°~359°的正弦值重复从 PA 口输出,便可得到正弦波
三.软件操作
利用 CCS 集成开发环境,用户可以在一个开发环境下完成工程定义、
程序 编辑、编译链接、调试和数据分析等工作环节。
1. 创建工程(project)文件
选择 Project→New,在“Project”文本框中键入将要创建的工程
项目名,本例工程项目名为“sin”
2. 向工程中添加文件
选择 Project→Add Files to Project,将 sine.asm 文件自动添
加到 Project→Source 中。 用同样的方法 将 sine.cmd 文件添加到
对应的目录中。
3. 构建工程,工程所需文件编辑完成后,可以对该工程进行编译链接,
产生可执行文件, 为调试做准备。
选择 Project→Build,系统提示没有出错信息后,系统自动生成
一个可执行文件,sine.out 文件。
4.载入可执行文件
选择 File→Load Program 载入编译链接好的可执行文件 sine.out
5.运行程序
选择 Debug→Run 运行,可以通过查看内存表等方法,看到程序运
行的结果。
6.观察数据和图形
①选择 View→Graph→Time/Frequence:
②调整输出图形参数:
五.源程序
正弦波源程序 sin.asm:
.title "sin.asm"
.mmregs
start
d_xs,d_sinx,d_xc,d_cosx,sinx,cosx
"sin_x",360
"STACK",10
286
0
sin_x:
STACK:
k_theta
PA0
start:
.def
.def
.usect
.usect
.set
.set
.text
STM
STM
STM
STM
STM
RPTB
LDM
LD
STL
STL
CALL
CALL
LD
LD
#STACK+10,SP
k_theta,AR0
0,AR1
#sin_x,AR6
#90,BRC
loop1-1
AR1,A
#d_xs,DP
A,@d_xs
A,@d_xc
sinx
cosx
#d_sinx,DP
@d_sinx,16,A
MPYA
@d_cosx
STH
MAR
STM
STM
RPTB
LD
STL
STM
STM
RPTB
LD
NEG
STL
STM
STM
STM
B,1,*AR6+
*AR1+0
#sin_x+89,AR7
#88,BRC
loop2-1
*AR7-,A
A,*AR6+
#179,BRC
#sin_x,AR7
loop3-1
*AR7+,A
A
A,*AR6+
#sin_x,AR6
#1,AR0
#360,BK
loop1:
loop2:
loop3:
loop4:
PORTW
*AR6+0%,PA0
sinx:
table_s
B
loop4
.def
.data
.word
.word
.word
.word
d_xs,d_sinx
01C7H
030BH
0666H
1556H
d_coef_s
d_xs
.usect
.usect
"coef_s",4
"sin_vars",1
d_squr_xs
.usect
"sin_vars",1
d_temp_s
d_sinx
d_1_s
.usect
.usect
.usect
.text
SSBX
STM
RPT
MVPD
STM
STM
STM
ST
SQUR
ST
||LD
MASR
MPYA
STH
MASR
MPYA
St
"sin_vars",1
"sin_vars",1
"sin_vars",1
FRCT
#d_coef_s,AR5
#3
#table_s,*AR5+
#d_coef_s,AR3
#d_xs,AR2
#d_1_s,AR4
#7FFFH,d_1_s
*AR2+,A
A,*AR2
*AR4,B
*AR2+,*AR3+,B,A
A
A,*AR2
*AR2-,*AR3+,B,A
*AR2+
B,*AR2
||LD
MASR
MPYA
ST
||LD
MASR
MPYA
STH
RET
*AR4,B
*AR2-,*AR3+,B,A
*AR2+
B,*AR2
*AR4,B
*AR2-,*AR3+,B,A
d_xs
B,d_sinx
cosx:
.def
d_xc,d_cosx
d_coef_c
.usect
"coef_c", 4
table_c
.data
.word
.word
.word
.word
0249H
0444H
0AABH
4000H
d_xc
.usect
"cos_vars",1
d_squr_xc
.usect
"cos_vars",1
d_temp_c
d_cosx
c_1_c
.usect
.usect
.usect
.text
SSBX
STM
RPT
MVPD
STM
STM
STM
ST
"cos_vars",1
"cos_vars",1
"cos_vars",1
FRCT
#d_coef_c,AR5
#3
#table_c,*AR5+
#d_coef_c,AR3
#d_xc,AR2
#c_1_c,AR4
#7FFFH,c_1_c
SQUR
*AR2+,A