最新版dsp实验报告

2022-09-25

报告是日常生活与学习的常见记录方式,报告有着明确的格式。在实际工作中,我们怎么样正确编写报告呢?以下是小编整理的关于《最新版dsp实验报告》,供需要的小伙伴们查阅,希望能够帮助到大家。

第一篇:最新版dsp实验报告

DSP实验报告

实验0 实验设备安装才CCS调试环境

实验目的:

按照实验讲义操作步骤,打开CCS软件,熟悉软件工作环境,了解整个工作环境内容,有助于提高以后实验的操作性和正确性。 实验步骤:

以演示实验一为例:

1. 使用配送的并口电缆线连接好计算机并口与实验箱并口,打开实验箱电源; 2.启动CCS,点击主菜单“Project->Open”在目录“C5000QuickStartsinewave”下打开工程文件sinewave.pjt,然后点击主菜单“Project->Build”编译,然后点击主菜单“File->Load Program”装载debug目录下的程序sinewave.out;

3. 打开源文件exer3.asm,在注释行“set breakpoint in CCS !!!”语句的NOP处单击右键弹出菜单,选择“Toggle breakpoint”加入红色的断点,如下图所示; 4. 点击主菜单“View->Graph->Time/Frequency„”,屏幕会出现图形窗口设置对话框

5. 双击Start Address,将其改为y0;双击Acquisition Buffer Size,将其改为1;DSP Data Type设置成16-bit signed integer,如下图所示;

6. 点击主菜单“Windows->Tile Horizontally”,排列好窗口,便于观察

7. 点击主菜单“Debug->Animate”或按F12键动画运行程序,即可观察到实验结果:

心得体会:

通过对演示实验的练习,让自己更进一步对CCS软件的运行环境、编译过程、装载过程、属性设置、动画演示、实验结果的观察有一个醒目的了解和熟悉的操作方法。熟悉了DSP实验箱基本模块。让我对DSP课程产生了浓厚的学习兴趣,课程学习和实验操作结合为一体的学习体系,使我更好的领悟到DSP课程的实用性和趣味性。

实验二 基本算数运算

2.1 实验目的和要求

加、减、乘、除是数字信号处理中最基本的算术运算。DSP 中提供了大量的指令来 实现这些功能。本实验学习使用定点DSP 实现16 位定点加、减、乘、除运算的基本方法 和编程技巧。本实验的演示文件为exer1.out。

2.2 实验原理

1) 定点 DSP 中的数据表示方法

C54X 是16 位的定点DSP。一个16 位的二进制数既可以表示一个整数,也可以表

示一个小数。当它表示一个整数时,其最低位(D0)表示20,D1 位表示21,次高位(D14) 表示214。

2) 实现 16 位定点加法

C54X 中提供了多条用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中

ADDS 用于无符号数的加法运算,ADDC 用于带进位的加法运算(如32 位扩展精度加 法),而ADDM 专用于立即数的加法。

3) 实现 16 位定点减法

C54X 中提供了多条用于减法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于无符号数的减法运算,SUBB 用于带进位的减法运算(如32 位扩展精度的减法), 而SUBC 为移位减,DSP 中的除法就是用该指令来实现的。

4) 实现 16 位定点整数乘法

在C54X 中提供了大量的乘法运算指令,其结果都是32 位,放在A 或B 寄存器 中。乘数在C54X 的乘法指令很灵活,可以是T 寄存器、立即数、存贮单元和A 或B 寄存器的高16 位。

5) 实现 16 位定点小数乘法

在 C54X 中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘, 其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X 中提供了一个状态位FRCT,将其设置为1 时,系统自动将乘积结果左移一位。但注意 整数乘法时不能这样处理,所以上面的实验中一开始便将FRCT 清除。两个小数(16 位) 相乘后结果为32 位,如果精度允许的话,可以只存高16 位,将低16 位丢弃,这样仍可 得到16 位的结果。

6) 实现 16 位定点整数除法

在 C54X 中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法 来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于 除以常数特别适用。另一种方法是使用SUBC 指令,重复16 次减法完成除法运算。

7) 实现 16 位定点小数除法

在 C54X 中实现16 位的小数除法与前面的整数除法基本一致,也是使用循环的

SUBC 指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),

1 所以被除数一定小于除数。

2.3 实验内容

本实验需要使用C54X 汇编语言实现加、减、乘、除的基本运算,并通过DES 的存 贮器显示窗口观察结果。

1) 编写实验程序代码

2) 用 ccs simulator 调试运行并观察结

2.4 实验结果

1、加法结果

2、乘法结果

3、减法结果

4、除

4 2.5 思考题(0.5、0.25)

5 实验三 C54X的浮点数的算术运

一、实验目的

1) 练习 TMS320C54X 汇编程序的编写与调试方法,重点练习C54X 程序流程控制的方法。 2) 学习并掌握应用 TMS320C54X 来进行浮点数的各种算术运算的算法实现。

3) 练习并掌握 TMS320C54X 的汇编语言的汇编指令系统的使用方法,重点练习具有C54X 特点的一些在功能上有所扩展的特殊指令,并了解这些指令在进行算术运算或各种控制时所带来的方便。

4) 练习并掌握用 CCS 调试程序的一些基本操作。

二.实验原理

1) 浮点数的表示方法

在定点运算中,小数点是在一个特定的固定位置。例如,如果一个 32-bit 的数把小数点放在最高有效位(也就是符号位)之后,那么就只有分数(绝对值小于1)才能被显示。在定点运算系统中,虽然在硬件上实现简单,但是表示的操作数的动态范围要受到限制。

3) 浮点数运算的步骤

程序代码分成四个 ASM 文件输入,通过编译生成.obj 文件,连接生成.out 文件后就可以在DES320PP-U 实验系统上调试运行(先要创建一个工程文件,然后加入四个工程文件,并且一起编译,连接。因为每个文件都对下一个文件作了引用)。步骤如下:

a. 首先启动 setup CCS C5000,在其中设置目前需要的CCS 的工作状态为C54xxsimulator,保存这一设置并退出。然后再启动CCS 实验系统软件CCS C5000。

b. 在下拉菜单中选择“File”->“Load Program”以装入所要调试的程序fc.out,这时,在反汇编窗口中能看到程序的源代码。

c. 在下拉菜单中选择“View”->“CPU Registers”->“CPU Register”,可以看见在CCS 界面下部份会出现CPU 中的相关寄存器;选择“View”->“Memory…”,在弹出的“Memory Window Options”窗口中选择要观察的区域为数据区,地址开始为0x80h,然后就可以看见出现一个Data Memory 窗口,其中显示了从0x80h 开始的 .bss 区。

d. 在反汇编窗口中需要观察的地方设置断点:在这条指令处双击将其点为红色即可。比如在加法程序中有指令nop 的位置都可以加一个断点。

e. 在下拉菜单中选择“调试”——“连续运行”(或直接点击“运行程序”按钮)运行浮点数程序。如果编写程序时在计算完毕后遇到一个断点,那么程序到此会自动停止。

f. 当示范程序在第一个断点处停下来时,此时就可以看见程序初始化后的情况:被加数12.0 以浮点数的格式放在内存区0x08a-0x08b 中,其值为4140h 和0000h。加数12.0 放在内存区0x08c-0x08d 中,其值也为4140h 和0000h。

6 g. 再点击“运行程序”按钮,之后程序会在下一个断点处停下来,这时可以看见被加数被格式转换后的变量op1hm、op1lm 和op1se 的值在内存区0x084-0x086 中,分别为00c0h、0000h 和0082h。同样加数被格式转换后的变量op2se、op2hm 和op2lm的值在内存区0x087-0x089 中,分别为0082h、00c0h 和0000h。

h. 再点击“运行程序”按钮,程序停下来时就可以观察到在存储器窗口中表示结果的变量rlthm、rltlm、rltsign 和rltexp 的值在内存区0x080-0x083 中,其值分别为0040h、0000h、0180h 和0083h。

i. 这时可以看到 A 寄存器中的值为AH=41c0h,AL=0000h 这就是最后的以浮点数的格式表示的结果值24(=12+12)。加法运算到此结束。

j. 继续点击“运行程序”按钮,当程序再次停下来时就可以看见在A 寄存器中显示的13.0 与12.0 进行减法运算的结果:AH=3f80h,AL=0000h。这是用浮点数格式表示的数1(=13-12)。减法运算的程序到此结束。

k. 继续点击“运行程序”按钮,当程序再次停下来时就可以看见在A 寄存器中显示的12.0 与12.0 进行乘法运算的结果:AH=4310h,AL=0000h。这是用浮点数格式表示的数144(=12*12)。乘法运算的程序到此结束。

l. 继续点击“运行程序”按钮,当程序再次停下来时就可以看见在A 寄存器中显示的12.0 与4.0 进行除法运算的结果:AH=4040h,AL=0000h。这是用浮点数格式表示的数3(=12/4)。至此加、减、乘、除四种运算都运行完毕。

m. 如果程序运行不正确,请检查源程序是否有误,必要时可以在源程序中多插入断点语句。程序在执行到断点语句时自动暂停,此时可以通过检查各个寄存器中的值以及内存单元中的值来判断程序执行是否正确。

三.在 CCS 的C54xx simulator 上调试观察实验结果

浮点加法断点一:

7 浮点加法断点二:

浮点加法断点三:

8 浮点减法

浮点数乘法

9 浮点数除法

四 心得体会

通过学习C54X的浮点数的算术运算,以及实验结果的观察,使我了解了浮点数运算的原理,学习并掌握用TMS320C54X来进行浮点数的各种算术运算的算法实现。 实验四用定时器实现数字振荡器

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

4.1 实验目的

在数字信号处理中,会经常使用到正弦/余弦信号。通常的方法是将某个频率的正弦/余弦值预先计算出来后制成一个表,DSP 工作时仅作查表运算即可。在本实验中将介绍另一种获得正弦/余弦信号的方法,即利用数字振荡器用叠代方法产生正弦信号。本实验除了学习数字振荡器的DSP 实现原理外,同时还学习C54X 定时器使用以及中断服务程序编写。另外,在本实验中我们将使用汇编语言和C 语言分别完成源程序的编写。

4.2 实验要求

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

4.3 实验原理

1) 数字振荡器原理

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

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

y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2) C54X 的定时器操作

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

