一.设计目的
设计一个基于DSP的正弦信号发生器
二.设计内容
利用基于CCS开发环境中的C54X汇编语言来实现正弦信号发生装置。
三.设计原理
一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法。查表法是使用比较普遍的方法,优点是处理速度快,调频调相容易,精度高,但需要的存储器容量很大。泰勒级数展开法需要的存储单元少,具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。本文采用了泰勒级数展开法。一个角度为θ的正弦和余弦函数,可以展开成泰勒级数,取其前5项进行近似得:
式中:x为θ的弧度值,x=2πf/fs(fs是采样频率;f是所要发生的信号频率。
正弦波的波形可以看作由无数点组成,这些点与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
.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 286
PA0 .set 0
start:
.text
STM #STACK+10,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
CALL cosx
LD #d_sinx,DP
LD @d_sinx,16,A
MPYA @d_cosx
STH B,1,*AR6+
MAR *AR1+0
loop1: STM #sin_x+89,AR7
STM #88,BRC RPTB loop2-1
LD *AR7-,A
STL A,*AR6+
loop2: STM #179,BRC STM #sin_x,AR7
RPTB loop3-1
LD *AR7+,A
NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6
STM #1,AR0
STM #360,BK
B loop4
sinx:
.def d_xs,d_sinx .data
table_s .word 01C7H
.word 030BH
.word 0666H
.word 1556H
d_coef_s .usect "coef_s",4
d_xs .usect "sin_vars",1 d_squr_xs .usect "sin_vars",1 d_temp_s .usect "sin_vars",1 d_sinx .usect "sin_vars",1 d_1_s .usect "sin_vars",1 .text
SSBX FRCT STM #d_coef_s,AR5 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_1_s,AR4 ST #7FFFH,d_1_s SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+
MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 ||LD *AR4,B MASR *AR2-,*AR3+,B,A MPYA d_xs STH B,d_sinx RET
cosx:
.def d_xc,d_cosx d_coef_c .usect "coef_c", 4 .data
table_c .word 0249H
.word 0444H
.word 0AABH
.word 4000H
d_xc .usect "cos_vars",1 d_squr_xc .usect "cos_vars",1 d_temp_c .usect "cos_vars",1 d_cosx .usect "cos_vars",1 c_1_c .usect "cos_vars",1 .text
SSBX FRCT STM #d_coef_c,AR5 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #c_1_c,AR4 ST #7FFFH,c_1_c
||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 ||LD *AR4,B MASR *AR2-,*AR3+,B,A SFTA A,-1,A
NEG A
MPYA *AR2+
MAR *AR2+
RETD
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
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 :>DARAM1 PAGE 1
coef_s
cos_vars :>DARAM2 PAGE 1
coef_c :>DARAM2
sin_x
.vectors :>VECS
}
:>EPROM PAGE 0 :>EPROM PAGE 0 PAGE 1 PAGE 1 PAGE 1 align(512){} > DARAM3 PAGE 0 PAGE 1 :>SPRAM :>DARAM1 :
六. 实验结果及分析
将程序装载到DSP目标芯片中,波形实现结果可以在CCS图形显示界面直观地表示出来
输出结果显示,在CCS图形观察窗口得到了频率稳定,信号干扰小,波形失真度较小的正弦信号
七. 设计总结心得
一.设计目的
设计一个基于DSP的正弦信号发生器
二.设计内容
利用基于CCS开发环境中的C54X汇编语言来实现正弦信号发生装置。
三.设计原理
一般情况,产生正弦波的方法有两种:查表法和泰勒级数展开法。查表法是使用比较普遍的方法,优点是处理速度快,调频调相容易,精度高,但需要的存储器容量很大。泰勒级数展开法需要的存储单元少,具有稳定性好,算法简单,易于编程等优点,而且展开的级数越多,失真度就越小。本文采用了泰勒级数展开法。一个角度为θ的正弦和余弦函数,可以展开成泰勒级数,取其前5项进行近似得:
式中:x为θ的弧度值,x=2πf/fs(fs是采样频率;f是所要发生的信号频率。
正弦波的波形可以看作由无数点组成,这些点与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
.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 286
PA0 .set 0
start:
.text
STM #STACK+10,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
CALL cosx
LD #d_sinx,DP
LD @d_sinx,16,A
MPYA @d_cosx
STH B,1,*AR6+
MAR *AR1+0
loop1: STM #sin_x+89,AR7
STM #88,BRC RPTB loop2-1
LD *AR7-,A
STL A,*AR6+
loop2: STM #179,BRC STM #sin_x,AR7
RPTB loop3-1
LD *AR7+,A
NEG A
STL A,*AR6+
loop3: STM #sin_x,AR6
STM #1,AR0
STM #360,BK
B loop4
sinx:
.def d_xs,d_sinx .data
table_s .word 01C7H
.word 030BH
.word 0666H
.word 1556H
d_coef_s .usect "coef_s",4
d_xs .usect "sin_vars",1 d_squr_xs .usect "sin_vars",1 d_temp_s .usect "sin_vars",1 d_sinx .usect "sin_vars",1 d_1_s .usect "sin_vars",1 .text
SSBX FRCT STM #d_coef_s,AR5 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_1_s,AR4 ST #7FFFH,d_1_s SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+
MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 ||LD *AR4,B MASR *AR2-,*AR3+,B,A MPYA d_xs STH B,d_sinx RET
cosx:
.def d_xc,d_cosx d_coef_c .usect "coef_c", 4 .data
table_c .word 0249H
.word 0444H
.word 0AABH
.word 4000H
d_xc .usect "cos_vars",1 d_squr_xc .usect "cos_vars",1 d_temp_c .usect "cos_vars",1 d_cosx .usect "cos_vars",1 c_1_c .usect "cos_vars",1 .text
SSBX FRCT STM #d_coef_c,AR5 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #c_1_c,AR4 ST #7FFFH,c_1_c
||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 ||LD *AR4,B MASR *AR2-,*AR3+,B,A SFTA A,-1,A
NEG A
MPYA *AR2+
MAR *AR2+
RETD
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
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 :>DARAM1 PAGE 1
coef_s
cos_vars :>DARAM2 PAGE 1
coef_c :>DARAM2
sin_x
.vectors :>VECS
}
:>EPROM PAGE 0 :>EPROM PAGE 0 PAGE 1 PAGE 1 PAGE 1 align(512){} > DARAM3 PAGE 0 PAGE 1 :>SPRAM :>DARAM1 :
六. 实验结果及分析
将程序装载到DSP目标芯片中,波形实现结果可以在CCS图形显示界面直观地表示出来
输出结果显示,在CCS图形观察窗口得到了频率稳定,信号干扰小,波形失真度较小的正弦信号
七. 设计总结心得