当前位置:
文档之家› 基于DSP设计正弦信号发生器
基于DSP设计正弦信号发生器
loop3:
loop4: sinx:
table_s
d_coef_s d_xs d_squr_xs d_temp_s d_sinx d_1_s
STL STM STM STM PORTW B
A,*AR6+ #sin_x,AR6 #1,AR0 #360,BK *AR6+0%,PA0 loop4
.def .data .word .word .word .word .usect .usect .usect .usect .usect .usect .text SSBX STM RPT MVPD STM STM STM ST
cosx: d_coef_c table_c
d_xc d_squr_xc
SQUR ST ||LD MASR MPYA STH MASR MPYA St ||LD MASR MPYA ST ||LD MASR MPYA STH RET
.def .usect .data .word .word .word .word .usect .usect
4. 设计方案
本设计采用TMS320C54X系列的DSP作为正弦信号发生器的核心控 制芯片。
通过计算一个角度的正弦值和余弦值程序可实现正弦波,其步骤如 下: 1. 利用sinx和cosx子程序,计算0°~45°(间隔为0.5°)的正弦和
余弦值 2. 利用sin(2x)=2sin(x)cos(x)公式,计算0°~90°的正弦值(间隔
:>EPROM
PAGE 0
:>EPROM
PAGE 0
:>SPRAM
PAGE 1
:>DARAM1 PAGE 1
:>DARAM1 PAGE 1
:>DARAM2 PAGE 1
:>DARAM2 PAGE 1
: align(512){} >
:>VECS PAGE 0结果及分析
将程序装载到DSP目标芯片中,波形实现结果可以在CCS图形显示界面直观地表示出来
*AR2+,A A,*AR2 *AR4,B *AR2+,*AR3+,B,A A A,*AR2 *AR2-,*AR3+,B,A *AR2+ B,*AR2 *AR4,B *AR2-,*AR3+,B,A *AR2+ B,*AR2 *AR4,B *AR2-,*AR3+,B,A d_xs B,d_sinx
d_xc,d_cosx "coef_c", 4
1. 设计目的
设计一个基于DSP的正弦信号发生器
2. 设计内容
利用基于CCS开发环境中的C54X汇编语言来实现正弦信号发生装 置。
三.设计原理
一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法。 查表法是使用比较普遍的方法,优点是处理速度快,调频调相容易,精 度高,但需要的存储器容量很大。泰勒级数展开法需要的存储单元少, 具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失 真度就越小。本文采用了泰勒级数展开法。一个角度为θ的正弦和余弦 函数,可以展开成泰勒级数,取其前5项进行近似得:
为1°) 3. 通过复制,获得0°~359°的正弦值 4. 将0°~359°的正弦值重复从PA口输出,便可得到正弦波
3. 软件操作
利用 CCS 集成开发环境,用户可以在一个开发环境下完成工程 定义、程序 编辑、编译链接、调试和数据分析等工作环节。
1. 创建工程(project)文件 选择 Project→New,在“Project”文本框中键入将要创建
286
PA0
.set 0
start:
loop1: loop2:
.text STM STM STM STM STM RPTB LDM LD STL STL CALL CALL LD LD MPYA STH MAR STM STM RPTB LD STL STM STM RPTB LD NEG
#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 @d_cosx 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
输出结果显示,在CCS图形观察窗口得到了频率稳定,信号干扰小,波 形失真度较小的正弦信号;
7. 设计总结心得
通过这次的课程设计使我进一步加深了对于DSP这门课程的学习 以及对于平时所学内容的实际应用。在设计中发现问题和同学互 相讨论研究增加了团队合作的能力。在输入程序时发现编程确实 是要求很认真细心的,如果稍有差错就会导致整个程序的错误, 也由此体现了DSP这门课程的严谨性。相信在以后的学习中一定 会更好的应用所学内容的。
选择 Project→Build,系统提示没有出错信息后,系统自动 生成一个可执行文件,sine.out 文件。 4.载入可执行文件
选择 File→Load Program 载入编译链接好的可执行文件 sine.out 5.运行程序
选择 Debug→Run运行,可以通过查看内存表等方法,看到 程序运行的结果。 6.观察数据和图形 选择 View→Graph→Time/Frequence
0249H 0444H 0AABH 4000H "cos_vars",1 "cos_vars",1
d_temp_c d_cosx c_1_c
.usect .usect .usect .text SSBX STM RPT MVPD STM STM STM ST SQUR ST ||LD MASR MPYA STH MASR MPYA ST ||LD MASR SFTA NEG MPYA MAR RETD
PAGE 1: SPRAM: org=0060H, len=0020H DARAM1: org=0080H, len=0010H DARAM2: org=0090H, len=0010H DARAM3: org=0200H, len=0200H
}
SECTIONS {
.text .data STACK sin_vars coef_s cos_vars coef_c sin_x 1 .vectors }
ADD
*AR4,16,B
STH
B,*AR2
RET
.end
正弦波程序链接命令文件sin.cmd -x.\Debug\vectors.obj -x.\Debug\sin.obj -o sin.out -m sin.map -e start MEMORY {
PAGE 0: EPROM: org=0E00H,len=1000H VECS: org=0FF80H,len=0080H
的工程项目名,本例工程项目名为“sin” 2. 向工程中添加文件 选择 Project→Add Files to Project,将 sine.asm文件自
动添加到 Project→Source 中。 用同样的方法 将 sine.cmd 文 件添加到对应的目录中。
3. 构建工程,工程所需文件编辑完成后,可以对该工程进行 编译链接,产生可执行文件, 为调试做准备。
"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 *AR2+,A A,*AR2 *AR4,B *AR2+,*AR3+,B,A A A,*AR2 *AR2-,*AR3+,B,A *AR2+ B,*AR2 *AR4,B *AR2-,*AR3+,B,A A,-1,A A *AR2+ *AR2+
d_xs,d_sinx
01C7H 030BH 0666H 1556H "coef_s",4 "sin_vars",1 "sin_vars",1 "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
式中:x为θ的弧度值,x=2πf/fs(fs是采样频率;f是所要发生 的信号频率。
正弦波的波形可以看作由无数点组成,这些点与x轴的每一个角度 值相对应,可以利用DSP处理器处理大量重复计算的优势来计算x轴每一 点对应的y的值(在x轴取N个点进行逼近)。整个系统软件由主程序和基 于泰勒展开法的SIN子程序组成,相应的软件流程图如图。
调整输出图形参数
5. 源程序
正弦波源程序sin.asm .title "sin.asm"
.mmregs
.def start
.def
d_xs,d_sinx,d_xc,d_cosx,sinx,cosx
sin_x:
.usect "sin_x",360
STACK:
.usect "STACK",10
k_theta .set