3) C54X 中断的使用

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

图 4-1 ‘C5402 的IMR 寄存器

其中,HPINT 表示HPI 接口中断,INT3-INT0 为外部引脚产生的中断,TXINT 和TRINT 为TDM 串口的发送和接收中断,BXINT0 和BRINT0 为BSP 串口的发送和接收中断,TINT0 为定时器0 中断。在中断屏蔽寄存器IMR 中,1 表示允许CPU 响应对应的中断,0 表示禁止。当然要CPU 响应中断,ST1 寄存器中的INTM 还应该为0(允许所有的中断)。

本实验的初始化程序读取中断向量表的启始地址,然后设置PMST 的高9 位,以便DSP 能正确响应中断,代码如下:

ld #0,dp ;设置DP 页指针 ssbx intm ;关闭所有中断

11 ld #vector, a ;读出中断向(地址vector 在中断向量表程序中定义) and #0FF80h, a ;保留高9 位(IPTR) andm #007Fh, pmst ;保留PMST 的低7 位 or pmst, a ;

stlm a, pmst ;设置PMST(其中包括IPTR)

4.4 实验内容

本实验需要使用 C54X 汇编语言或C 语言实现数字振荡器,并通过CCS 提供的图形显示窗口观察出信号波形以及频谱。实验分下面几步完成:

1) 根据确定数字振荡器的频率,确定系数。 2) 启动 CCS,新建工程文件。

3) 选择 Project 菜单中的Options 选项,或使用鼠标右键单击工程文件名(如sinewave.pjt)并选择build options 项来修改或添加编译、连接中使用的参数。选择Linker 窗口,在“Output Filename”栏中写入输出OUT 文件的名字,如sine.out,你还可以设置生成的MAP 文件名。

4) 完成编译、连接,正确生成OUT 文件。

5) 选 View→Graph→Time/Frequency„打开图形显示设置窗口。 6) 在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。 7) 用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。

12 8) 清除所有断点,关闭除波形显示窗口外的所有窗口,并关闭工程文件。 9) 完成编译、连接,正确生成OUT 文件。

10)打开 C 源程序(timer.c)窗口,在中断服务程序(函数tint())的“con_buf=0;”语句处增加一个断点。同样打开图形显示窗口,并将“Start Address”改为buf;“Acquisition Buffer Size”改为“Display Data Size”改为128,“DSP DataType”为“32-bit floating point”

11)选择 Debug→Animate,运行程序,观察输出波形。

第二篇:dsp实验报告心得体会

TMS320F2812x DSP原理及应用技术实验心得体会

1. 设置环境时分为软件设置和硬件设置,根据实验的需要设置,这次实验只是软件仿真,可以不设置硬件,但是要为日后的实验做准备,还是要学习和熟悉硬件设置的过程。

2. 在设置硬件时,不是按实验书上的型号选择,而是应该按照实验设备上的型号去添加。

3. 不管是硬件还是软件的设置,都应该将之前设置好的删去,重新添加。设置好的配置中只能有一项。

4. CCS可以工作在纯软件仿真环境中,就是由软件在PC机内存中构造一个虚拟的DSP环境,可以调试、运行程序。但是一般无法构造DSP中的外设,所以软件仿真通常用于调试纯软件算法和进行效率分析等。 5. 这次实验采用软件仿真,不需要打开电源箱的电源。

6. 在软件仿真工作时,无需连接板卡和仿真器等硬件。

7. 执行write_buffer一行时。如果按F10执行程序,则程序在mian主函数中运行,如果按F11,则程序进入write_buffe函数内部的程序运行。 8. 把str变量加到观察窗口中,点击变量左边的“+”,观察窗口可以展开结构变量,就可以看到结构体变量中的每个元素了。

9. 在实验时,显示图形出现问题,不能显示,后来在Graph Title 把Input的大写改为input,在对volume进行编译执行后,就可以看到显示的正弦波图形了。 10. 在修改了实验2-1的程序后,要重新编译、连接执行程序,并且必须对.OUT文件进行重新加载,因为此时.OUT文件已经改变了。如果不重新加载,那么修改执行程序后,其结果将不会改变。

11. 再观察结果时,可将data和data1的窗口同时打开,这样可以便于比较,观察结果。

12. 通过这次实验,对TMS320F2812x DSP软件仿真及调试有了初步的了解与认识,因为做实验的时候都是按照实验指导书按部就班的,与真正的理解和掌握还是有些距离的。但是这也为我们日后运用这些知识打下了基础,我觉得实验中遇到的问题,不要急于问老师或者同学,先自己想办法分析原因,想办法解决,这样对自身的提高更多吧。通过做实验,把学习的知识利用起来,也对这门课程更加有兴趣了。

组员:叶孝璐 冯焕芬 郑玮仪 庞露露

2012年4月10号

第三篇:dsp实验指导书尉

电气工程学院

《DSP技术及应用》

实验指导书

尉学军编写

适用专业:电子信息工程

贵州大学 二OO 八年八月

前言

《数字信号处理》实验是理论教学的深化和补充,具有较强的实践性,是一门重要的专业必修课,可作为通信类、电子类专业学生的选修课。所开设的实验以具体实例为实验内容,让学生深刻理解DSP芯片的特点,培养学生应用DSP设计解决实际问题的能力。通过上机与实验,理解实验原理及实验方案,掌握正确的操作规程,掌握5410USB EVM实验箱的正确使用方法。掌握CCS软件的使用,熟练掌握DSP的汇编语言的编写和程序调试,掌握DSP的中断技术和定时器的初始化方法以及应用,以及利用串口进行数据采集。并要求学生利用北京闻亭5410USB EVM实验箱进行数字式信号发生器和滤波器的设计。

作者在此设计了11个实验,其中4个验证性实验,6个设计性实验,1个综合性实验。在开设实验过程中,可以根据大纲选作部分实验。

目录

1、实验一:CCS的安装与simulate的使用·····················································3

2、实验二:汇编语言基本算术运算································································7

3、实验三:程序的控制和转移······································································10

4、实验四:数字式正弦信号发生器·······························································14

5、实验五:FIR数字滤波器 ·········································································21

6、实验六:IIR数字滤波器 ·········································································27

7、实验七: 图象的伽玛增强······························································ ··········35

8、实验八: 快速傅立叶变换(FFT)的实现······················································42

9、实验九: 控制XF引脚周期性变化·····························································49

10、实验十: 多通道缓冲串口的使用·····························································54

11、实验十一: DTMF算法设计和DSP实现·····················································62

12、 实验报告基本内容要求········································································66

13、实验报告格式··························································································68

14、参考文献·································································································70

实验一: CCS的安装与simulate的使用

实验学时:2 实验类型:验证 实验要求:必修

一、实验目的

学会CCS的安装和设置, 熟悉程序的开发流程, 初步掌握Simulator的使用方法.

二、实验内容

安装CCS软件,并利用CCSsetup进行设置 对一个简单程序进行调试

三、实验原理、方法和手段

利用软件对指令进行仿真分析。

四、实验组织运行要求

根据本实验的特点、要求和具体条件,采用教师简单讲解,学生自己动手操作的形式。

五、实验条件

计算机一台

六、实验步骤

1、CCSset 的设置

CCS设置程序是用于建立CCS集成开发环境与目标板或simulator之间通信的接口.CCS是一个开放的环境,通过设置不同的驱动完成对不同环境的支持.本教案以CCS2.0为例说明CCS下的驱动设置方法.

假设安装路径为: d: i下,对CCS的 设置如下:

(1) 双击桌面上的”setup ccs 2 (c5000)”,开始运行程序,回出现如图1-1所示的界面; 3

图1-1 CCS的首界面 (2) 单击”CLOSE”按纽关闭对话框. (3) 在“Available Board/Simulator Types”栏选择 “54xx simulator”在“Board Propertis”对话框中点击按纽“next”,一直到“Finish”如图1-2所示。

图1-2 选择仿真板界面

此处对要仿真的方式进行选择,是进行软件仿真(Simulator)还是硬件仿真(Eimulator),并可以选择要仿真的板子的型号,在此我们选择软件仿真.用的是C54xx Simulator. (4) 在菜单File中选择”Start Code Composer Studio”,启动CCS 5000.

设置完毕

2、一个简单DSP程序的调试

(1) 创建工程

运行CCS 5000(54XX Simulaor/CPU)

在Project菜单中选择New项,将弹出Project Creation的窗口

图 1-3 创建工程界面

将新建的工程存入E盘,CCS将建立一个名为*.pjt的工程,此文件保存了工程的设置信息及工程中的文件引用情况.

(2)将文件添加到工程

从Files->new菜单中选择Source File,输入源程序.这里请大家输入以下的源程序.将程序存为*.asm的程序 .title "wx1.asm" .mmregs STACK .usect "STACK",10H .bss a,4 .bss x,4 .bss y,1 .def start .data table: .word 1,2,3,4 .word 8,6,4,2 .text start: STM #0,SWWSR STM #STACK+10H,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ LD #1,DP CALL SUM end: B end SUM: STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,@y 5

RET .end 从Project菜单中选取 Add Files to Project,将刚才编写的程序添加到本工程. 双击的Source右边的”+”,可以观察到刚才所添加的源文件. (3) 生成和运行程序

执行菜单Project->Rebuild All,对文件进行编译,汇编,链接,Output窗口将显示编译,汇编,链接的信息,错误提示等.最后生成*.out文件.编译通过时会出现两个警告.

图1-4 Output窗口

执行菜单Project->Load Program,将刚才所生成的*.out文件加载到DSP中,CCS将会自动打开一个反汇编窗口,显示加载程序的反汇编指令.

(4)观察程序结果:

分别点击菜单Viex->Memory和Registers可以观察程序执行后存储器的变化,程序执行的结果以及寄存器值的变化情况

七、思考题

1. 按照实验要求写出实验报告;将程序显示的结果粘贴到实验报告里面.

2. 程序调试过程中,出现什么错误,什么原因造成的,怎样改正的?

3. 熟悉CCS其他菜单的功能,如何设置断点进行程序调试?

八、实验报告

在实验分析过程中,要对寄存器的变化以及存贮器的分配有仔细的分析,实验报告要将程序结果,存储器和寄存器的结果抓下来。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

实验二:汇编语言基本算术运算

实验学时:2 实验类型:验证 实验要求:必修

一、实验目的

