dsp实验教案范文

2022-06-06

作为一位优秀的人民教师,就不得不需要编写教案,教案有助于顺利而有效地开展教学活动。优秀的教案都具备一些什么特点呢?下面是小编为大家收集的《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部分)

实验报告

级: 2012211127

名: 刘灿

号: 2012210732 期: 2015.4.10 一.实验题目

Hello World和LED 二.实验目的

熟悉平DSK6416开发台,掌握CCS软件的基本操作流程,达到熟练操作软、硬件系统开发、调试的目的。

三.实验任务及要求

1.任务

(1)在控制台中显示Hello World

运行程序后,在控制台显示Hello World (2)控制LED灯闪烁

FTP给出一个LED的程序模板,可以控制LED 0的闪烁。基于该模板,需要完成:

(a) 修改闪烁的频率;

(b) 通过写8bit数值到CPLD寄存器来控制LED,使得4个LED以200ms的频率同时打开和关闭。

2.要求

(1)实现基本功能且不出现任何错误

(2)基于原理实现多功能的扩展

四.组内分工

刘杰

程序代码的编写与调试

刘灿

建立工程以及目标系统的配置

五.实验内容及流程

1.实验内容

这次实验内容是显示hello world和控制LED灯的闪烁。由于是dsp的第一次实验,内容比较简单,主要还是在于熟悉ccs这个软件在进行dsp开发时的具体建立工程、配置文件、导入实验板和程序烧写调试的过程和步骤。

2.实验流程介绍

1.新建工程

(1)打开ccs后点击菜单中的“File->New->Project”,选择“CCS project”,然后进入下一个页面进行工程的命名。

(2)命名完成之后是选择工程的硬件平台,我们实验室所使用的实验板是DSK6416,它的芯片为C6000系列的TMS320C6416,所以在“Project Type”下拉框中选择“C6000”,其余选项默认即可。

(3)接下来是设置工程属性,在“Device Variant”下拉栏中选择“Generic devices-> Generic C64xx Device”,“Device Endianness”选择little,,其余保持默认值。

(4)然后工程模板选择“hello world”,就完成了工程的新建。

2.代码编译和链接

(1)添加源代码 (2)配置CSL库

将C6000的CSL库,存在本地PC机硬盘上,我们hello world工程的代码路径为C: icsl。在pll_led工程图标上单击右键,选择“Show Build Settings…”来设置编译属性,设置include options,单击新建,在对话框中输入“C: icslinclude”

(3)定义芯片型号:

在“predefine symbols”选项中输入芯片型号CHIP_6416 (4)指定链接库:

在工程属性的“C6000 Linker”的“File Search Path”选项中需要添加DSK6416和CSL6416这两个库,其路径分别为“c: idsk6414libdsk6414bsl.lib”和“c: icsllib_2xcsl6414.lib”

(5)添加cmd文件:

在工程路径下新建一个文本文件,将其后缀修改成.cmd,名称可随便修改,并且在文本文件中写入下列内容: -stack 0x400 -heap 0x400 保存并编译工程,生成“.out”文件。

3.软件调试

在工程中运行“New ->Target Configuration File”新建配置文件,命名为DSK6416_led.ccxml来完成CCS软件和板卡的连接。命名完后在配置文件Basic中Connection选择Spectrum digital DSK-EVM-eZdsp onboard USB Emulator,Device选择DSK6416,保存。然后进行调试,设置断点。最后将程序烧录到实验板中,检查实验结果。

六.源代码及注释

#include #include "dsk6416.h" #include "dsk6416_led.h" #include "dsk6416_dip.h" void main(void) {

printf("Hello World! ");

//控制台显示“hello world”

DSK6416_init();

//初始化LED和DIP

DSK6416_LED_init();

DSK6416_DIP_init();

while(1) {

if (DSK6416_DIP_get(3) == 0)

//开关3控制LED灯以200ms闪烁

{

DSK6416_LED_toggle(3);

DSK6416_waitusec(200000);

}

else if(DSK6416_DIP_get(2) == 0)

//开关2控制LED灯以100ms闪烁

{

DSK6416_LED_toggle(3);

DSK6416_waitusec(100000);

}

else if(DSK6416_DIP_get(1) == 0)

//开关1控制4个灯以200ms同时亮灭

{

DSK6416_rset(DSK6416_USER_REG, 0x0f);

DSK6416_waitusec(200000);

DSK6416_rset(DSK6416_USER_REG, 0x00);

DSK6416_waitusec(200000);

}

else if(DSK6416_DIP_get(0) == 0) //开关0控制4个灯循环亮灭,间隔200ms

{

for(int i=0;i<4;i++){

DSK6416_LED_toggle(i);

DSK6416_waitusec(200000); }

}

} }

七.实验结果

1.按照实验步骤进行操作后,实验控制台正常显示显示“Hello World”,如下图:

2.实验板上DIP 0~3开关控制的LED灯闪烁效果也符合程序预期的效果。

八.遇到的问题

由于第一次实验的内容较为简单,我们在编程方面没有遇到什么困难,工程的建立和系统的配置也能照着实验指导书按部就班的完成。但是在连接实验板时我们遇到了连接不上的问题。机房的电脑连接实验板后安装不了驱动,我们自己带的笔记本电脑也有没有反应的现象。后来我们换了同学的电脑才成功的连接上。

九.心得体会

第一次的实验总的来说比较容易,主要是对ccs这个软件的操作和建立工程的过程的熟悉。通过这次实验我对于这学期dsp实验的流程和步骤有了大体的了解,也熟悉了ccs的编程和调试,也为下次的实验打好了基础。

第四篇:“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; } // 关闭东西方向的交通灯 // 关闭南北方向的交通灯 // 关闭发光二极管显示阵列// 清除键盘缓冲区

上一篇:加油稿200字范文下一篇:整改方案格式范文