实验三 用定时器实现数字振荡器.doc_第1页
实验三 用定时器实现数字振荡器.doc_第2页
实验三 用定时器实现数字振荡器.doc_第3页
实验三 用定时器实现数字振荡器.doc_第4页
实验三 用定时器实现数字振荡器.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三 用定时器实现数字振荡器1 实验目的 在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是讲某个频率的正弦/余弦值余弦计算出来后制成一个表,DSP工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。 本实验除了学习数字振荡器的DSP实现原理外,同时还学习C54X定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C语言分别完成源程序的编写。2 实验要求 本实验利用定时器产生了一个2kHz的正弦信号,定时器被设置成每25uS产生一次中断,(等效于采样速率未40k)利用该中断,在该中断服务程序中用叠代算法计算出一个SNT值,病利用CCS的图形显示功能查看波形。3 实验原理(1)数字振荡器原理 设一个传递函数为阵线序列sinkwT,其z变换为 其中,A2coswT,B-1,C=sinwT。设初始条件为0,求出上式的反Z变换得: yk=Ayk-1+Byk-2+Cxk-1这是个二阶差分方程,其单位冲击响应即为sinkwT。利用单位冲击函数xk-1的性质,即仅当k=1时,xk-1=1,代入上式得: k=0 y0=Ay-1+By-2+0=0 k=1 y1=Ay0+By-2+c=c k=2 y2=Ay1+By0+0=Ay1 k=3 y3=Ay2+By1 k=n yn=Ayn-1+Byn-2在k2以后,yk能用yk1和yk-2算出,这是一个递归得方法。 根据上面得说明,我们可以开始数字振荡器得设计。设该振荡器得频率为2kHz,采样率为40kHz(通过定时器设置,每隔25us中断一次,即产生一个yn)则递归得差分方程系数为:A2coswT=2cos(2PI2000/40000)=20.95105652B=-1C=sinwT=sin(2PI2000/40000)=0.30901699为了便于定点DSP处理,我们将所有系数除以2,然后用16为定点格式表示为:这便是本实验中查生2kHz阵线信号的三个系数。在本实验中,主程序在初始化时先计算出y1和y2,然后开放定时器中断。以后每次进入定时器中断服务程序时,利用前面的y1和y2,计算出新的所有yn,通过CCS提供的图形显示工具,我们将在图形窗口中看到一个正弦信号波形。下面时初始化和中断服务程序代码片断: 初始化y1和y2:ssbx FRCT :置FRCT =1,准备进行小数乘法运算st INIT_A,AA :将常数A装入变量AAst INIT_B,BB :将常数B装入变量BBst INIT_C,CC :将常数C装入变量CCpshd CC :将变量CC压入堆栈popd y2 :初始化y2=CCld 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寄存器,同时复制到y2mac AA,a :完成新正弦数据的计算,a寄存器中为 y1*AA+y2*BBsth a,l,y1 :将新数据存入y1,因所有系数都除过2,所以在 保存结果时转移一位,恢复数据正常大小sth a,l,y0 :将新正弦数据存入y0(2)C54X的定时器操作 C54X的片内定时器利用CLKOUT时钟计数,用户使用三个寄存器(TIM,PRD,TCR)来控制定时器,参见表41。在表42中列出了定时器控制寄存器的各个比特位的具体定义。VC5402得另一个定时器(定时器1)的控制寄存器分别为:0 30(TIM1),0 31(PRD1),0 32(TCR1)。表41VC5402定时器0的相关寄存器寄存器地址名称用途0024hTIM定时器寄存器,每计数一次自动减一0025hPRD定时器周期寄存器,当TIM减为0后,CPU自动将PRD的值装入TIM0026hTCR定时器控制寄存器表42定时器控制就存起(TCR)bit概要比特名称功能1512保留读出时为011soft该比特位与10位配合使用以决定定时器在使用仿真调试时的状态.Soft=0 当进入仿真调试时,定时器立即停止工作。Soft=1 当计数器被减为0后,停止工作。10free该比特位与11位配合使用以决定定时器在使用仿真调试时的状态free=0 根据11比特位决定定时器状态free=1 忽略11比特位,定时器不受影像96PSC定时器预置计数器。当PSC减为0后,CPU自动将TDDR装入,然后TIM开始减1。5TRB定时器复位。当TRB1时,CPU将PRD寄存器的值装入TIM寄存器,将TDDR的值装入PSC4TSS定时器停止状态。当系统复位时,TSS被清除,定时器立刻开始工作。TSS0 表示启动定时器TSS1 表示停止定时器03TDDR定时器扩展周期。当PSC减到0,CPU自动将TDDR的值装入PSC,然后TIM减。所以整个定时器得周期寄存器可以有20个比特(PRD+TDDR).从上面的介绍可以看到定时器实际上可以有20个比特的周期寄存器。它对于CLKOUT信号计数,先将PSC减1,知道PSC为0。这是CPU发出TINT中断,同时在TOUT引脚输出一个脉冲信号,脉冲宽度与CLKOUT一致。然后用PDR重新装入TIM,重复下去一直到系统或定时器复位。因而定时器中断得频率由一下的公式决定: TINT的频率其中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来决定开放或关闭一个中断请求。图41出了C5402得IMR寄存器的各个比特位的定义。 图41 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)决定。表43给出了中断向量表的各中断的偏移说明。例如C54x复位后其IPTR全为1,所以中断向量表位置在OFF80H,因而复位后程序从OFF80H开始运行。本实验的初始化程序读取中断向量表的起始地址,然后设置PMST的高9位,以便DSP能正确响应中断,代码如下:1d #0,dp ; 设置DP页指针ssbx intm ; 关闭所有中断 1d #vector ; 读出中断向量(地址vector在中断向量表程序中定义)and #OFF80h, a ; 保留PMST的低7位or pmst, a ; stlma, pmst ; 设置PMST(其中包括IPTR) 表43 54X的中断向量表 4 实验内容本实验需要使用C54X汇编语言或C语言实现数字振荡器,并通过CCS提供的图形显示窗口观察输出信号波形以及频谱。实验分下面几步完成:(1)根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,这里不再赘述。(2)启动CCS,新建工程文件,如文件名为 sinewave.mak。选择Project菜单中的Add File to Project 选项,将汇编源程序 exer3.sdm 、 vec_table.asm 和连接定 位 sinewave.cmd 文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。你页可以使用鼠标右键单击工程文件名(如sinewave.mak)并选择Add Files爱添加需要的文件。其中,exer3.asm包括初始化代码和中断服务程序,而vec_talbe.asm包含中断向量表。(3)选择Project菜单中的Option选项,或使用鼠标右键单击工程文件名(如sinewave.mak)并选择Option项来修改或添加编译、连接中使用的参数。例如,选择Assemble窗口,选择“Enable Symbolic Debug Information”以便使用汇编代码级调试(你可以在汇编源程序设置断点等等)。选择Linker窗口,在“Output Filename”栏中写入输出OUT文件的名字,如sina.out,你还可以设置生成的MAP文件名。(4)写成编译、连接,正确生成OUT文件。然后使用File菜单中的“Load Program”选项,将生成的OUT文件(如sina.out)装入DSP的片内存储器。这是CCS将显示程序的起始地址_c_int00.(5)选ViewGraphTime/Frequency打开图形显示设置窗口。在弹出的对话框中按下图设置,主要修改“Star Address”为y0(y0为生成的正弦波输出变量);“Acquisition Buffer Size”为1,“DSP Data Type”为“16-bit signed integer”。想想为什么要这样修改?(6)在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。该行被加亮为洋红色。选择DebugAnimate,运行程序,观察输出波形。数一数一个周期的正弦波由多杀个点?算算频率是否是2kHz?另外,想想Run和Animate两种运行方式的区别?(7)用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。将“Display Type”项改为“FFT Magnitude”以便显示信号频谱。修改“Sampling Rate(Hz)”项为40000,然后退出。注意观察生成的正弦波频率。(8)清除所有断点,关闭除波形显示窗口外的所有窗口,并关闭工程文件。现面我们使用C语言完成本实验。新建一个工程文件,如sinewave_c.mak并添加timer.c,vec_table.asm源程序,再添加timer.cmd,再添加C使用的标准库rts.lib。该文件应该再CCS安装目录中。例如,若CCS安装在d:ti下,则rts.lib应该在d:tic5400cgtoolslib下。修改编译、连接选项,加入符号调试选项,修改生成的OUT文件名,如tiner.out。(9) 完成编译。连接,正确生成OUT文件。然后使用File菜单的“Load Program”选项,将生成的OUT文件(如timer.out)装入DSP的片内存储器。这时CCS将显示程序的启始地址_c_int00. (10)打开C源程序(timer.c)窗口,在中断服务程序(函数tint())的“con_buf=0;”语句处增加一个断点。同样打开图形显示窗口,并将“Start Address”改为128,“Display Data Size”改为128,“DSP Data Type”为“32bit floating point”。想想为什么这次将“Acquisition Buffer Size”项设置为128?(11)选择DebugAnimate,运行程序,观察输出波形。数一数一个周期的正弦波有多个电?算算频率是否是2kHz?同样用右键单击图形显示窗口,显示信号频谱,。注意修改“Sampling Rata(Hz)”项为40000,然后退出。注意观察生成的正弦波频率。5思考题(1) 本实验程序产生了一个2kHz的正弦信号,请修改程序,产生一个频率相同的余弦信号。为了验证产生的COS信号,可以同时生成SIN和COS信号,然后在两个图形窗口中显示波形。它们应该正好相差/2相位。(2) 重新设计和实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论