进一步熟悉CCS进行程序编译,调试的步骤. 掌握进行算术运算的常用指令,以及伪指令的作用. 掌握汇编语言进行整数运算,小数运算以及双操作数运算.浮点运算的方法.注意双操作数运算所允许使用的辅助寄存器.

二、实验内容

加减法和乘法运算 小数运算

三、实验原理、方法和手段

利用软件对指令进行仿真分析。

四、实验组织运行要求

根据本实验的特点、要求和具体条件,采用教师简单讲解,学生自己动手操作的形式。

五、实验条件

计算机一台

六、实验步骤

1、计算 z=x+y-w

.tiltle “example.asm” .mmregs STACK .usect “stack”,10H

.bss x,1 .bss y,1 .bss w,1 .bss z,1 .def start .data table: .word 10,26,23 .text Start: STM #0,SWWSR STM #STACK+10H,SP

7 STM #x,AR1 RPT #2 MVPD table,*AR1+ CALL SUMB end: B end SUMB: LD @x,A ADD @y,A SUB @w,A LD #1,DP STL A,@z RET .end

2、乘加运算

.tiltle “example.asm” .mmregs STACK .usect “stack”,10H

.bss a,4 .bss x,4 .bss y,1 .def start .data table .word 1,2,3,4 .word 8,6,4,2

.text start: STM #0,SWWSR STM #STACK+10H,SP STM #x,AR1 RPT #7 MVPD table,*AR1+ CALL SUM end: B end SUM: STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,@Y RET .end

3、 小数运算

.tiltle “example.asm” .mmregs STACK .usect “stack”,10H .bss a,4 .bss x,4

.bss y,1 .def start .data table .word 1*32768/10 .word 2*32768/10 .word -3*32768/10 .word 4*32768/10 .word 8*32768/10 .word 6*32768/10 .word -4*32768/10 .word -2*32768/10 start: SSBX FRCT STM #a,AR1 RPT #7 MVPD table,*AR1+ STM #a,AR3 STM #x,AR4 RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,@Y end: B end .end 观察程序结果: 分别点击菜单Viex->Memory和Registers可以观察程序执行后存储器的变化,程序执行的结果以及寄存器值的变化情况.

七、思考题

1. 按照实验要求写出实验报告;将程序显示的结果粘贴到实验报告里面. 2. 程序调试过程中,出现什么错误,什么原因造成的,怎样改正的? 3. 在小数运算的过程中,小数大于1,比如a2=1.2,程序如何修改.

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

实验三:程序的控制和转移

实验学时:2 实验类型:验证 实验要求:必修

一、实验目的

了解堆栈的使用方法,掌握指令的重复操作,程序的跳转,调用和返回. 掌握条件算符组合时候应注意的三点; 掌握*.cmd文件,特别是伪指令MEMORY,SECTION的作用.

二、实验内容

程序的转移和调用,重复执行,堆栈的使用

三、实验原理、方法和手段

利用软件对指令进行仿真分析。

四、实验组织运行要求

根据本实验的特点、要求和具体条件,采用集中讲解和学生动手的形式。

五、实验条件

安装CCS 的电脑一台

六、实验步骤

程序调试步骤参考实验一

1、 程序的转移和调用 .title “example.asm” .mmregs STACK .usect “stack”,10H; .bss x,5 .bss y,1 .def start .data table: .word 10,30,4,5,6 .text start: STM #0,SWWSR STM #STACK+10H,SP ;SP= STM #x,AR1; AR1= RPT #4 MVPD table,*AR1+ ;AR1=

LD #0,A CALL SUM end: B end SUM: STM #x, AR3 STM #4,AR2 loop: ADD *AR3+,A BANZ loop,*AR2- STL A,@y; AR2= , AR3= ,A= RET .end 将以上文件存为*.ASM格式. 以下是*.CMD文件: *.obj ;注意:此处文件名要与上面的*.ASM文件的名字要一致. -o *.out -m *.map -e start MEMORY { PAGE 0: EPROM: org=0E000H len=0100H VECS : org=0FF80H len=0004H PAGE 1: SPRAM: org=0060H len=0020H DARAM: org=0080H len=0100H } SECTIONS { .text :>EPROM PAGE 0 .data :>EMROM PAGE 0

.bss :>SPRAM PAGE 1 STACK :>DARAM PAGE 1 .vectors :>VECS PAGE 0 } 2) 堆栈段的初始化

.title “wxample3.asm” .mmregs size .set 100 stack .usect “STK”,10H .bss length,10H .def start .text start: STM #0,SWWSR STM #stack+size,SP 11

LD #-8531,A STM #length,AR1 MVMM SP,AR7 loop: STL A,*AR7- BANZ loop,*AR1- .end CMD文件 example.obj -o example.out -m example.map -e start MEMORY { PAGE 0: EPROM :ORG=0E000H,LEN=0100h VECS: ORG=0FF80H,LEN=0004H PAGE 1: SARAM: ORG=0060H,LEN=0010H; DARAM: ORG=0070H,LEN=0100H } SECTIONS { .text :>EPROM PAGE 0 .data :>EPROM PAGE 0 .bss :>SARAM PAGE 1 .STACK :>DARAM PAGE 1 }

3、 重复操作

下面程序实现对数组进行初始化以后再对每个元素加1 .title “example.asm”

.mmregs stack .usect “STACK”,10H .bss x,5 .def start .text start: STM #x,AR1 LD #2,A ;将每个数组初始化为2 RPT #4 STL A,*AR1+ LD #1,16,A STM #4,BRC STM #X,AR4 PRTB next-1 12

ADD *AR4,16,B,A STH A,*AR4+ next: LD #0,B end: B end .end

七、思考题

1. 按照实验要求写出实验报告;将程序显示的结果粘贴到实验报告里面. 2. 程序调试过程中,出现什么错误,什么原因造成的,怎样改正的? 3. 简要写出*.cmd文件,特别是伪指令MEMORY,SECTION的作用 4. 试将程序1的运行结果填写的相应的横线上。

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

实验四:数字式正弦信号发生器

实验学时:2 实验类型:设计型 实验要求:必修

一、实验目的

掌握正弦信号发生器的算法; 学会用断点进行程序调试.

二、实验内容

利用DSP设计一个正弦信号发生器

三、实验原理、方法和手段

在高等数学中,正弦函数和余弦函数可以展开为泰勒级数,其表达式为: x3x5x7 sinx=x-+- +„ 3!5!7!x2x4x6 cosx=1-+- +„ 2!4!6! 如果要计算一个角度的正弦和余弦,可以取泰勒级数的前5项进行近似计算. 上两个式子可以化为: x2x2x2x2 sinx=x(1- (1-(1-(1-)))) 2*34*56*78*9x2x2x2x2 cosx=1-(1-(1- (1- ))) 23*45*67*8 然后利用这两个式子,计算出0

o___

45(间隔为0.5)的正弦和余弦值.

o___

oo 再利用sin2x=2sinxcos公式,计算0 最后通过复制取反,获得0

o___

o

90的正弦值.

o

359的正弦值.

四、实验组织运行要求

根据本实验的特点、要求和具体条件,采用集中讲授和学生动手的形式。

五、实验条件

安装CCS软件的电脑一台

六、实验步骤

程序调试步骤参考实验一

1、源程序

.mmregs .def start .ref d_xs,d_sinx,d_xc,d_cosx,sinx,cosx sin_x: .usect "sin_x",360 STACK .usect "STACK",10H PA0 .set 0 k_theta .set 286 start: .text STM #STACK+10H,SP STM k_theta,AR0 STM 0,AR1 STM #sin_x,AR6 STM #90,BRC RPTB loop1-1 LDM AR1,A LD #d_xs,DP STL A,@d_xc STL A,@d_xs CALL sinx CALL cosx LD #d_sinx,DP LD @d_sinx,16,A MPYA @d_cosx STH B,1,*AR6+ MAR *AR1+0 ;计算0—45度的正弦值 loop1: STM #sin_x+89,AR7 STM #88,BRC RPTB loop2-1 LD *AR7-,A STL A,*AR6+ ;计算45-89度的正弦值 loop2: STM #179,BRC STM #sin_x,AR7 RPTB loop3-1 LD *AR7+,A NEG A STL A,*AR6+ ;计算90-179度的正弦值 loop3: STM #sin_x,AR6 STM #1,AR0 STM #360,BK ;计算180-359度的正弦值

loop4: PORTW *AR6+0%,PA0 B loop4

sinx: sinx子程序 .def d_xs,d_sinx .data table_s .word 01C7H .word 030BH .word 0666H .word 1556H d_coef_s .usect "coef_s",4 d_xs .usect "sin_vars",1 d_square_xs .usect "sin_vars",1 d_temp_s .usect "sin_vars",1 d_sinx .usect "sin_vars",1 d_l_s .usect "sin_vars",1 .text SSBX FRCT STM d_coef_s,AR5 RPT #3 MVPD #table_s,*AR5+ STM #d_coef_s,AR3 STM #d_xs,AR2 STM #d_l_s,AR4 STM #7FFFH,d_l_s SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 || LD *AR4,B MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 ||LD *AR4,B MASR *AR2-,*AR3+,B,A MPYA d_xs STH B,d_sinx RET

cosx: ; cosx子程序 .def d_xc,d_cosx .data table_c .word 0249H .word 0444H .word 0aabH .word 4000H d_coef_c .usect "coef_c",4 d_xc .usect "cos_vars",1 d_square_xc .usect "cos_vars",1 d_temp_c .usect "cos_vars",1 d_cosx .usect "cos_vars",1 c_l_c .usect "cos_vars",1 .text SSBX FRCT STM d_coef_c,AR5 RPT #3 MVPD #table_c,*AR5+ STM #d_coef_c,AR3 STM #d_xc,AR2 STM #c_l_c,AR4 STM #7FFFH,c_l_c SQUR *AR2+,A ST A,*AR2 ||LD *AR4,B MASR *AR2+,*AR3+,B,A MPYA A STH A,*AR2 MASR *AR2-,*AR3+,B,A MPYA *AR2+ ST B,*AR2 || LD *AR4,B MASR *AR2-,*AR3+,B,A SFTA A,-1,A NEG A MPYA *AR2+ MAR *AR2+ RETD ADD *AR4,16,B STH B,*AR2 RET .end *.CMD 文件 sinx.obj 17

