实验四 用定时器实现数字振荡器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四用定时器实现数字振荡器

1.实验目的

在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。

本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。

2.实验要求

本实验利用定时器产生一个2kHz的正弦信号。定时器被设置成每25uS产生一次中断(等效于采样速率为40K)。利用该中断,在中断服务程序中用叠代算法计算出一个SIN值,并利用CCS的图形显示功能查看波形。

3.实验原理

数字振荡器原理

设一个传递函数为正弦序列sinkωT,其z变换为

H(z)=

EMBED Equation.3

EMBED Equation.3

v儭丌a=2cosÉ, B=-1, C=sinÉ

其中,A=2cosωT, B=-1, C=sinωT。设初始条件为0,求出上式的反Z变换得:

y[k]=Ay[k-1]+By[k-2]+Cx[k-1]

这是一个二阶差分方程,其单位冲击响应即为sinkωT。利用单位冲击函数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=2cosωT=2cos (2 x PI x 2000 / 40000)=2 x 0.95105652 x4 1e6f0

B=-1

C=sinωT=sin (2 x PI x 2000 / 40000)=0.30901699 x4 =9e4b

为了便于定点DSP处理,我们将所有的系数除以2,然后用16位定点格式表示为:

a f378 c 4f25

这便是本实验中产生2KHz正弦信号的三个系数。在本实验中,主程序在初始化时先计算出y[1]和

y[2],然后开放定时器中断。以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的有y[0],通过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,1,y1 ;将新数据存入y1,因所有系数都除过2,所以在保

;存结果时转移一位,恢复数据正常大小。

sth a,1,y0 ;将新正弦数据存入y0

(2)C54X的定时器操作

C54X的片内定时器利用CLKOUT时钟计数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表4-1。在表4-2中列出了定时器控制寄存器的各个比特位的具体定义。‘VC5402的另一个定时器(定时器1)的控制寄存器分别为:0x30(TIM1),0x31(PRD1),0x32(TCR1)。

表4-1 ‘VC5402定时器0的相关寄存器

寄存器地址

名称

用途

0024h

TIM

定时器寄存器,每计数一次自动减1

0025h

PRD

定时器周期寄存器,当TIM减为0后,CPU自动将PRD的值装入TIM

0026h

TCR

定时器控制寄存器

表4-2 定时器控制寄存器(TCR)bit概要

比特名称功能

15-12 Ý余甠û诺凶攺丰

11 Soft å诔歹牍伎丱0M位鄈呿伨痥亳冚定寶敨嘨坿伨痿丟眃賕诶斄皶爁怂」

Soft=0 S忛轥凿丟眃賕诶攌レ寶敨囋穳卜偢毥嵜伂」Soft=1 S御議敨嚫裏儺丰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减1。所以整个定时器的周期寄存器可以有20个比特(PRD+TDDR)。

从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。它对CLKOUT信号计数,先将PSC减1,直到PSC为0,然后用TDDR重新装入PSC,同时将TIM减1,直到TIM减为0。这时CPU 发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度为CLKOUT一致。然后用PRD重新装入TIM,重复下去直到系统或定时器复位。因而定时器中断的频率由下面的公式决定:

TINT的频率=

EMBED Equation.3

EMBED Equation.3

v儭乴ch蠺祃LKOUT

其中tc表示CLKOUT的周期。定时器当前的值可以通过读取TIM寄存器和TCR寄存器的PSC比特位得到。下面是本实验中初始化定时器的程序片段:

stm #10h,TCR ;停止定时器

stm #2499,PRD ;设置PRD寄存器值为2499,TINT中断频率为

;Foutclk /(2499+1)= 100MHz/2500 = 40 KHz

stm #20h,TCR ;重新装入TIM和PSC,然后启动定时器

(3)C54X中断的使用

在C54X中用户可以通过中断屏蔽寄存器IMR来决定开放或关闭一个中断请求。图4-1给出了

C5402的IMR寄存器的各个比特位的定义。

相关文档
最新文档