基于DSP的定时器实现数字振荡器(汇编语言)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于DSP 的定时器实现数字振荡器
一、实验目的
1.更进一步掌握定时器和中断的使用;
2.学会用数字振荡器方法产生正弦/余弦信号;
二、实验原理
利用定时器及中断产生频率为f 正弦信号,定时器被设置成每1/fs 产生中断一次(等效于采样速率),在中断服务程序中用迭代算法计算出一个正弦值。用此方法可以很精确地产生某频率的正弦波。
设一个传递函数为正弦序列sin T ω,其Z 变换为2111)(-----=Bz
Az Cz z H ,其中A=2cos T ω,B=-1,C=sin T ω。设初始条件为0,求出其反Z 变换得:
[][1][2][1]y k Ay k By k Cx k =-+-+-
是一个二阶差分方程,其单位冲击响应即为sink ωT ,利用单位冲击函数x[k-1]的性质,即仅当k=1时,x[k-1]=1,推导得:
[][1][2]y n Ay n By n =-+-
在k>2以后,y[k]能用y[k-1]和y[k-2]算出,这是一个递归的差分方程。式中2cos 2cos(2**/)s A T n f f ω==,
1B =-
sin sin(2**/)s C T n f f ω==
fs 为采样频率,f 为正弦波频率。A 为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就是用程序实现上述的递归差分方程。
如要产生振荡器的频率为2kHz 正弦波,设采样速率为40k ,通过定时器设置,每隔25us 中断一次,即产生一个y[n]。则递归差分方程系数为:
2cos 2cos(2**/)s A T f f ωπ==2cos(2**2000/40000)2*0.95105652π==
B=-1
sin sin(2**/)sin(2**2000/40000)0.30901699s C T f f ωππ====
为了便于定点DSP 处理,将所有系数除以2,然后用16位定点格式表示为:A=6D4BH ,B=C000H ,C=214FH ,这便是产生2kHz 正弦信号的三个系数。
主程序初始化时先计算出y[1]和y[2],然后开放定时器中断,以后每次进入定时器中断服务程序时,利用前面计算出的y[1]和y[2]计算出新的y 。
初始化y[1]和y[2]
SSBX FRCT ;置FRCT=1,准备进行小数乘法运算
ST #0x79BC,AA ;将常数装入变量AA
ST #0xC000H ,BB ;将常数装入变量BB
ST #0x13C7H ,CC ;将常数装入变量CC
PSHD CC ;将CC 压入堆栈
POPD Y2 ; 初始化Y2=CC
LD AA,T ; 将AA 装到 T 寄存器
MPY Y2,A ;Y2乘以系数A ,结果放入A 寄存器
STH A,Y1 ;将A 寄存器的高16位存入变量Y1
;中断服务程序段:
LD BB,T ;将系数B 装入T 寄存器
MPY Y2,A ;Y2乘系数B ,结果放入A 寄存器
LTD Y1 ;将Y1装入T 寄存器,同时复制到Y2
MAC AA,A ;完成新正弦数据计算,A 寄存器
;中为Y1*AA+Y2*BB
STH A,1,Y1 ;将新数据存入Y1,因所有系数都
;除过2,在保存结果时转移一位,
;恢复数据正常大小
STH A,1,Y0 ;将新正弦数据存入Y0
VC5402的片内定时器利用CLKOUT 时钟计数,用三个寄存器(TIM 、PRD 、TCR )来控制定时器。到定时器实际上可以有20个比特的周期寄存器。它对CLKOUT 信号计数,先将PSC 减1,直到PSC 为0,然后用TDDR 重新装入PSC ,同时将TIM 减1,直到TIM 减为0。这时CPU 发出TINT 中断,同时在TOUT 引脚输出一个脉冲信号,脉冲宽度为CLKOUT 一致。然后用PRD 重新装入TIM ,重复下去直到系统或定时器复位。因而定时器中断的频率由下面的公式决定:
TINT 的频率=()()
111+⨯+⨯PRD TDDR t c ,其中t c 表示CLKOUT 的周期。设置PRD 寄存器值为
12499,TINT 中断频率为40kHz 。
定时器初始化程序段为:
STM #10H ,TCR ;停止定时器
STM #2499H ,PRD ;设置PRD 寄存器值为2499,
;TINT 中断频率为Foutclk =(2499+1)= 100MHz/2500 = 40 kHz
STM #20H ,TCR ;重新装入TIM 和PSC ,然后;
;启动定时器,在开放中断屏蔽寄存器IMR 后,就可以产生频率为2000Hz 的正弦波。
三、实验内容与步骤
1.使用C54x 汇编语言实现数字振荡器,并通过CCS 提供的显示窗口观察输出信号波形以及频谱。
2.根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,
3. 启动 CCS ,新建工程文件,如文件名为sinewave.pjt 。并建立如下文件:
汇编源程序exer3.asm
.title "for test INT service program ...(25 us) "
.mmregs
.global _c_int00,_tint,vector
OFF_INTIMER .set 04Ch ; vector of INTtimer at
VECTOR+OFF_INTIMER
INIT_A .set 079bch ; A/2=0.9510498
INIT_B .set 0c000h ; B/2=-0.5
INIT_C .set 013c7h ; C/2=0.1545105
.bss y0,1
.bss y1,1
.bss y2,1
.bss temp,1
.bss AA,1
.bss BB,1
.bss CC,1