-o sin.out -m sin.map -e start MEMORY { PAGE 0: EPROM: org=0E000H,len=1000H VECS: org=0FF80H,len=0080H PAGE 1: SPRAM: org=0060H,len=0020H DARAM1: org=0080H,len=0010H DARAM2: org=0090H,len=0010H DARAM3: org=0200H,len=0200H }

SECTIONS { .text :>EPROM PAGE 0 .data :>EPROM PAGE 0 STACK :>SPRAM PAGE 1 sin_vars :>DARAM1 PAGE 1 coef_s :>DARAM1 PAGE 1 cos_vars :>DARAM2 PAGE 1 coef_c :>DARAM2 PAGE 1 sin_x : align (512){}>DARAM3 PAGE 1 }

2、程序调试过程中,可以采用利用断点进行调试,方法如下: 1)利用断点对话框进行设置. 2)使用工具条上的按纽进行设置, 利用工具条上的按纽,可以快速设置断点: 在反汇编窗口中,将光标移到需要设置断点的语句行上,然后单击工具条上的设置断点按纽(有一个手),则在该语句行上设置一个断点. 3) 在反汇编窗口直接进行设置. 在反汇编窗口,用鼠标直接双击要设置的断点的指令行,即可完成断点的设置. 执行的时候可以选择动画运行. 在执行前先设置好断点,然后,没执行一次操作命令,就会从当前位置执行到下一个断点处.连续执行操作命令就可以实现动画操作. 使用调试菜单”DEBUG”中的”Animate”命令,或者单击调试工具条上的动画执行按 18

纽,用户就可以进行动画操作.

3、观察波形

观察存储器和寄存器的内容在实验一中进行了介绍.在此不做赘述了.现在介绍CCS图形工具的使用方法. CCS开发环境提供了多种强大的图形显示工具,可以将内存中的数据以各种图形的方式显示给用户,帮助拥护直观的了解数据的意义. CCS提供了四大类九种图形显示方式: 1) 时频图(Time_frequency) 单曲线图(Single_time) 对数据不做处理,直接绘制显示缓冲区数据的幅度_时间曲线

双曲线图(Double_time) 在一个图象中显示两条信号的幅度_时间曲线 FFT幅度(FFT Magnitude) 对显示缓冲器数据进行FFT变换,显示幅度_频率图

复数FFT(Complex FFT) 对复数数据的实部和虚部分别进行FFT变换,在一幅图中显示两条幅度_频率曲线. FFT幅度和相位(FFT Magnitude and Phase) 在一幅图中显示幅度_频率曲线和相位_频率曲线. FFT多桢显示(略) 2) 星座图(Constellation) 显示信号的相位分布 3) 眼图(Eye Diagram) 显示信号码间的干扰情况 4) 图像显示(Image) 显示YUV和RGB图像

图形显示步骤: 在”View”菜单中,选择”Graph”选项,弹出命令子菜单, 在该菜单中选择”Time/Frequency”,

在弹出的对话框中,将”Display Type”选择为”Single_time”,

”Start Addtress”定为”0200H”, 将”PAGE”定为”data”

“Display Data Size”定为”0200H”

点击”OK”来观察图象. 19

图4-1 产生的正弦波形

七、思考题

按照实验要求写出实验报告;将程序显示的结果粘贴到实验报告里面. 如何设置断点进行程序调试? 要产生周期性的三角波,或者锯齿波,程序如何实现?

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

实验五:FIR数字滤波器

实验学时:2 实验类型:设计

实验要求:选修

一、实验目的

了解FIR的MATLAB设计方法

掌握FIR的DSP实现方法,熟练掌握循环寻址指令.

二、实验内容

设计一个31阶的低通FIR滤波器,其截止频率为0.6。

三、实验原理、方法和手段

FIR滤波器的差分方程: N1 (5-1) i0 其中bi为滤波器的系数,N为滤波器的阶次,x(n)为输入,y(n)为输出. FIR滤波器的MATLAB设计

MATLAB中的工具箱(Toolbox)包含了许多实用程序。它提供了多种FIR滤波器设计方法。

下面以标准频率响应设计法fir1和任意频率响应设计法fir2为例说明其使用方法

1、fir1函数

使用fir1函数可设计标准的低通、高通、带通和带阻滤波器。

语法: b=fir1(n,Wn) b=fir1(n,Wn,„ftype‟) b=fir1(n,Wn,Window) b=fir1(n,Wn,„ftype‟,Window) 其中n为 滤波器的阶次,Wn为截止频率,ftype为滤波器的类型,window为采用的窗函数的类型,默认为H amming类型. 1) 采用汉明窗设计低通FIR滤波器

使用b=fir1(n,Wn)可得到低通滤波。0 Wn 1, Wn=1相当于0.5fs。

格式:

b=fir1(n,Wn) (2) 采用汉明窗设计高通FIR滤波器

21 y(n)bix(ni)

在b=fir1(n,Wn,„ftype‟)中,当ftype=high时,可设计高通滤波器。

格式:

b=fir1(n,Wn,„high‟) (3) 采用汉明窗设计带通FIR滤波器

在b=fir1(n,Wn)中,当Wn=[ W1 W2 ]时,可得到带通滤波器,其通带为W1

格式:

b=fir1(n,[ W1 W2 ]) (4) 采用汉明窗设计带阻FIR滤波器

在b=fir1(n,Wn,„ftype‟)中,当ftype= stop,Wn=[ W1 W2 ]时,fir1函数可得到带阻滤波器。 格式:

b=fir1(n,[ W1 W2 ],„stop‟) 【例1】 采用Hamming窗设计一个48阶FIR带通滤波器,通带为0.35 < w < 0.65。 采用fir1函数的程序格式:

b=fir1( 48,[ 0.35 0.65 ]); freqz(b,1,512) 【例2】设计一个FIR高通滤波器,使其具有30dB波纹的Chebyshev窗,其阶数为34,截止频率为0.48。

解:采用fir1函数设计高通滤波器的程序格式为 Window = chebwin(35,30);

b=fir1( 34,0.48,„high‟,Window) ; freqz(b,1,512) 注意:用fir1函数设计高通和带阻滤波器时,所使用的阶数n应为偶数,当输入的阶数n为奇数时,fir1函数会自动将阶数增加1形成偶数。 2. fir2函数

用来设计有任意频率响应的各种加窗FIR滤波器。 语法:

b=fir2(n,f,m)

b=fir2(n,f,m,Window) b=fir2(n,f,m,npt)

b=fir2(n,f,m,npt,Window) b=fir2(n,f,m,npt,lap)

b=fir2(n,f,m,nptt,lap,Window) 说明:

22

参数n为滤波器的阶数;

参数f为频率点矢量,且f[0,1],f=1对应于0.5fs。矢量f按升序排列,且第一个元素必须为0,最后一个必须为1,并可以包含重复的频率点;

参数m为幅度点矢量,在矢量m中包含了与f相对应的期望得到滤波器幅度;

参数Window用来指定所使用的窗函数类型,其默认值为汉明(Hamming)窗;

参数npt用来指定fir2函数对频率响应进行内插的点数;

参数lap用来指定fir2函数在重复频率点附近插入的区域大小。

【例3】 设计一个31阶的低通FIR滤波器,其截止频率为0.6。

解:采用fir2函数的程序格式:

在MATLAB 的命令窗口输入一下指令 f = [ 0 0.6 0.6 1 ]; m = [ 1 1 0 0 ]; b=fir2(29,f,m)

会得到下面的结果: b = Columns 1 through 10 0.0000 0.0017 -0.0016 -0.0023 0.0059 -0.0001 -0.0127 0.0112 0.0151 -0.0337 Columns 11 through 20 0.0003 0.0634 -0.0569 -0.0893 0.2996 0.5996 0.2996 -0.0893 -0.0569 0.0634 Columns 21 through 30 0.0003 -0.0337 0.0151 0.0112 -0.0127 -0.0001 0.0059 -0.0023 -0.0016 0.0017 Column 31 0.0000

四、实验组织运行要求

教师简单讲解,学生调试程序,教师辅导

五、实验条件

安装NATLAB和CCS的电脑一台

六、实验步骤

实验步骤同实验一: 请大家输入以下程序:

.title “fir.asm” .mmregs .def start h .usect "h",31

23

y .usect "y",1 xn .usect "xn",31 x1 .usect "x1",1 PA2 .set 2 PA1 .set 1 .data table: .word 0*32768/10000, 17 *32768/10000 .word -16*32768/10000, -23*32768/10000 .word 59*32768/10000 , -1*32768/10000 .word -127*32768/10000,112*32768/10000 .word 151*32768/10000,-337*32768/10000 .word 3*32768/10000 ,634*32768/10000 .word -569*32768/10000,-893*32768/10000 .word 2996*32768/10000 , 5996*32768/10000 .word 2996*32768/10000 , -893*32768/10000 .word -569*32768/10000 , 634*32768/10000 .word 3*32768/10000, -337*32768/10000 .word 151*32768/10000, 112*32768/10000 .word -127*32768/10000, -1*32768/10000 .word 59*32768/10000 , -23*32768/10000 .word -16*32768/10000, 17*32768/10000 .text start: SSBX FRCT STM #h,AR1; RPT #30 MVPD #table,*AR1+ STM #xn,AR2 RPTZ A,#30 STL A,*AR2+ STM #xn+30,AR3 STM #h+30,AR4 STM #31,BK STM -1,AR0 LD #x1,DP PORTR PA1,@x1 LD @x1,A LD #xn,DP STL A,@xn FIR: RPTZ A,#30 MAC *AR3+0%,*AR4+0%,A STH A,@y PORTW @y,PA2 PORTR PA1,@x1 LD @x1,A 24

STL A,*AR3+0% B FIR .end 假如已经从端口PA1读到的数据,放在IN.dat文件中,经过滤波后,从端口输出的数据放在OUT.dat中. IN.dat文件中的内容如下: 1651 1 bf 0 0 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 其余略

OUT.dat文件为空白. 首先将生成的*.out 文件加载入系统中,在反汇编窗口,设置探测点,如下:

图5-1 输入数据加载断点设置

然后在FILE菜单中选择出数据、加载到输入、输出断口。

最后观察滤波前后的频谱图分别如下:

功能,会弹出如下对话框,可以分别将输入数据输 25

