您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 用定时器实现数字振荡器(DSP实验报告)
用定时器实现数字振荡器一、实验目的在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。二、实验原理1)数字振荡器原理设一个传递函数为正弦序列sinkωT,其z变换为2111)(BzAzCzzH其中,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=0k=1y[1]=Ay[0]+By[-2]+c=ck=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]在k2以后,y[k]能用y[k-1]和y[k-2]算出,这是一个递归的差分方程。根据上面的说明,我们可以开始数字振荡器的设计。设该振荡器的频率为2kHz,采样率为40kHz(通过定时器设置,每隔25us中断一次,即产生一个y[n]),则递归的差分方程系数为:A=2cosωT=2cos(2xPIx2000/40000)=2x0.95105652B=-1C=sinωT=sin(2xPIx2000/40000)=0.30901699BCA7922150002215CB7132215CC为了便于定点DSP处理,我们将所有的系数除以2,然后用16位定点格式表示为:这便是本实验中产生2KHz正弦信号的三个系数。在本实验中,主程序在初始化时先计算出y[1]和y[2],然后开放定时器中断。以后每次进入定时器中断服务程序时,利用前面的y[1]和y[2],计算出新的有y[0],通过CCS提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。下面是初始化和中断服务程序代码片段:初始化y[1]和y[2]:ssbxFRCT;置FRCT=1,准备进行小数乘法运算st#INIT_A,AA;将常数A装入变量AAst#INIT_B,BB;将常数B装入变量BBst#INIT_C,CC;将常数C装入变量CCpshdCC;将变量CC压入堆栈popdy2;初始化y2=CCldAA,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寄存器,同时复制到y2macAA,a;完成新正弦数据的计算,a寄存器中为y1*AA+y2*BBstha,1,y1;将新数据存入y1,因所有系数都除过2,所以在保,存结果时转移一位,恢复数据正常大小。stha,1,y0;将新正弦数据存入y02)C54X的定时器操作初始化定时器的程序片段:stm#10h,TCR;停止定时器stm#2499,PRD;设置PRD寄存器值为2499,TINT中断频率为;Foutclk/(2499+1)=100MHz/2500=40KHzstm#20h,TCR;重新装入TIM和PSC,然后启动定时器3)C54X中断的使用本实验的初始化程序读取中断向量表的启始地址,然后设置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)三、实验内容本实验需要使用C54X汇编语言或C语言实现数字振荡器,并通过CCS提供的图形显示窗口观察输出信号波形以及频谱。实验分下面几步完成:1)根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,这里不再赘述。2)启动CCS,新建工程文件,如文件名为sinewave.pjt。选择Project菜单中的AddFileto4Project选项,将汇编源程序exer3.asm、vec_table.asm和连接定位sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。你也可以使用鼠标右键单击工程文件名(如sinewave.pjt)并选择AddFiles项来添加需要的文件。其中,exer3.asm包括初始化代码和中断服务程序,而vec_talbe.asm包含中断向量表。3)选择Project菜单中的Options选项,或使用鼠标右键单击工程文件名(如sinewave.pjt)并选择buildoptions项来修改或添加编译、连接中使用的参数。选择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”。4-14-24-34-4
本文标题:用定时器实现数字振荡器(DSP实验报告)
链接地址:https://www.777doc.com/doc-7276894 .html