实验三用定时器实现数字振荡器DSP.docx
《实验三用定时器实现数字振荡器DSP.docx》由会员分享,可在线阅读,更多相关《实验三用定时器实现数字振荡器DSP.docx(10页珍藏版)》请在冰豆网上搜索。
实验三用定时器实现数字振荡器DSP
实验三用定时器实现数字振荡器
1、实验目的和要求
在数字信号处理中,正弦/余弦信号是最常见的信号之一。
为了产生这些信号,通常的方法是讲某个频率的正弦/余弦值余弦计算出来后制成一个表,DSP工作时仅作查表运算即可。
在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。
基本思路是:
利用定时器产生了一个2kHz的正弦信号,定时器被设置成每25uS产生一次中断,(等效于采样速率未40k)利用该中断,在该中断服务程序中用叠代算法计算出一个SNT值,并利用CCS的图形显示功能查看波形。
本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。
另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。
2、实验原理
(1)数字振荡器原理
设冲击响应激励下,一个系统的传递函数为正弦序列sinkwT,其z变换为
其中,A=2coswT,B=-1,C=sinwT。
设初始条件为0,求出上式的反Z变换得:
y[k]=Ay[k-1]+By[k-2]+Cx[k-1]
这是个二阶差分方程,其单位冲击响应即为sinkwT。
利用单位冲击函数x[k-1]的性质,即仅当k=1时,x[k-1]=1,代入上式得:
k=0y[0]=Ay[-1]+By[-2]+0=0
k=1y[1]=Ay[0]+By[-2]+c=c
k=2y[2]=Ay[1]+By[0]+0=Ay[1]
k=3y[3]=Ay[2]+By[1]
k=ny[n]=Ay[n-1]+By[n-2]
在k﹥2以后,y[k]能用y[k-1]和y[k-2]算出,这是一个递归得方法。
根据上面得说明,我们可以开始数字振荡器得设计。
设该振荡器得频率为2kHz,采样率为40kHz(通过定时器设置,每隔25us中断一次,即产生一个y[n])则递归得差分方程系数为:
A=2coswT=2cos(2×PI×2000/40000)=2×0.95105652
B=-1
C=sinwT=sin(2×PI×2000/40000)=0.30901699
为了便于定点DSP处理,我们将所有系数除以2,然后用16为定点格式表示为:
这便是本实验中查生2kHz阵线信号的三个系数。
在本实验中,主程序在初始化时先计算出y[1]和y[2],然后开放定时器中断。
以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的所有y[n],通过CCS提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。
下面时初始化和中断服务程序代码片断:
初始化y[1]和y[2]:
SSBXFRCT:
置FRCT=1,准备进行小数乘法运算
ST#INIT_A,AA:
将常数A装入变量AA
ST#INIT_B,BB:
将常数B装入变量BB
ST#INIT_C,CC:
将常数C装入变量CC
PSHDCC:
将变量CC压入堆栈
POPDy2:
初始化y2=CC
LDAA.T:
装AA到T寄存器
MPYy2,A:
y2乘系数A,结果放入A寄存器
STHA,y1:
将A寄存器得高16位存入变量y1
中断服务程序片断
LDBB,T:
将系数B装入T寄存器
MPYy2,A:
y2乘系数B,结果放入A寄存器
LTDy1:
将y1装入T寄存器,同时复制到y2
MACAA,A:
完成新正弦数据的计算,A寄存器中为
y1*AA+y2*BB
STHA,l,y1:
将新数据存入y1,因所有系数都除过2,所以在
保存结果时转移一位,恢复数据正常大小
STHA,l,y0:
将新正弦数据存入y0
(2)C54X的定时器操作
C54X的片内定时器利用CLKOUT时钟计数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表4-1。
在表4-2中列出了定时器控制寄存器的各个比特位的具体定义。
‘VC5402得另一个定时器(定时器1)的控制寄存器分别为:
0×30(TIM1),0×31(PRD1),0×32(TCR1)。
表4-1‘VC5402定时器0的相关寄存器
寄存器地址
名称
用途
0024h
TIM
定时器寄存器,每计数一次自动减一
0025h
PRD
定时器周期寄存器,当TIM减为0后,CPU自
动将PRD的值装入TIM
0026h
TCR
定时器控制寄存器
表4-2定时器控制就存起(TCR)bit概要
比特
名称
功能
15-12
保留
读出时为0
11
soft
该比特位与10位配合使用以决定定时器在使用仿真调试
时的状态.
Soft=0当进入仿真调试时,定时器立即停止工作。
Soft=1当计数器被减为0后,停止工作。
10
free
该比特位与11位配合使用以决定定时器在使用仿真调试
时的状态
free=0根据11比特位决定定时器状态
free=1忽略11比特位,定时器不受影像
9-6
PSC
定时器预置计数器。
当PSC减为0后,CPU自动将TDDR装入,然后TIM开始减1。
5
TRB
定时器复位。
当TRB=1时,CPU将PRD寄存器的值装入TIM寄存器,将TDDR的值装入PSC
4
TSS
定时器停止状态。
当系统复位时,TSS被清除,定时器立刻开始工作。
TSS=0表示启动定时器
TSS=1表示停止定时器
0-3
TDDR
定时器扩展周期。
当PSC减到0,CPU自动将TDDR的值装入PSC,然后TIM减。
所以整个定时器得周期寄存器可以有20个比特(PRD+TDDR).
从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。
它对于CLKOUT信号计数,先将PSC减1,知道PSC为0。
这是CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度与CLKOUT一致。
然后用PDR重新装入TIM,重复下去一直到系统或定时器复位。
因而定时器中断得频率由一下的公式决定:
TINT的频率=
其中tc表示CLKOUT的周期。
定时器当前得值可以通过读取TIM寄存器和TCR寄存器的PSC比特位得到。
下面时本实验中初始化定时器得程序片段:
STM#10h,TCR:
停止定时器
STM#2499,PDR:
设置PDR寄存器值为2499,TINT中断频率为Foutclk/(2499+1)=100MHz/2500=40KHz
STM#20h,TCR:
重新装入TIM和,PSC,然后启动定时器
(3)C54X中断的使用
在C54X中用户可以通过中断屏蔽酒酿起IMR来决定开放或关闭一个中断请求。
图4-1
出了C5402得IMR寄存器的各个比特位的定义。
图4-1C5402的IMR寄存器
其中,HPINT表示HPI接口中断,INT3-INTO为外部引脚产生的中断,TXINT和TRINT为TDM串口发送和接受中断,BXINT0和BRINT0为BSP串口的发送和接收中断,TINT0为定时器0中断。
在中断屏蔽寄存器IMR中,1表示允许CPU响应对应的中断,0表示禁止。
当然要CPU响应中断,ST1寄存器中的INTM还应该为0(允许所有的中断)。
当DSP响应中断时,PC指针指向中断向量表中对应中断的地址,进入中断服务子程序。
中断向量表是C54X存放中断服务程序的一段内存区域,大小为80H。
在中断向量表中,每一个中断占用4个字的空间,一般情况是将一条跳转或延时延时跳转指令存放于此。
当然,如果中断服务程序很短(小于或等于4个字),可以直接放入该向量表。
中断向量表的位置可以通过修改基地址来改变,其基地址由PMST寄存器中的IPTR(15-7bit)决定。
表4-3给出了中断向量表的各中断的偏移说明。
例如C54x复位后其IPTR全为1,所以中断向量表位置在OFF80H,因而复位后程序从OFF80H开始运行。
本实验的初始化程序读取中断向量表的起始地址,然后设置PMST的高9位,以便DSP能正确响应中断,代码如下:
LD#0,dp;设置DP页指针
SSBXintm;关闭所有中断
LD#vector;读出中断向量(地址vector在中断向量表程序中定义)
AND#OFF80h,A;保留PMST的低7位
ORPMST,A;
STLMA,PMST;设置PMST(其中包括IPTR)
表4-354X的中断向量表
3、实验内容
本实验需要使用C54X汇编语言或C语言实现数字振荡器,并通过CCS提供的图形显示窗口观察输出信号波形以及频谱。
实验分下面几步完成:
(1)根据确定数字振荡器的频率,确定系数。
数字振荡器系数的确定在前面已经说明,这里不再赘述。
(2)启动CCS,新建工程文件,如文件名为sinewave.mak。
选择Project菜单中的addFiletoProject选项,将汇编源程序exer3.sdm、vec_tAble.asm和连接定位sinewave.cmd文件依次添加到工程文件中。
注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。
你页可以使用鼠标右键单击工程文件名(如sinewave.mak)并选择addFiles爱添加需要的文件。
其中,exer3.asm包括初始化代码和中断服务程序,而vec_talbe.asm包含中断向量表。
(3)选择Project菜单中的Option选项,或使用鼠标右键单击工程文件名(如sinewave.mak)并选择Option项来修改或添加编译、连接中使用的参数。
例如,选择assemble窗口,选择“EnableSymbolicDebugInformation”以便使用汇编代码级调试(你可以在汇编源程序设置断点等等)。
选择Linker窗口,在“OutputFilename”栏中写入输出OUT文件的名字,如sina.out,你还可以设置生成的MaP文件名。
(4)写成编译、连接,正确生成OUT文件。
然后使用File菜单中的“LoadProgram”选项,将生成的OUT文件(如sina.out)装入DSP的片内存储器。
这是CCS将显示程序的起始地址_c_int00.
(5)选View
Graph
Time/Frequency…打开图形显示设置窗口。
在弹出的对话框中按下图设置,主要修改“STaraddress”为y0(y0为生成的正弦波输出变量);“acquisitionBufferSize”为1,“DSPDataType”为“16-bitsignedinteger”。
(6)在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。
该行被加亮为洋红色。
选择Debug
animate,运行程序,观察输出波形。
(7)用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。
将“DisplayType”项改为“FFTMagnitude”以便显示信号频谱。
修改“SamplingRate(Hz)”项为40000,然后退出。
注意观察生成的正弦波频率。
(8)清除所有断点,关闭除波形显示窗口外的所有窗口,并关闭工程文件。
现面我们使用C语言完成本实验。
新建一个工程文件,如sinewave_c.mak并添加timer.c,vec_table.asm源程序,再添加timer.cmd,再添加C使用的标准库rts.lib。
该文件应该再CCS安装目录中。
例如,若CCS安装在d:
\ti下,则rts.lib应该在d:
\ti\c5400\cgtools\lib下。
修改编译、连接选项,加入符号调试选项,修改生成的OUT文件名,如tiner.out。
(9)完成编译。
连接,正确生成OUT文件。
然后使用File菜单的“LoadProgram”选项,将生成的OUT文件(如timer.out)装入DSP的片内存储器。
这时CCS将显示程序的启始地址_c_int00.
(10)打开C源程序(timer.c)窗口,在中断服务程序(函数tint())的“con_buf=0;”语句处增加一个断点。
同样打开图形显示窗口,并将“STartaddress”改为128,“DisplayDataSize”改为128,“DSPDataType”为“32-bitfloatingpoint”。
(11)选择Debug→animate,运行程序,观察输出波形。
算算频率是否是2kHz?
同样用右键单击图形显示窗口,显示信号频谱,。
注意修改“SamplingRata(Hz)”项为40000,然后退出。
注意观察生成的正弦波频率。
4、实验结果
1、实验程序:
title "sine.asm"
.mmregs
.global _c_int00,_tint,vector
OFF_INTIMER .set 04Ch
COM_A .set 07642h
COM_B .set 0c000h
COM_C .set 0187eh
.bss y0,1
.bss y1,1
.bss y2,1
.bss temp,1
.bss Aa,1
.bss Bb,1
.bss Cc,1
.text
_c_int00:
ld #0,dp
ssbx intm
st #1fffh,sp
ld #vector, a
and #0FF80h, a
andm #007Fh, pmst
or pmst, a
stlm a, pmst
stm #10h,TCR
stm #2499,PRD
stm #20h,TCR
ldm IMR,a
or #08h,a
stlm a,IMR
ld #temp,dp
ssbx FRCT
st #COM_A,Aa
st #COM_B,Bb
st #COM_C,Cc
pshd Cc
popd y2
ld Aa,T
mpy y2,a
sth a,y1
stm #0h,TCR
nop
rsbx intm
again:
nop
b again
_tint:
ld #Bb,DP
ld Bb,T
mpy y2,a
ltd y1
mac Aa,a
sth a,1,y1
sth a,1,y0
nop
int1_end:
nop
rete
.end
2.输出波形
f=3500Hz
5、实验心得
本次通过对用定时器实现数字振荡器产生正弦波的实验的操作,掌握了如何用用定时器实现数字振荡器产生正弦波的方法,以及如何设计中断服务的方法,同时对C54x定时器有了更深刻的了解,为接下来的实验打下了良好的基础。
同时也增长了自己的知识面。