七、思考题

试用此参数设计一个高通滤波器,并用DSP实现。

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

26

实验六:IIR数字滤波器

实验学时:2 实验类型:设计

实验要求:选修

一、实验目的

了解IIR滤波器的原理及使用方法

了解使用MATLAB语言设计IIT滤波器的方法

掌握DSP对IIR对滤波器的设计及编程方法

熟悉在CCS环境下对IIR滤波器的调试方法

二、实验内容

要求设计一个采样频率为1200Hz,截止频率为200Hz的高通滤波器. 输入信号频率为100Hz和300Hz的合成信号,目的是同过所设计的滤波器的将100Hz的信号滤除掉,余下300Hz的信号成分,达到滤波效果.

三、实验原理、方法和手段

IIR数字滤波器的输入x(k)和输出y(k)的关系可以用如下常系数线性差分方程及其Z变换描述,即

y(k)= (6-1) bx(ki)ay(ki)i0Mii1Ni

系统的传递函数为

b0b1z...bnz H(Z)= (6-2)

1N1a1z1...anzM

四、实验组织运行要求

教师简单讲解,学生调试程序,教师全程辅导

五、实验条件

安装CCS和MATLAB的电脑一台

六、实验步骤

1、 MATLAB的滤波器设计

在MATLAB中使用滤波器设计工具箱(FDA)来设计滤波器,首先打开MATLAB,在命令窗口输 27

入FDAtool, 将出现滤波器设计工具箱. 下图是打开的滤波器设计的主要界面,通过输入有关参数可以设计各种滤波器,包括滤波器的类型,阶数,截止频率(Fpass),带宽,纹波系数(Apass),采样频率(Fs) 等有关参数.

6-1 MAILAB设计IIR滤波器界面

上图所设计是IIR型的3阶契比雪夫1型高通滤波器的采样频率为1200Hz,截止频率为200Hz,图中中间显示的是数据为设计好的滤波器的参数. 通过这个工具箱可以观察滤波器的频率特性,冲激响应特性,阶跃响应,零极点示意图

2、 用MATLAB 产生输入信号: t=(1:256)/1200; x=32768*(sin(2*pi*100*t)+sin(2*pi*300*t))/2 此时会产生如下结果: x = 1.0e+004 * 28

Columns 1 through 12 2.4576 1.4189 0 1.4189 2.4576 0 -2.4576 -1.4189 0 -1.4189 -2.4576 -0 (会产生256点周期为12的输入信号,因此在此只给出一个周期的输入信号)

3、滤波器的汇编语言设计: 在编写滤波器之前,首先确定滤波器的参数,从上面的设计中得出滤波器的系数,为了防止小数运算的溢出,将各个系数除以8,得到新的数据: 分子:0.04045,-0.1213375,0.1213375,-0.04045 分母:1 ,-0.1151875,0.080275,0.080275,-0.0030875 针对以上参数,编写汇编语言如下: .mmregs .ref filter_start .def _main ;定义主函数入口 K_DATA_SIZE .set 256 ;定义数据个数 K_BUFFER_SIZE .set 8 K_STACK_SIZE .set 256 ;堆栈大小

K_A .set 3 ;A的个数 K_B .set 4 ;B的个数 K_CIR .set K_BUFFER_SIZE STACK .usect "stack",K_STACK_SIZE SYSTEM_STACK .set K_STACK_SIZE+STACK DATA_DP .usect "filter_vars",0 filterdata .usect "filter_vars",K_DATA_SIZE bufferdatay .usect "filter_vars",K_BUFFER_SIZE*2 bufferdatax .usect "filter_vars",K_BUFFER_SIZE*2 .data .global inputdata inputdata .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0

.word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0

29

.word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189,24576,0,-24576,-14189,0,-14189,-24576,0 .word 24576,14189,0,14189 .text .asg AR2,ORIGIN .asg AR3,INPUT .asg AR4,FILTER .asg AR5,OUTPUT _main: SSBX FRCT SSBX INTM LD #DATA_DP,DP STM #STACK,SP CALL filter_start NOP NOP NOP loop B loop

.def b1,b2,b3,b4,a1,a2,a3 .def filter_start b1 .set 052dh b2 .set -0f87h b3 .set 0f87h b4 .set -052dh a1 .set -0ebeh a2 .set 0a46h a3 .set -0065h

.text filter_start STM #inputdata,ORIGIN STM #bufferdatax,INPUT STM #bufferdatay,FILTER STM #filterdata,OUTPUT

STM #K_DATA_SIZE-3-1,BRC 30 STM #K_CIR,BK STM #1, AR0 RPTB filter_end-1 MVDD *ORIGIN+,*INPUT RPT #K_B-1-1 MAR *INPUT-0% MPY *INPUT+0%,#b4,B LD B,A MPY *INPUT+0%,#b3,B ADD B,A MPY *INPUT+0%,#b2,B ADD B,A MPY *INPUT+0%,#b1,B ADD B,A MPY *FILTER+0%,#a3,B ADD B,A MPY *FILTER+0%,#a2,B ADD B,A MPY *FILTER+0%,#a1,B ADD B,A STH A,*FILTER-0% STH A,*OUTPUT+ MAR *FILTER-0% filter_end: NOP RET .end

其*.CMD命令文件如下:

iir.obj -o iir.out -m iir.map -e _main MEMORY { PAGE 0: PARAM: org=3000h,len=4000h PAGE 1: DARAM: org=100h,len=4000h } SECTIONS

31

{ .text :> PARAM PAGE 0 stack :> DARAM PAGE 1 filter :> DARAM PAGE 1 .bss :> DARAM PAGE 1 .data :> DARAM PAGE 1 } 编译,调试程序,生成了执行文件*.out,然后载入*.out文件,运行. 4) 运行后,观察输入数据的时域和频域的波形如下:

图 6-2 滤波前信号的时域图

32

图 6-3 滤波前信号的频域图

图 6-4 滤波后信号的时域图

图 6-5 滤波后信号的频域图

33

七、思考题

试设计一个低通滤波器,滤除300Hz的信号.其它要求同实验

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

34

实验七:图象的伽玛增强

实验学时:2 实验类型:设计

实验要求:选修

一、实验目的

了解伽玛(Gamma)矫正的原理

掌握如何从文件读入数据到内存

掌握在CCS下图象的 输入和输出

二、实验内容

本实验要求对一个已经准备好的图象能够进行伽玛矫正,γ值为1.54,设计一个程序,用查表的方式对图象进行矫正,比较伽玛矫正前后的效果.

三、实验原理、方法和手段

伽玛矫正实质上就是矫正亮度,在灰度图中就是灰度矫正.这个过程是简单的,不需要实时处理.可以通过查表来进行,创建一个查找需要用的空间很少.伽玛矫正的计量单位用γ(γ通常是大于1)表示.如果灰度Iin的值介于0和255之间,伽玛矫正公式为: Iout=(Iin/max gray)1/ γ*max gray (7-1)

max gray=255; 此表可用MATLAB先计算好.

四、实验组织运行要求

教师简单讲解,学生调试程序,教师全程辅导

五、实验条件

安装CCS和MATLAB的电脑一台

六、实验步骤

项目的编译步骤如前所述,在此不多讲了; 1.向工程添加以下两个源程序 1) gamma.c 源程序如下: #include #include #define TRUE 1 35

#define FALSE 0 #define BUFSIZE 4096 /* the buffer size is 64*64=4096 */ /* Global declarations */ int in_buffer[BUFSIZE]; /* processing data buffers */ int out_buffer[BUFSIZE]; /* Functions */ static int gamma(int *input, int *output); static void dataIO(void); /* Functions */ static int gamma(int *input, int *output); static void dataIO(void); void main() { int *input = &in_buffer[0]; int *output = &out_buffer[0]; puts("the 3rd experiment started "); /* loop forever */ while(TRUE) { /* * Read input data using a probe-point connected to a host file. * Write output data to a graph connected through a probe-point. */ // read the input image data. dataIO();

puts("processing "); /* Processing Gamma Calibration*/ gamma(input, output);

// write the output image. // the output file is result.dat. dataIO(); } } /* ======== processing gamma calibration======== * * FUNCTION: apply gamma calibration to enhance the brightness of dark are in an image. * * PARAMETERS: address of input and output buffers. * * RETURN VALUE: TRUE. */ static int gamma(int *input, int *output) { int i; 36

/* the given gamma value is 0.65.*/ /* please try other gamma values. */ int LUT[256]={0, 7, 11, 14, 17, 20, 22, 25, 27, 29, 31, 33, 35, 37, 39, 40, 42, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 63, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98,100,101,102, 103,104,105, 106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121, 122,123,124,125,126,127,128,129,130,131,131,132,133,134,135, 136,137,138,139,140,141,141,142,143,144,145,146,147,148,149, 149,150,151,152,153,154,155,155,156,157,158,159,160,160,161, 162,163,164,165,165,166,167,168,169,169,170,171,172,173,173, 174,175,176,177,177,178,179,180,181,181,182,183,184,185,185, 186,187,188,188,189,190,191,191,192,193,194,194,195,196,197, 197,198,199,200,200,201,202,203,203,204,205,206,206,207, 208,208,209,210,211,211,212,213,213,214,215,216,216,217,218, 218,219,220,221,221,222,223,223,224,225,225,226,227,228, 228,229,230,230,231,232,232,233,234,234,235,236,236,237, 238,238,239,240,240,241,242,242,243,244,244,245,246,246, 247,248,248,249,250,250,251,252,252,253,254,254,255}; /*replace the brightness with a calibrated value.*/ for(i=0;i

return; }

37

2) 其CMD文件如下: -m volume.map MEMORY { PAGE 0: EPROG: origin = 0x3000, len = 0x1000 VECT: origin = 0xff80, len = 0x80 PAGE 1: USERREGS: origin = 0x60, len = 0x1c BIOSREGS: origin = 0x7c, len = 0x4 IDATA: origin = 0x80, len = 0x2f80 } SECTIONS { .vectors: {} > VECT PAGE 0 .sysregs: {} > BIOSREGS PAGE 1 .trcinit: {} > EPROG PAGE 0 .gblinit: {} > EPROG PAGE 0 frt: {} > EPROG PAGE 0 .text: {} > EPROG PAGE 0 .cinit: {} > EPROG PAGE 0 .pinit: {} > EPROG PAGE 0 .sysinit: {} > EPROG PAGE 0 .bss: {} > IDATA PAGE 1 .far: {} > IDATA PAGE 1 .const: {} > IDATA PAGE 1 .switch: {} > IDATA PAGE 1 .sysmem: {} > IDATA PAGE 1 .cio: {} > IDATA PAGE 1 .MEM$obj: {} > IDATA PAGE 1 .sysheap: {} > IDATA PAGE 1 .stack: {} > IDATA PAGE 1 } 同时将ti:c5400ctgtoolslib目录下的rts.lib文件加到工程下,给文件是C语言开发的DSP应用程序的运行支持库. 3. 编译,链接和运行程序

