用定时器实现数字振荡器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四 用定时器实现数字振荡器
1 实验目的
在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是讲某个频率的正弦/余弦值余弦计算出来后制成一个表,DSP 工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。
本实验除了学习数字振荡器的DSP 实现原理外,同时还学习C54X 定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C 语言分别完成源程序的编写。
2 实验要求
本实验利用定时器产生了一个2kHz 的正弦信号,定时器被设置成每25uS 产生一次中断,(等效于采样速率未40k )利用该中断,在该中断服务程序中用叠代算法计算出一个SNT 值,并利用CCS 的图形显示功能查看波形。
3 实验原理
(1)数字振荡器原理
设一个传递函数为阵线序列sinkwT ,其z 变换为
111
Bz
Az 1Cz )z (H -----=
其中,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=0 y[0]=Ay[-1]+By[-2]+0=0
k=1 y[1]=Ay[0]+By[-2]+c=c
k=2 y[2]=Ay[1]+By[0]+0=Ay[1]
k=3 y[3]=Ay[2]+By[1]
k=n y[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
79BC 22
A 15=⨯ C00022
B 15=⨯ 13C722
C 15=⨯ 为了便于定点DSP 处理,我们将所有系数除以2,然后用16为定点格式表示为: 这便是本实验中查生2kHz 阵线信号的三个系数。在本实验中,主程序在初始化时先计算出y[1]和y[2],然后开放定时器中断。以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的所有y[n],通过CCS 提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。下面时初始化和中断服务程序代码片断:
初始化y[1]和y[2]:
ssbx FRCT :置FRCT =1,准备进行小数乘法运算
st #INIT_A,AA :将常数A 装入变量AA
st #INIT_B,BB :将常数B 装入变量BB
st #INIT_C,CC :将常数C 装入变量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,l,y1 :将新数据存入y1,因所有系数都除过2,所以在
保存结果时转移一位,恢复数据正常大小sth a,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的相关寄存器
表4-2定时器控制就存起(TCR)bit概要
从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。它对于CLKOUT信号计数,先将PSC减1,知道PSC为0。这是CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度与CLKOUT一致。然后用PDR重新装入TIM,重复下去一直到系统或定时器复位。因而定时器中断得频率由一下的公式决定:
TINT 的频率=)
1PRD ()1T DDR (t 1c +⨯+⨯ 其中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-1 C5402的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-7 bit)决定。表4-3给出了中断向量表的各中断的偏移说明。