1、1河 北 科 技 大 学实 验 报 告12 级 电信专业 123 班 学号 Z120701306 15 年 6 月 16 日姓 名 张娟 同组人 丁伟曼 Z120701305 指导教师 安国臣 实验名称 实验二 定时器与数字振荡器 成 绩实验类型 设计型 批阅教师一、实验目的在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表, DSP 工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。本实验除了学习数字振荡器的 DSP 实现原理外,同时还学习 C54X 定时器使用以及中断服务程
2、序编写。另外,在本实验中我们将使用汇编语言和 C 语言分别完成源程序的编写。二、实验要求本实验利用定时器产生一个 2kHz 的正弦信号。定时器被设置成每 25uS 产生一次中断 (等效于采样速率为 40K) 。 利用该中断, 在中断服务程序中用叠代算法计算出一个 SIN 值,并利用 CCS 的图形显示功能查看波形。三、实验内容本实验需要使用 C54X 汇编语言或 C 语言实现数字振荡器, 并通过 CCS 提供的图形显示窗口观察输出信号波形以及频谱。实验分下面几步完成:1) 根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明,这里不再赘述。2) 启动 CCS,新建工程文件,如
3、文件名为 sinewave.pjt。选择 Project 菜单中的 Add Fileto 4Project 选项,将汇编源程序 exer3.asm、 vec_table.asm 和连接定位 sinewave.cmd 文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度你也可以使用鼠标2右键 单击工程文件名(如 sinewave.pjt)并选择 Add Files 项来添加需要的文件。其中, exer3.asm 包括初始化代码和中断服务程序,而 vec_talbe.asm 包含中断向量表。3) 选择 Project 菜单中的 Options 选项,或使
4、用鼠标右键单击工程文件名(如sinewave.pjt)并选择 build options 项来修改或添加编译、连接中使用的参数。选择 Linker 窗口,在“ Output Filename”栏中写入输出 OUT 文件的名字,如 sine.out,你还可以设置生成的 MAP 文件名。4) 完成编译、连接,正确生成 OUT 文件。然后使用 File 菜单的“ Load Program”选项,将生成的 OUT 文件(如 sine.out)装入 DSP 的片内存储器。这时 CCS 将显示程序的启始地址_c_int00。5) 选 ViewGraphTime/Frequency打开图形显示设置窗口。在弹
5、出的对话框中按下图设置,主要修改“Start Address”为 y0(y0 为生成的正弦波输出变量) ;“Acquisition Buffer Size”为 1, “DSP Data Type”为“16-bit signed integer”。6) 在汇编源程序的中断服务程序( _tint)中的“ nop”语句处设置断点。选择 DebugAnimate,运行程序,观察输出波形。7) 用右键单击图形显示窗口,并选择“ Proporties”项以便修改显示属性。将“ DisplayType”项改为“ FFT Magnitude”以便显示信号频谱。修改“ Sampling Rate(Hz)”项为
6、40000,然后退出。注意观察生成的正弦波频率。四、实验原程序.title “for test INT service program .(25 us) “.mmregs.global _c_int00,_tint,vector OFF_INTIMER .set 04Ch ; vector of INTtimer at VECTOR+OFF_INTIMERINIT_A .set 079bch ; A/2=0.9510498INIT_B .set 0c000h ; B/2=-0.5INIT_C .set 013c7h ; C/2=0.15451053.bss y0,1.bss y1,1.bss
7、y2,1.bss temp,1.bss AA,1.bss BB,1.bss CC,1.text _c_int00:ld #0,dpssbx intm ; disable all interrupt ! st #1fffh,spld #vector, a ; get vector table address !and #0FF80h, aandm #007Fh, pmstor pmst, astlm a, pmst ; 设置 IPTRstm #10h,TCR ; init TIMERstm #2499,PRD ; f=100M/(2499+1)=40kHzstm #20h,TCR ; reset
8、 TIMERldm IMR,a ; read back IMRor #08h,a ; enable TIMER interruptstlm a,IMR ; set IMRld #temp,dp ; set DP ssbx FRCT ; prepare for fraction mpyst #INIT_A,AA ; init AA,BB,CCst #INIT_B,BB ; st #INIT_C,CC ;pshd CC4popd y2 ; init y2,y2=CCld AA,T ; T=AAmpy y2,a ; y2*AA - asth a,y1 ; y2*AA - y1stm #0h,TCR
9、; enable TIMERnoprsbx intm ; enable all int !again:nopb again nopnopnopnopnopnop;-; interrupt for INT_TIMER !;-_tint: ld #BB,DPld BB,T ; T=BBmpy y2,a ; a=y2*BBltd y1 ; T=y1,y2=y1mac AA,a ; a=a+y1*AAsth a,1,y1 ; new cos data - y1sth a,1,y0 ; new cos data - y0nop ; set breakpoint in CCS !int1_end: noprete 5.end实验现象:在图形显示窗口中,观察输出波形,是一连串的正弦波。