编译成功后,可以通过View_Watch Windows,或者单击工具栏上的窗口

图标.选择观测 38

图7-1,观测到的向量 4.将要校正的图象从文件读入到内存:

1) 执行菜单命令File_Data_Load,将打开如图所示的对话框,将要校正的图象tire.dat读入到内存.

图7-2 读图第一步

点击‟打开‟,将会出现如下一个对话框:

图7-3 读图第二步

由前图知道in-buffer(校正前的图片在内存中定义的地址)为0x00A5,长度为4096即0x1000, 5. 显示校正前和校正后的图象

39

程序运行后执行View_Graph下的Image命令

图7-4 读图设置图

图7-5 校正之前的图

图7-6 校正之后的图

40

七、思考题

图形增强还有什么算法?如何实现?

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

41

实验八:FIR数字滤波器

实验学时:2 实验类型:设计

实验要求:选修

一、实验目的

了解FFT的原理和算法

掌握DSP中FFT的设计和编程方法

熟悉FFT的调试方法

二、实验内容

本实验要求使用FFT变换求一个时域的频域特定,并从这个频域求出该信号的频率值,然后使用DSP汇编语言实现对FFT的DSP的编程.

三、实验原理、方法和手段

1、FFT基本数学理论

对于有限长的离散数字信号{x(n)},0≦n≦N-1,它的频谱数学值{X(n)}可由离散傅氏变换(DTF)求得.DTF定义为: X(k)= k=0,1,…..N-1 (8-1) x(n)ej(2/N)nkn0n1

令WM=e-j(2∏/N)nk 然而对于相当大的N值(比如1024)来说,直接计算它的DFT所需要的计算量很大.因此我们采用优化的FFT算法,它是一个组合以后的算法,原始的2N个点的实输入序列组合为一个N点的复序列,然后对复序列进行N点的FFT,最后再将N点复数输出拆分为2N点的 复数序列,这2N点的复数序列与原始的2N点实数输入序列是一致。

FFT的基本思想是:将原来的N点序列分为较短的序列,这些序列的DFT可以简单的组合起来得到原来的DFT。例如,若N为偶数,将原有的N点序列分为两个(N/2)点的序列,那么计算N点的DFT将需要约(N/2)*2=N/2,是直接采用DFT运算量的一半。上述方法反复使用,在组合和拆分的操作中,FFT的算法量均减半。

2、FFT算法 1) 码位倒置

42

2

2 FFT的码位倒置实际上是将输入的数据进行位倒序,以便在输出时候得到正确的序列,以N=8 为例说明位倒序的原理。舍输入的序列为x[n], N=8,其自然序列为:0,1,2,3,4,5,6,7。其一次按奇偶分开,得到两组M/2点的DFT,其序号为:

0,2,4,6| 1,3,5,7,对每一组再看奇偶分开,得到: 0,4|2,6|1,5|3,7 对于这种运算,我们可以采用DSP的间接寻址的位倒序寻址来实现。 2) W因子的生成和分布规律

在FFT中,乘法主要来自旋转因子,因为W=cos(2πr/N)-jsin(2πr/N), 所以在对W

r

r相乘时,必须产生相应的正,余弦函数。在编程序时候,正,余弦函数产生的方法一般有两种:一种是在每一步直接产生,另一种是在程序开始前预先计算出来将W,将r=0,1,….N-1这N个独立的值存放在数组中,等于直接建立一个表,在程序执行的过程中,可直接查表得到,提高运算速度,但要占用更多的内存。 W的一般规律为:

r

r在第m级: ,r=0,1,2,…….2 2m1wrm

四、实验组织运行要求

教师简单讲解,学生调试程序,教师全程辅导

五、实验条件

安装CCS和MATLAB的电脑一台

六、实验步骤

1 主函数 (文件名为*.asm) 从主函数中可以看出FFT的基本过程和步骤,以及码位倒置,产生三角因子,碟形运算和计算功率谱密度。

.title "zxy_fft5k_program" .mmregs .global _c_int00 .include "vc54xnt.h" .include "cfft256coff.h" .include "cfft256fn.h" STACK .usect "stack",stack_size SYSTEM_STACK .set STACK+stack_size .sect "vectors" reset: BD _c_int00 STM #SYSTEM_STACK,SP .space 31*4*16 .text 43

_c_int00: NOP CALL c54x_init ; Initialize CPU and clear A and B CALL bit_rev ;Here AR7 --> fft_data , others is free

NOP

CALL fft_task

NOP

CALL power

NOP main_start:

B main_start .end 2 初始化CPU ;文件名为: vc54xnt.h stack_size .set 200h K_FFT_SIZE .set 256

.text c54x_init: ;CPU initialize ;

STM #0b,CLKMD ;TstStatu: LDM CLKMD,A ;Switch to DIV mode ;

AND #01b,A ;

BC TstStatu,ANEQ

STM #9FF7h,CLKMD ;CPU Clock Feg.:100MHz

STM #00A0h,PMST

STM #8FFFh,SWWSR ;IO wait for 7 clk

STM #8802h,BSCR ;Clockout=50MHz

LD #0h,DP ;Data Page Points at NO. 0

LD #0h,A

LD #0h,B

RET

3.cfft256coff.h 函数

cfft256coff.h 函数包括输入的数据和FFT要用到的各种参数的定义,其中 w11112w4w8w16w111132w64w128w256分别为L =cosw12(2π/2)-jsin(2π/2)=-1-j0 =cosw14(2π/4)-jsin(2π/4)=0-j =cosw18(2π/8)-jsin(2π/8)=0.707-j0.707 =cosw116(2π/16)-jsin(2π/16)=0.9239-j0.3827 =cosw132(2π/32)-jsin(2π/32)=0.9808-j0.1951 =cosw164(2π/64)-jsin(2π/64)=0.9952-j0.0980 44

分别,

w =cos(2π/256)-jsin(2π/256)=0.9997-j0.0246 w =cos(2π/128)-jsin(2π/128)=0.9988-j0.0491 12812561 将上述系数分别乘以32768得到DSP的Q15格式的小数.

要进行FFT变换的数据是一个周期内采样20个点的正弦信号,共采集 了256点。

4. cfft256fn.h函数

此头文件里包含位码倒置,计算功率谱密度、FFT碟形运算三个子程序。

以上2个程序太长,因此在这里不显示,大家可以在课程论坛里下载这两个程序。 5. Cmd 文件

/* Filename:cfft256.cmd*/ -m cfft256.map MEMORY { PAGE 0: PM0: o=0x80 , l=0x80 PM1: o=0x100 , l=0x1000 PAGE 1: DM0: o=0x2000 , l=0x2000 } SECTIONS { vectors: PAGE 0 load=PM0 .text: PAGE 0 load=PM1 .data: PAGE 1 load=DM0

45

图8-1 观察图形设置对话框 .bss : PAGE 1 load=DM0 .bss : PAGE 1 load=DM0 stack: PAGE 1 load=DM0 } 6.观察程序运行结果

观察输入数据的波形和频谱

观察图形首先对对话框做如图8-1所示的设置。

图8-2 输入信号的波形和频谱图 2 察看位码倒置后的图形:

点击View-Disassembly,在Disassembly窗口点右键,选择start_address,输入bit_rev_end,在它的下一条语句设置断点然后执行Debug_restart.然后观察位码倒置后的波形。如图8-3所示

3 观察进行FFT变换后的波形如图8-4所示

如果将上图的Dsplay Type栏中该为FFT Magnitude,就等于作了依次FFT反变换,得到如图所示的结果. 如图8-5所示

46

图8-3 位倒码以后的波形图

图8-4 FFT以后的波形图

47

图8-5 FFT变换后的频谱图

七、思考题

探测点有何作用?如何设置探测点?

八、实验报告

要求学生按本实验指导书后附的实验报告格式和要求的内容写出实验报告,实验报告应包括实验预习、实验记录和实验报告等三部分内容。

九、其它说明

1. 学生实验时,应严格准守实验室规则、安全制度和学生实验守则;

2. 认真学习实验操作技能,严格按指导书和实验指导教师的指导操作有关规仪器设备,不要做与本实验无关的事情;

3. 做好实验预习、实验记录,并按要求按时完成实验报告。

48

实验九:控制XF引脚周期性变化

实验学时:2 实验类型:设计

实验要求:选修

一、实验目的

学习定时器的初始化步骤

掌握定时中断原理和中断调用的流程

掌握中断向量表的设置

二、实验内容

本实验要求利用中断系统和定时期设计一个周期为2ms的方波,并通过CCS图像观测器观测出来。

三、实验原理、方法和手段

中断是由外部设备向CPU传送数据,或者由外部设备向CPU提出数据产生的。具体是指当某个事件发生时,暂停当前的操作,转向中断服务程序,执行完后再返回继续原来的操作。这使得DSP能够处理多个任务。CPU执行中断服务程序(ISR)步骤如下: 1 保护现场,将PC值压入栈顶;

2 载入中断矢量表,将中断矢量表地址送入PC; 3执行中断矢量表,程序将进入ISR入口; 4 执行ISR,直至遇到返回指令; 5 回复现场,将栈顶值返回PC; 6 继续主程序。

定时器初始化初始化步骤: 1 关闭定时期,TCR中的TSS=1。 2 加载PRD。

3 启动定时器,初始化TDDR,TSS=0,TBB=1。 4 打开可屏蔽中断.

四、实验组织运行要求

教师简单讲解,学生调试程序,教师全程辅导

五、实验条件

49

第四篇:“DSP 技 术”实验教学改革与研究

