实验二用定时器实现数字振荡器Word文档格式.docx
《实验二用定时器实现数字振荡器Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验二用定时器实现数字振荡器Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
4学时
四、实验原理:
数字振荡器原理
设一个传递函数为正弦序列sinkωT,其z变换为
H(z)=
EMBEDEquation.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=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=2cosωT=2cos(2xPIx2000/40000)=2x0.95105652x41e6f0
B=-1
C=sinωT=sin(2xPIx2000/40000)=0.30901699x4=9e4b
为了便于定点DSP处理,我们将所有的系数除以2,然后用16位定点格式表示为:
af378c4f25
这便是本实验中产生2KHz正弦信号的三个系数。
在本实验中,主程序在初始化时先计算出y[1]和y[2],然后开放定时器中断。
以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的有y[0],通过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寄存器
y2乘系数B,结果放入A寄存器
ltdy1;
将y1装入T寄存器,同时复制到y2
macAA,a;
完成新正弦数据的计算,a寄存器中为
;
y1*AA+y2*BB
stha,1,y1;
将新数据存入y1,因所有系数都除过2,所以在保
;
存结果时转移一位,恢复数据正常大小。
stha,1,y0;
将新正弦数据存入y0
(2)C54X的定时器操作
C54X的片内定时器利用CLKOUT时钟计数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表4-1。
在表4-2中列出了定时器控制寄存器的各个比特位的具体定义。
‘VC5402的另一个定时器(定时器1)的控制寄存器分别为:
0x30(TIM1),0x31(PRD1),0x32(TCR1)。
从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。
它对CLKOUT信号计数,先将PSC减1,直到PSC为0,然后用TDDR重新装入PSC,同时将TIM减1,直到TIM减为0。
这时CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度为CLKOUT一致。
然后用PRD重新装入TIM,重复下去直到系统或定时器复位。
因而定时器中断的频率由下面的公式决定:
TINT的频率=
EMBEDEquation.3
v儭乴ch蠺祃LKOUT
其中tc表示CLKOUT的周期。
定时器当前的值可以通过读取TIM寄存器和TCR寄存器的PSC比特位得到。
下面是本实验中初始化定时器的程序片段:
stm#10h,TCR;
停止定时器
stm#2499,PRD;
设置PRD寄存器值为2499,TINT中断频率为
;
Foutclk/(2499+1)=100MHz/2500=40KHz
stm#20h,TCR;
重新装入TIM和PSC,然后启动定时器
(3)C54X中断的使用
在C54X中用户可以通过中断屏蔽寄存器IMR来决定开放或关闭一个中断请求。
其中,HPINT表示HPI接口中断,INT3-INT0为外部引脚产生的中断,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-7bits)决定。
表4-3给出了中断向量表的各中断的偏移说明。
例如C54x复位后其IPTR全为1,所以中断向量表起始位置在0FF80H,因而复位后程序从0FF80H开始运行。
本实验的初始化程序读取中断向量表的启始地址,然后设置PMST的高9位,以便DSP能正确响应中断,代码如下:
ld#0,dp;
设置DP页指针
ssbxintm;
关闭所有中断
ld#vector,a;
读出中断向量(地址vector在中断向量表程序中定义)
and#0FF80h,a;
保留高9位(IPTR)
andm#007Fh,pmst;
保留PMST的低7位
orpmst,a;
stlma,pmst;
设置PMST(其中包括IPTR)
五、实验目的:
在数字信号处理中,会经常使用到正弦/余弦信号。
通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP工作时仅作查表运算即可。
在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。
本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。
另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。
六、实验内容:
本实验需要使用C54X汇编语言或C语言实现数字振荡器,并通过CCS提供的图形显示窗口观察输出信号波形以及频谱。
七、实验器材(设备、元器件):
计算机一台
8、实验步骤:
(1).根据确定数字振荡器的频率,确定系数。
数字振荡器系数的确定在前面已经说明,这里不再赘述。
(2).启动CCS,新建工程文件,如文件名为sinewave.mak。
选择Project菜单中的AddFiletoProject选项,将汇编源程序exer3.asm、vec_table.asm和连接定位sinewave.cmd文件依次添加到工程文件中。
注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。
你也可以使用鼠标右键单击工程文件名(如sinewave.mak)并选择AddFiles项来添加需要的文件。
其中,exer3.asm包括初始化代码和中断服务程序,而vec_talbe.asm包含中断向量表。
(3).选择Project菜单中的Options选项,或使用鼠标右键单击工程文件名(如sinewave.mak)并选择Options项来修改或添加编译、连接中使用的参数。
例如,选择Assembler窗口,选择“EnableSymbolicDebugInfomation”以便使用汇编源代码级调试(你可以在汇编源程序设置断点等等)。
选择Linker窗口,在“OutputFilename”栏中写入输出OUT文件的名字,如sine.out,你还可以设置生成的MAP文件名。
(4).完成编译、连接,正确生成OUT文件。
然后使用File菜单的“LoadProgram”选项,将生成的OUT文件(如sine.out)装入DSP的片内存储器。
这时CCS将显示程序的启始地址_c_int00。
(5).选View→Graph→Time/Frequency…打开图形显示设置窗口。
在弹出的对话框中按下图设置,主要修改“StartAddress”为y0(y0为生成的正弦波输出变量);
“AcquisitionBufferSize”为1,“DSPDataType”为“16-bitsignedinteger”。
想想为什么要这样修改?
EMBEDPBrush
EMBEDPBrush
(6).在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。
该行被加亮为洋红色。
选择Debug→Animate,运行程序,观察输出波形。
数一数一个周期的正弦波有多少个点?
算算频率是否是2kHz?
另外,想想Run和Animate两种运行方式的区别?
通过计算发现,一个周期大约有2.5个点,按照每一格为20ms,计算发现,频率为2kHz。
Run方式为静态,每Run一次,程序跑一次。
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文件名,如timer.out。
(9).完成编译、连接,正确生成OUT文件。
然后使用File菜单的“LoadProgram”选项,将生成的OUT文件(如timer.out)装入DSP的片内存储器。
这时C