要: 针对“DSP技术”课程理论难度大、抽象、不容易理解等特点,本文分析了一些实验教学方法,包括加大综合性设计性实验比重、课外选修实验和软硬件相结合的实验教学模式。实践证明,这些方法有利于培养学生的实践动手能力和创新能力,提高教学质量。

关键词: DSP技术

实验教学

软硬件结合

一、相关课程背景

“DSP技术”实验课开设的目的是使学生掌握DSP系统的基本原理及其项目设计的开发方法,掌握DSP的工作原理、TMS320C55X系列DSP芯片的基本结构、片内外设、汇编语言、C语言程序设计、开发环境及其使用方法、常用数字信号处理算法的DSP实现及其在各种系统中的实际应用等[1]。通过实验,使学生掌握DSP方面的理论知识,提高分析问题和解决问题的能力,使学生有信心也有能力逐步适应本领域迅速发展的需要,进而有效培养学生的创新能力。

二、目前存在的问题

1.“DSP技术”课程总学时数有限,实验学时数过少,造成有些知识点讲解得不够深入。目前该门课程一共是45学时,实验为10学时。

2.大部分实验只采用CCS软件仿真查看结果的方式,学生对硬件的操作较少,对DSP硬件结构、硬件设计方法和流程一知半解。

三、实验教学改革方法

针对以上出现的问题,结合多年实践教学经验,我提出了一些提高“DSP技术”实验教学质量的方法。

1.增加实验项目数量,引入课外选修实验机制。由于学时有限,课内必须完成的实验学时数是10学时,有的理论知识点实验不能涵盖,学生理解起来有些困难。为了让学生多动手,课题组设计了20学时的课外实验,学生可以在课外时间来实验室做实验。实验室能开设的所有实验做成电子版实验讲义,该讲义包含详细的实验目的、实验要求、实验内容和实验条件等,学生可以自主选择做哪几个实验。这些资源都挂在网站上,学生可以自行下载。

2.合理调整综合性和设计性实验的比重,注重培养学生的创新能力。根据“DSP技术”实验大纲的要求,目前实验学时数是10学时,其中6学时是基础性实验,4学时是综合性和设计性实验。基础性实验过程相对简单,学生机械地做实验,实际操作能力和综合分析问题的能力没有提高。我们教研室经过多年努力,大力改革调整实验内容,适当增加综合设计性实验和创新性实验的比重。综合性实验是指实验内容涉及本课程的综合知识或与本课程相关课程知识的实验。

“DSP技术”理论课程开设时间安排在大三学年,这时学生已经学完“数字信号处理”、“数字电路”、“EDA原理”等相关课程,同时学习了用于软件仿真的C语言、MATLAB语言等,具备了开发信号处理系统的潜能。同时DSP技术涉及的知识非常广泛,新算法层出不穷,有关器件推陈出新。因此,可以说“DSP技术”实验课程是电子信息类本科生对所学知识的综合运用,要求学生从工程设计选题、方案设计、编程、信号仿真和工程设计DSP实现,完全由学生独立完成。综合性实验以学生为主体,能充分调动学生的主动性、积极性和创造性,激发学生的创新思维和创新意识,全面提高学生的创新实验能力。

3.硬件设计和软件仿真相结合,与DSP课程设计和毕业设计相结合,培养学生硬件电路设计能力和CCS的使用能力。给学生布置题目为“基于TMS320VC5509DSP最小系统设计”的大作业,要求学生从整体设计到各部分的具体实现都亲力亲为。通过设计DSP最小系统,使学生掌握DSP系统的设计流程、PCB原理图的设计、DSP硬件结构、基本电路的设计、硬件电路调试和CCS软件的使用等。通过设计DSP最小系统,有助于学生理解DSP芯片的基本结构、片内外设、DSP设计流程、基本方法、开发环境CCS的使用方法,提高学生的硬件设计能力、分析能力、实际动手能力和创新能力。同时,开设了基于DSP平台的课程设计和基于DSP平台的图像语音等相关内容的毕业设计[2],让部分学生集中一段时间花在DSP实验上。从应用角度出发,采用C语言和汇编语言混合编程,锻炼学生的实际工程开发能力,这样教学效果会更好。

4.开展课外科技活动。“DSP技术”课程是一门实践性很强的课程,为了培养学生的动手能力和创新能力,必须加强实践环节。但从目前的教学与实验学时来看,有些学生基本掌握了DSP的简单开发运用,但是还有一部分学生对DSP兴趣很浓厚,并不满足于现有的课堂教学。针对这类学生,我们可以开放DSP实验室,开展一些课外科技活动,给他们设计一些系统级的题目,或让他们参与到教师的科研项目中。以实践课题为主,开展实践训练,使部分学生能够对实际的DSP开发技术有较深入的研究。

四、结语

本文探索的一些实验教学方法能提高学生对理论的认识,能充分调动学生的求知欲望,激发学习“DSP技术”课程的兴趣,充分发挥学生的主体作用,提高教学质量,受到任课教师和学生的一致好评,使学生的动手能力和创新能力得到提高。

参考文献:

[1]赵洪亮,等.TMS320C55xDSP应用系统设计[M].北京:北京航空航天大学出版社,2010.

[2]洪波,等.基于创新理念的DSP课程实验教学研究[J].实验室研究与探索,2013,33(10):215-217.

第五篇:DSP课程设计报告 --DSP交通灯的控制与实现

院:物

院 课

程 :DSP 技术及应用

级 :321100 姓

名 :

号 : 111111111111111 指导教师 :

1.课程设计目的 2.课程设计正文

2.1 课程设计要求 2.2F2812原理图

2.3F2812系统环境结构实图 2.4设计原理 2.5设计结果 2.6心得体会

3.参考文献

4.此次课程设计的程序

1. 课程设计目的

这学期我们学习了《DSP》这一门课程,为了实现理论结合实践,锻炼我们的动手能力,我们针对这门课程进行的课程设计。通过这次的课程设计,更加深入的学习这门课程,掌握这门技术,加深对DSP控制器的原理的理解和掌握。利用DSP开发环境CCS C2000对源程序文件进行编译、链接、装载调试,以完成基本的DSP项目文件设计。

2. 课程设计正文 2.1 课程设计要求

⑴ 设计一个十字路口交通灯(带一个倒计时数码管),每个方向有三色(红、黄、绿)。

⑵ 实现交通灯双向车道红绿灯切换功能、交通灯全亮功能、数码管全亮功能。 ⑶ 保证每次切换倒计时20秒,在此时熄灭绿灯。

2.2 F2812原理图

2.3 F2812系统调试环境结构实物

图2.3 F2812系统调试环境实物结构

2.4设计原理

1.交通灯控制要求

利用 ICETEK-EDU 实验箱提供的设备,设计模拟实际生活中十字路口交通灯控制的程序。

要求如下:

-交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号

表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。

-计时显示:8×8 点阵显示两位计数,为倒计时,每秒改变计数显示。

-正常交通控制信号顺序:正常交通灯信号自动变换

(1)南北方向绿灯,东西红灯(20 秒)。

(2)南北方向绿灯闪烁。

(3)南北方向黄灯。

(4)南北方向红灯,东西方向黄灯。

(5)东西方向绿灯(20 秒)。

(6)东西方向绿灯闪烁。

(7)东西方向黄灯。

(8)返回(1)循环控制。

-紧急情况处理:模仿紧急情况(重要车队通过、急救车通过等)发生时,交通警察手动控制

(1)当任意方向通行剩余时间多于 10 秒,将时间改成 10 秒。

(2)正常变换到四面红灯(20 秒)。

(3)直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。 2.交通灯模拟

利用 ICETEK-CTR 上的一组发光二极管(共 12 只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。 3.计时显示

利用 ICETEK-CTR 上的发光二极管显示阵列模拟显示。 4.计时

使用 TMS320F2812DSP 片上定时器,定时产生时钟计数,再利用此计数对应具体时间。 5.紧急情况

利用 ICETEK-CTR 上键盘产生外中断,中断正常信号顺序,模拟突发情况。 6.程序设计

根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。这种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。

2.5.设计结果

程序可以完成交通灯功能,顺序循环工作。 在中断信号到来后,进入特殊过程:当前计时如果大于 10 改成 10,否则不变,等待状态切换;切换后进入四面禁行状态,计数 20 秒后返回断点后的通行(有两方向是绿灯)状态。 设计结果部分截图

2.6心得体会

两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,和同学们相互探讨,相互学习。在此次的课程设计中,主要资料的查阅和对电路图的总体设计,对电路的设计包括绘制电路原理图。由于平时在对本课程的学习中,没有注重系统的设计,故在设计电路原理图的过程中也遇到了各种各样的问题。但是,这些问题在跟同组的同学讨论和向老师请教后也得到了解决。由此可以得出,我对本门课程的掌握还是很不好,动手的能力还是很欠缺的。在今后的学习过程中不仅要注意对理念知识的掌握,而且还要培养自己的对手操作能力。最后在老师的辛勤的指导下,终于迎刃而解,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

3.参考文献

[1] 苏涛,蔺丽华,卢光跃.DSP实用技术.西安电子科技大学出版社.2002 [2] 赵红怡编.DSP技术与运用实例.2006.

4.此次课程设计的程序

#include "DSP281x_Device.h"

// DSP281x Headerfile Include File #include "DSP281x_Examples.h"

// DSP281x Examples Include File

void Delay(unsigned int nTime); void SetLEDArray1(int nNumber); // 修改显示内容 void RefreshLEDArray1();

// 刷新显示 interrupt void cpu_timer0_isr(void); interrupt void XINT2_isr(void); void EndICETEKCTR();

#define XINT2CR (*((unsigned int *)0x7071)) #define XNMICR (*((unsigned int *)0x7077)) #define T46uS 0x0d40 #define SCANCODE_0 0x70 #define SCANCODE_1 0x69 #define SCANCODE_2 0x72 #define SCANCODE_3 0x7A #define SCANCODE_4 0x6B #define SCANCODE_5 0x73 #define SCANCODE_6 0x74 #define SCANCODE_7 0x6C #define SCANCODE_8 0x75 #define SCANCODE_9 0x7D #define SCANCODE_Del 0x49 #define SCANCODE_Enter 0x5A #define SCANCODE_Plus 0x79 #define SCANCODE_Minus 0x7B #define SCANCODE_Mult 0x7C #define SCANCODE_Divid 0x4A #define SCANCODE_Num 0x77 #define CTRGR *(int *)0x108000 #define CTRLCDCMDR *(int *)0x108001 #define CTRKEY *(int *)0x108001 #define CTRLCDCR *(int *)0x108002 #define CTRCLKEY *(int *)0x108002 #define CTRLCDLCR *(int *)0x108003 #define CTRLCDRCR *(int *)0x108004 #define CTRLA *(int *)0x108005 #define CTRLR *(int *)0x108007

Uint16 var1 = 0; Uint16 var2 = 0; Uint16 var3 = 0; Uint16 test_count = 0; Uint16 Test_flag = 0; Uint16 Test_var = 0; Uint16 Test_status[32]; #define nStatusNSGreenEWRed 160 #define nStatusNSFlashEWRed 184 #define nStatusNSYellowEWRed 200 #define nStatusNSRedEWYellow 216 #define nStatusNSRedEWGreen 376 #define nStatusNSRedEWFlash 400 #define nStatusNSRedEWYellow1 416 #define nStatusNSYellowEWRed1 432 #define nTotalTime 448 #define nStatusHold 160

#define statusNSGreenEWRed 0 #define statusNSFlashEWRed 1 #define statusNSYellowEWRed 2 #define statusNSRedEWYellow 3 #define statusNSRedEWGreen 4 #define statusNSRedEWFlash 5 #define statusHold 6 int a=0; unsigned int uWork,nTimeCount,nTimeMS; unsigned int uLightStatusEW,uLightStatusSN; unsigned int bHold; unsigned char ledbuf[8],ledx[8]; unsigned char led[40]= { 0x7E,0x81,0x81,0x7E,0x00,0x02,0xFF,0x00, 0xE2,0x91,0x91,0x8E,0x42,0x89,0x89,0x76, 0x38,0x24,0x22,0xFF,0x4F,0x89,0x89,0x71, 0x7E,0x89,0x89,0x72,0x01,0xF1,0x09,0x07, 0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E };

void main(void) {

int nWork1,nWork2,nWork3,nWork4,k;

int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;

unsigned int nScanCode;

nTimeCount=0; bHold=0;

uLightStatusEW=uLightStatusSN=0;

nNowStatus=0; nOldStatus=1; nOldTimeCount=0;

//InitSysCtrl();//初始化cpu

InitPll(0x0);

DINT;//关中断

InitPieCtrl();//初始化pie寄存器

IER = 0x0000;//禁止所有的中断

IFR = 0x0000;

InitPieVectTable();//初始化pie中断向量表

EALLOW; // This is needed to write to EALLOW protected registers

PieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序

PieVectTable.XINT2 = &XINT2_isr;

EDIS;

// This is needed to disable write to EALLOW protected registers

//EALLOW; // This is needed to write to EALLOW protected registers

//PieVectTable.XINT2 = &XINT2_isr;

//EDIS;

// This is needed to disable write to EALLOW protected registers

CpuTimer0.RegsAddr = &CpuTimer0Regs; // Initialize timer period to maximum:

CpuTimer0Regs.PRD.all = 0xffff; //CpuTimer0Regs.PRDH.all = 0xffff; // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):

CpuTimer0Regs.TPR.all = 0xff09; CpuTimer0Regs.TIM.all = 0xffff; //CpuTimer0Regs.TIMH.all = 0xffff; CpuTimer0Regs.TPRH.all = 0; // Make sure timer is stopped: CpuTimer0Regs.TCR.bit.TSS = 1; CpuTimer0Regs.TCR.bit.SOFT = 1; CpuTimer0Regs.TCR.bit.FREE = 1; // Reload all counter register with period value: CpuTimer0Regs.TCR.bit.TRB = 1; CpuTimer0Regs.TCR.bit.TIE = 1; // Reset interrupt counters: CpuTimer0.InterruptCount = 0;

// Enable TINT0 in the PIE: Group 1 interrupt 7

PieCtrlRegs.PIEIER1.bit.INTx5 = 1;

PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

XINT2CR =0x1;/*打开管脚xint2外中断*/

//XNMICR=0x1;/*打开nmi中断*/ // Enable global Interrupts and higher priority real-time debug events:

EINT;

// Enable Global interrupt INTM

ERTM;

// Enable Global realtime interrupt DBGM

CTRGR=0; // 初始化ICETEK-CTR CTRGR=0x80; CTRGR=0; CTRLR=0; // 关闭东西方向的交通灯

CTRLR=0x40; // 关闭南北方向的交通灯

CTRLR=0x0c1; // 开启发光二极管显示阵列

for ( k=0;k<8;k++ ) {

ledbuf[k]=0x0ff; // 显示为空白

ledx[k]=(k<<4); // 生成显示列控制字 } k=CTRLCDCR; // 清除键盘缓冲区

StartCpuTimer0();//启动定时器0

// 根据计时器计数切换状态

// 根据状态设置计数和交通灯状态 while ( 1 )

{

if ( bHold && nNowStatus==statusHold )

{

if ( nTimeCount>=nStatusHold )

{

nNowStatus=nSaveStatus;

nTimeCount=nSaveTimeCount;

bHold=0;

}

}

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

else if ( nTimeCount

if ( nNowStatus==nOldStatus )

{

switch ( nNowStatus )

{

case statusNSFlashEWRed:

nWork1=nTimeCount-nStatusNSGreenEWRed;

nWork2=nStatusNSYellowEWRed-nStatusNSFlashEWRed;

nWork3=nWork2/3;

nWork4=nWork3/2;

if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )

uLightStatusSN=( (nWork1%nWork3)<=nWork4 )?(0x49):(0x40);

break;

case statusNSRedEWFlash:

nWork1=nTimeCount-nStatusNSRedEWGreen;

nWork2=nStatusNSRedEWYellow1-nStatusNSRedEWFlash;

nWork3=nWork2/3;

nWork4=nWork3/2;

if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )

uLightStatusEW=( (nWork1%nWork3)<=nWork4 )?(0x09):(0x00); break; case statusNSGreenEWRed: nWork1=nStatusNSGreenEWRed/20; if ( nWork1>0 ) {

nWork2=20-nTimeCount/nWork1;

if ( bHold )

{

if ( nWork2>10 )

{

nTimeCount=nWork1*10;

nWork2=10;

}

}

if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray1(nWork2);

} } break; case statusNSRedEWGreen: nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20; if ( nWork1>0 ) {

nWork2=20-(nTimeCount-nStatusNSRedEWYellow)/nWork1;

if ( bHold )

{

if ( nWork2>10 )

{

nTimeCount=nStatusNSRedEWYellow+nWork1*10;

nWork2=10;

}

}

if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray1(nWork2);

} } break; case statusHold:

nWork1=nStatusHold/20;

if ( nWork1>0 )

{

nWork2=20-nTimeCount/nWork1;

if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray1(nWork2);

}

}

break;

}

}

else

{

if ( bHold )

{

nSaveStatus=nNowStatus;

nSaveTimeCount=nTimeCount;

nNowStatus=statusHold;

nTimeCount=0;

if ( nSaveStatus==statusNSFlashEWRed nSaveStatus==statusNSYellowEWRed )

{

nSaveStatus=statusNSRedEWGreen;

nSaveTimeCount=nStatusNSRedEWYellow;

}

else if ( nSaveStatus==statusNSRedEWFlash nSaveStatus==statusNSRedEWYellow )

{

nSaveStatus=statusNSGreenEWRed;

nSaveTimeCount=0;

}

}

nOldStatus=nNowStatus;

switch ( nNowStatus )

{

case statusNSGreenEWRed:

uLightStatusEW=0x24; uLightStatusSN=0x49;

SetLEDArray1(20);

break;

case statusNSFlashEWRed:

uLightStatusEW=0x24; uLightStatusSN=0x49;

SetLEDArray1(0);

||

||

break;

case statusNSYellowEWRed:

uLightStatusEW=0x24; uLightStatusSN=0x52;

SetLEDArray1(20);

break;

case statusNSRedEWYellow:

uLightStatusEW=0x12; uLightStatusSN=0x64;

SetLEDArray1(20);

break;

case statusNSRedEWGreen:

uLightStatusEW=0x09; uLightStatusSN=0x64;

SetLEDArray1(20);

break;

case statusNSRedEWFlash:

uLightStatusEW=0x09; uLightStatusSN=0x64;

SetLEDArray1(0);

break;

case statusHold:

uLightStatusEW=0x24; uLightStatusSN=0x64;

SetLEDArray1(20);

break;

}

}

CTRLR=uLightStatusEW; CTRLR=uLightStatusSN; // 设置交通灯状态

RefreshLEDArray1(); // 刷新发光二极管显示

nScanCode=CTRKEY; // 读键盘扫描码

nScanCode&=0x0ff;

if ( nScanCode==SCANCODE_Enter ) break;

}

EndICETEKCTR(); exit(0); }

interrupt void cpu_timer0_isr(void) {

//CpuTimer0.InterruptCount++;

// Acknowledge this interrupt to receive more interrupts from group 1

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

CpuTimer0Regs.TCR.bit.TIF = 1;

CpuTimer0Regs.TCR.bit.TRB = 1;

nTimeMS++; if ( nTimeMS>=5 ) {

nTimeMS=0;

nTimeCount++;

nTimeCount%=nTotalTime; } }

interrupt void XINT2_isr(void) {

//StopCpuTimer0();

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

bHold=1;

//StartCpuTimer0(); }

void Delay(unsigned int nDelay) { int ii,jj,kk=0; for ( ii=0;ii

for ( jj=0;jj<64;jj++ )

{

kk++;

} } } // 设置发光二极管显示内容 void SetLEDArray1(int nNumber) { int i,k,kk,kkk;

kkk=nNumber;

k=kkk/10*4; kk=kkk%10*4; for ( i=0;i<4;i++ ) {

ledbuf[7-i]=~led[k+i];

ledbuf[3-i]=~led[kk+i]; } } void RefreshLEDArray1() { int i; for ( i=0;i<8;i++ ) {

CTRGR=ledx[i];

CTRLA=ledbuf[i]; } } void EndICETEKCTR() { int k; CTRLR=0;

CTRLR=0x40; CTRLR=0x0c0; k=CTRLCDCR; } // 关闭东西方向的交通灯 // 关闭南北方向的交通灯 // 关闭发光二极管显示阵列// 清除键盘缓冲区