当前位置:文档之家› DSP实验指导书

DSP实验指导书

DSP实验指导书
DSP实验指导书

实验一 DSP教学实验系统与集成开发环境入门

一、实验目的

1、熟悉CCS集成开发环境,掌握工程的生成方法;

2、熟悉SEED-DTK BPD实验环境;

3、掌握CCS集成开发环境的调试方法;

4、了解数在计算过程中的定标,掌握数的定点、浮点表示方法,定点、浮点基

本运算以及定点、浮点间的相互转换。

二、实验设备(仪器)

计算机;DSP仿真器;SEED-DTK BPD型DSP实验箱

三、实验内容

1、DSP源文件的建立;

2、DSP程序工程文件的建立;

3、编译与链接的设置,生成可执行的DSP文件;

4、进行DSP程序的调试与改错;

5、学习使用CCS集成开发工具的调试工具;

6、观察实验结果;

四、实验步骤

1、打开CCS 集成开发环境,进入CCS的Simulator操作环境。

2、新建源文件

创建一个未知名的源文件编写源代码并保存

保存源程序名为DTK_BPD_MATH.c

创建其他源程序(如.cmd)可重复上述步骤

3、建立新工程,打开CCS,点击Project-->New,创建一个新工程工程名及路径可任意指定。这里新建一个名为DTK_BPD_MATH.pjt的工程,路径为

C:\tic2000\myprojects\DTK_BPD_MATH。

点击Project,选择add files to project,添加DTK_BPD_MATH.c、math.cmd、

rts2800_ml.lib 文件到工程中。在下面窗口中可以看到DTK_BPD_MATH.c、math.cmd、

rts2800_ml.lib文件已经加到工程文件中。

4、设置编译与连接选项

设置相应的编译参数,一般情况下,按默认值就可以。

设置连接顺序,注:当使用rts2800_ml.lib 时将其放在最后。

点击Project-->Build all,对工程进行编译,如正确则生成DTK_BPD_MATH.out;若是修改程序,可以使用Project->Build命令,进行编译连接,它只对修改部分做编译连接工作,可节省编译与连接的时间。编译通过,生成DTK_BPD_MATH.out文件。

5、点击File-->load program,载入debug文件夹下的可执行文件

DTK_BPD_MATH.out

点击Debug的Go Main回到C程序的入口,然后进入C程序的入口

设置断点、打开CPU 与外设寄存器的观察窗;

运行程序到第一个断点在STDout观察窗内看定点运算是否正确。然后再运行程序到第二个断点,观察浮点运算是否正确;再运行程序,观察浮点与定点之间的转换是否正确。

6、观察CPU寄存器、Memory、Graph

7、调试工具(debug)

在下拉菜单中可选择复位CPU、进入C 主程序、重新开始等操作。

以下操作将会在调试过程中经常用到:

F5——运行

F8——单步运行且进入子程序中

F9——设置断点

F10——单步运行。

Probe Points是一个对调试有相当帮助的工具,它允许CCS 更新观窗口并可以完成在程序的指定处(设置Probe Point处)将PC文件数据读到存贮器或将存贮器数据写入到PC 文件中。

8、在这个实验中,为了加深对CCS 的了解,分别在编译与链接过程中设置了的错误行。这些错误行都是在程序调试中经常遇到的。

1)源程序错误:

在函数fixed_add()中的z 的定义未加“;”号;

函数float_add()的{}号缺右边而未完整。

2)链接错误;

.text 分配的段名字错误,需要将H0RAM改成PH0RAM。

在进行此实验时,只有将上述的程序错误改正后才能正确的编译与链接。产生DTK_BPD_MATH.out。

五、预习要求

预习本讲义,并提交预习报告。

六、实验报告要求

对浮点和定点运算的实验结果运用DSP的工作原理进行分析。

实验二 DSP数字I/O控制实验

一、实验目的

1、熟悉CCS的开发环境;

2、掌握DSP扩展数字I/O口的方法;

3、了解SEED-DEC2812的硬件系统;

4、掌握交通灯逻辑在DSP中的实现。

二、实验设备(仪器)

计算机;DSP仿真器;SEED-DTK BPD型DSP实验箱

三、实验内容及原理

1、交通灯实现程序。

2、DSP系统中数字I/O的实现

在DSP系统中只有少量的数字I/O资源在一些的控制中经常需要大量的数字量的输入与输出。扩展外部I/O资源是非常有必要的。其实现方法有两种:其一是采用锁存器像74LS273、74lS373之类的集成电路;另一种是采用CPLD在其内部做锁存逻辑,我们采用后者。如图

3、扩展总线存储空间映射的数据空间

TMS320F2812为32位定点DSP,其外部存储器接口只支持16位、异步存储器访问,所以SEED-DEC2812上的存储器扩展总线只实现16位、异步存储器接口,其4 个存储空间CE0~CE3 映射到`F2812 的Zone2存储空间上,而F2812的Zone2 存储空间的大小只有512K 16位可以对外部访问。在此,我们采用分页技术将 4 个1M 16位的扩展总线存储空间CE0~CE3 映射到F2812 的512K 16-位Zone2 存储空间中。也即将4M 16-位的扩展总线存储空间分为8个512K 16-位的存储空间页,3 位页地址由扩展总线页地址寄存器(映射在Zone1 空间的0x00,4020,只写)产生,其控制位的

定义如下:

PA[21:20]:页地址高2 位,用于选择4 个1M 16-位扩展总线存储空间,复位为00

00:选择扩展总线的CE0空间

01:选择扩展总线的CE1空间

10:选择扩展总线的CE2空间

11:选择扩展总线的CE3空间

PA19:扩展总线存储空间的A19地址线,复位为0 外部总线上,需要CE3 作为片选信号,所以需要将CE3 空间映射到数据空间,才能对交通灯和led 灯端口进行操作。

四、实验步骤

1、实验的演示:

在脱机(不接CCS)的情况下,可以首先进行实验的演示。在实验选项的菜单下,选择数字I/O实验一项。选择不使用CCS,确定后,LCD显示屏将显示“程序装载中,请稍候”,并且用进度条显示程序装载进度,等待装载程序后,SEEDDEC2812单元的D3灯由闪烁变成常暗。LCD显示屏将显示“数字IO实验装载成功”。可按菜单操作,完成I/O实验的演示。

2、实验的调试:

1) 将DSP仿真器的JTAG插头与SEED-DEC2812单元的J1相连接;打开SEED-DTK BPD的电源。观察SEED-DTK_IO单元的+5V、+3.3V、+15V、-15V的电源指示灯是否均亮;若有不亮的,请断开电源,检查电源;JTAG接口绝对不允许热插拔。

2)点击工具栏按钮或选择Project→RebuildAll,CCS重新编译、汇编和连接工程中的所有文件,有关此过程的信息显示在窗口底部的信息框中。选择File→Load Program,选择刚重新编译过的程序DTK_BPD_IO.out并点击Open。CCS把程序加载到目标系统DSP上,并打开Dis Assembly窗口,显示反汇编指令。

3)点击工具栏按钮或选择Debug→Run。观看实验结果。通过实验箱上数字

I/O实验,可选择自动、手动、夜间;禁行、东西、南北等操作。另外,还可以通过Memory的值来改变其指示。选择View→Memory,在Address中输入交通灯控制口地址0X8000或LED控制口地址0X8002,单击OK。在Memory窗口中右键单击,Refresh Window刷新窗口,可看到相应的值不断的改变,双击改变的值,可在Edit Memory中更改其值,确认后,交通灯或LED灯改变原来的显示状态;在程序中改变延时时间,即可改变交通灯的变换时间。

注意:每次更改其值时,必须重新编译、装载程序!

数字I/O 实验主要完成的功能:

在此实验中,SEED-DEC2812 首选进行初始化,包括对外设UART、本身频率的设定及一些状态区的初始化。然后等待SEED-MMI5402 发送命令;SEED-DEC2812 响应交通灯自动模式、交通灯手动模式、交通灯东西通、交通灯南北通、及交通灯的禁行与夜间模式的操作命令。

五、预习要求

预习本讲义,并提交预习报告。

六、实验报告要求

通过本实验,完成交通灯与LED的控制,分析DSP的I/O硬件电路设计和相关程序。

部分源程序

#define EASTEWEST 0x861 /* 调整红、黄、绿灯的亮灭*/

#define SOUTHNORTH 0x30c

#define IOCHANGE 0x492

#define ALLFORBIN 0x924

#define SELECTCE3 0x6

#define SELECTCE0 0x0

for(;;)

{

if(data0save== TRAFFICAUTO)

{

/*白天模式*/

/*从东西到南北*/

iostatus = EASTEWEST;

*p_trafficaddr=iostatus; /*调整交通灯变换时间*/

delay(2000);

iostatus = IOCHANGE;

*p_trafficaddr=iostatus;

delay(1000);

iostatus = SOUTHNORTH;

*p_trafficaddr=iostatus;

delay(8000);

/*从南北到东西*/

iostatus = SOUTHNORTH;

*p_trafficaddr=iostatus;

delay(2000);

iostatus = IOCHANGE;

*p_trafficaddr=iostatus;

delay(1000);

iostatus = EASTEWEST;

*p_trafficaddr=iostatus;

delay(8000);

}

if(data0save==TRAFFICNIGHT)

{

iostatus = IOCHANGE;

*p_trafficaddr=iostatus;

delay(6000);

iostatus = 0;

*p_trafficaddr=iostatus;

delay(6000); }

实验三 DSP定时器实验

一、实验目的

1、了解DSP 程序各段的含义;

2、了解串行通讯的过程;

3、掌握长时间间隔的定时器的处理;

4、掌握片内外设的设置方法。

二、实验设备(仪器)

计算机;DSP 仿真器;SEED-DTK BPD型DSP实验箱

三、实验内容及原理

1、DSP 的初始设置;

2、DSP 中断向量表的建立;

3、定时中断的编写;

4、中断方式异步串口程序

CPU定时器的原理框图

定时中断图

四、实验步骤

1、在脱机(不接CCS)的情况下,可以首先进行实验的演示。在实验选项的菜单

下,选择定时器实验一项。选择不使用CCS,确定后,LCD显示屏将显示“程序装载中,请稍候”,并且用进度条显示程序装载进度,等待装载程序后,SEEDDEC2812单元的D3灯由闪烁变成不亮。LCD显示屏将显示“定时器实验装载成功”。按菜单操作,完成定时器的演示。

2、仿真联机实验的调试:

1) 将DSP仿真器的JTAG插头与SEED-DEC2812单元的J1相连接;打开SEED-DTK BPD的电源。观察SEED-DTK_IO单元的+5V、+3.3V、+15V、-15V的电源指示灯是否均亮;若有不亮的,请断开电源,检查电源;JTAG接口绝对不允许热插拔。

2)将定时器源程序拷贝到“ti ”中的“my project” 文件夹中便将其属性中“只读”

去掉(若不去掉会造成以后程序编译时出现“错误”或“警告”提示)。点击桌面图标“?ccs2”之前,将通电的“仿真器”的USB口与计算机的USB口相联,此时可双击“…ccs2”图标打开软件若直接弹出“ccs: Parallel Debug Manager”图框则表示连接成功,否则连接失败(联机实验箱时要先联机后开电源,USB口与计算机联接时要先开电源后联机;在拔下时要先关电源后拔下)连接失败后要重新操作直到联接成功为止。

3)选择“OPEN”下的“Emulator”单击会弹出操作界面,选择左边“树”下的“projects”右键单击选择“my projects”下的定时器程序,通过“project”下的“Rebuild All”进行编译,编译结果若无“错误”与“警告”则可通过“File”下的“Load program”对程序进行下载;

4)对试验箱进行设置;运行程序;查看寄存器观察程序运行情况。

3、实验程序的分析:

1) DTK_BPD_TIMER.c:包含了以下功能:

① DSP的初始化。

②主程序流程。

主程序中断服务程序

主程序与定时器中断程序流程图

③异步串口的发送与接收子程序。 ④ 定时器的操作及中断服务程序。

2) DSP28_Sci.c :包含了异步串口初始化程序。

3) DSP28_DefaultIsr.c :包含了异步串口接收中断服务程序。

4) SRAM.cmd :声明了系统的存贮器配置与程序各段的链接关系。 5) DTK_BPD_TIMER.out :DSP 上可执行的程序,即实验程序。 定时器实验实现的功能如下:

程序运行后,经过DSP 与异步串口初始化后,系统等待主机的命令。当系统设置好当前的时间并发出启动定时器时,开始启动定时器。定时器的时间间隔为千分之一秒。每当定时器运行1000次,也就是一秒之后,DSP 向系统发送报时信息,传回当前的时间信息。系统在LCD 上显示当前的时间。下面的程序为部分核心程序,可根据注释对实际程序进行修改,观察修改后的变化。

段1

sw itch(precieve->Type)

{

case TIMESET:

for(i=0;i<3;i++)

timerset[i] = uart[i+1];

DINT;

ConfigCpuTimer(&CpuTimer2, 150, 1000000); 设置计时晶振周期……………….

………………

case…………

case…………..

段二

interrupt void ISRTimer2(void)

{

timerset[2]++;

if(timerset[2]>=60) //“分”进位循环周期

{

timerset[1]++;

timerset[2]=0;

}

if(timerset[1]>=60) //“时”进位循环周期

{

timerset[1]=0;

timerset[0]++;

}

if(timerset[0]>=24) //“天”进位循环周期

timerset[0]=0;

五、预习要求

预习本讲义,并提交预习报告。

六、实验报告要求

分析DSP中定时器寄存器的原理及使用方法,修改程序从而改变定时的周期,在报告中分析原因,并附带程序说明。

实验四直流电机调速开环系统的设计

一、实验目的

1、以TMS320F2812 DSP芯片为核心,通过硬件和软件的设计,应用事件管理器EVA产

生PWM脉冲,控制直流电机的正转、反转、停止和往复运行,最终来实现有刷直流电机的开环调速。

2、掌握TMS320C2812系列的主要性能——两个事件管理器EVA、EVB、16位通用定时

器、8个PWM通道的使用方法。

3、掌握并制作以L298为核心的直流电机驱动电路。

二、实验设备(仪器)

计算机;DSP仿真器;SEED-DTK BPD型DSP实验箱;自制L298驱动电路

三、实验内容

1、驱动电路的选择

(1)电路小巧,简单,控制频率符合设计任务要求;

(2)L298是一个多路、大功率的单块集成电路,他是一种高电压、大电流的双全桥驱动器,设计遵循TTL逻辑电平标准,驱动电感性负荷,如继电器、螺线形电导管和直流步进电机等。器件有两个使能端ENABLE A和ENABLE B控制独立的输入信号。每座桥的较低电晶体的发射极被连接在一起,而且相应的外部中断能够作为外部感应器件的连接。为防止逻辑工作在低电平,提供一个附加的补偿输入。

L298操作补偿电压可达46V;L298总电流达4A;L298低漏电压;L298过温保护;L298逻辑0输入电压达1.5V,防止高噪音干扰;

(3)以L298为核心的电机驱动电路原理图

实现电机控制列表

2、软件及控制算法的设计

在电机控制系统中,PWM信号控制功率开关器件的导通和关闭。为产生一个PWM信号,定时器需要重复按照PWM周期进行记数。比较寄存器用于保持调制值,比较寄存器中的值一直与定时器计数器的值相比较,当两个值匹配时,PWM输出就会产生跳变。当两个值产生第二次匹配或一个定时器周期结束时,就回产生第二次输出跳变。通过这种方式就会产生一个周期与比较寄存器值成比例的脉冲信号。在比较单元中重复完成计数、匹配输出的过程,就产生了PWM信号。程序流程图如下图所示

四、实验步骤

1、将DSP仿真器的JTAG插头与SEED-DEC2812单元的J1相连接;打开SEED-DTK BPD 的电源。观察SEED-DTK_IO单元的+5V、+3.3V、+15V、-15V的电源指示灯是否均亮;若有不亮的,请断开电源,检查电源;JTAG接口绝对不允许热插拔。

2、将定时器源程序拷贝到“ti ”中的“my project” 文件夹中便将其属性中“只读”去掉(若不去掉会造成以后程序编译时出现“错误”或“警告”提示)。点击桌面图标“?ccs2”之前,将通电的“仿真器”的USB口与计算机的USB口相联,此时可双击“…ccs2”图标打开软件若直接弹出“ccs: Parallel Debug Manager”图框则表示连接成功,否则连接失败(联机实验箱时要先联机后开电源,USB口与计算机联接时要先开电源后联机;在拔下时要先关电源后拔下)连接失败后要重新操作直到联接成功为止。

3、在CCS环境中引入程序,编译程序,选择Rebuild All,并装载到DSP中。点击RUN 运行。观察电机运行状况。用示波器观察PWM波形,频率和占空比。调试过程如下:设定周期寄存器值EvaRegs.T1PR = 0x9000,可以设置PWM波形的周期;改变EvaRegs.CMPR1的值,可改变PWM的占空比。

源程序清单

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

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

// Prototype statements for functions found within this file.

void init_evaa(void); // 占空比100%(正转)

void init_eva(void); // 占空比70%(正转)

void init_eva1(void); // 占空比20% (反转)

void init_eva2(void); // 占空比40% (慢速反转)

void init_eva3(void); // 占空比6% (基本全速反转)

int i, j;

void main(void)

{

InitSysCtrl();

EALLOW;

GpioMuxRegs.GPAMUX.all = 0x00FF; // EV A PWM 1-6 pins

GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins

EDIS;

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

init_evaa(); //100%正转//为了为了使开始时70%正转效果明显,而开始时自设

100%正转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_eva(); //70%正转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_evaa(); //100%正转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_eva1(); //反转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_eva2(); //慢速反转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_eva3(); //全速反转

for(i=0; i<10000; i++) //延时5秒

{for(j=0; j<5000; j++);}

init_evaa(); //100%正转

for(;;);

}

void init_evaa() //100%正转

{

// EV A Configure T1PWM, T2PWM, PWM1-PWM6

// Initalize the timers

// Initalize EVA Timer1

EvaRegs.T1PR = 0x7200; // Timer1 period 设置周期EvaRegs.T1CMPR = 0x3c00; // Timer1 compare EvaRegs.T1CNT = 0x0000; // Timer1 counter

// TMODE = continuous up/down

// Timer enable

// Timer compare enable

EvaRegs.T1CON.all = 0x1042;

// Initalize EV A Timer2

EvaRegs.T2PR = 0x0FFF; // Timer2 period EvaRegs.T2CMPR = 0x03C0; // Timer2 compare EvaRegs.T2CNT = 0x0000; // Timer2 counter

// TMODE = continuous up/down

// Timer enable

// Timer compare enable

EvaRegs.T2CON.all = 0x1042;

// Setup T1PWM and T2PWM

// Drive T1/T2 PWM by compare logic

EvaRegs.GPTCONA.bit.TCMPOE = 1;

// Polarity of GP Timer 1 Compare = Active low EvaRegs.GPTCONA.bit.T1PIN = 1;

// Polarity of GP Timer 2 Compare = Active high EvaRegs.GPTCONA.bit.T2PIN = 2;

// Enable compare for PWM1-PWM6

EvaRegs.CMPR1 = 0x7100; // 占空比

EvaRegs.CMPR2 = 0x3C00;

EvaRegs.CMPR3 = 0xFC00;

// Compare action control. Action that takes place

// on a cmpare event

// output pin 1 CMPR1 - active high

// output pin 2 CMPR1 - active low

// output pin 3 CMPR2 - active high

// output pin 4 CMPR2 - active low

// output pin 5 CMPR3 - active high

// output pin 6 CMPR3 - active low

EvaRegs.ACTRA.all = 0x0666;

EvaRegs.DBTCONA.all = 0x0000; // Disable deadband https://www.doczj.com/doc/8017679627.html,CONA.all = 0xA600;

}

void init_eva() //70%正转

{

EvaRegs.T1PR = 0x7200; // Timer1 period 周期EvaRegs.T1CMPR = 0x7000; // Timer1 compare EvaRegs.T1CNT = 0x0000; // Timer1 counter EvaRegs.T1CON.all = 0x1042;

EvaRegs.T2PR = 0x0FFF; // Timer2 period EvaRegs.T2CMPR = 0x03C0; // Timer2 compare EvaRegs.T2CNT = 0x0000; // Timer2 counter EvaRegs.T2CON.all = 0x1042;

EvaRegs.GPTCONA.bit.TCMPOE = 1;

EvaRegs.GPTCONA.bit.T1PIN = 1;

EvaRegs.GPTCONA.bit.T2PIN = 2;

EvaRegs.CMPR1 = 0x50FF; //占空比EvaRegs.CMPR2 = 0x3C00;

EvaRegs.CMPR3 = 0xFC00;

EvaRegs.ACTRA.all = 0x0666;

EvaRegs.DBTCONA.all = 0x0000; // Disable deadband https://www.doczj.com/doc/8017679627.html,CONA.all = 0xA600;

}

void init_eva1() //82%反转

{

EvaRegs.T1PR = 0xFFFF; // Timer1 period 周期EvaRegs.T1CMPR = 0x3C00; // Timer1 compare

EvaRegs.T1CNT = 0x0000; // Timer1 counter

EvaRegs.T1CON.all = 0x1042;

EvaRegs.T2PR = 0x0FFF; // Timer2 period

EvaRegs.T2CMPR = 0x03C0; // Timer2 compare

EvaRegs.T2CNT = 0x0000; // Timer2 counter

EvaRegs.T2CON.all = 0x1042;

EvaRegs.GPTCONA.bit.TCMPOE = 1;

EvaRegs.GPTCONA.bit.T1PIN = 1;

EvaRegs.GPTCONA.bit.T2PIN = 2;

EvaRegs.CMPR1 = 0x4000; //占空比

EvaRegs.CMPR2 = 0x3C00;

EvaRegs.CMPR3 = 0xFC00;

EvaRegs.ACTRA.all = 0x0666;

EvaRegs.DBTCONA.all = 0x0000; // Disable deadband https://www.doczj.com/doc/8017679627.html,CONA.all = 0xA600;

}

void init_eva2() //慢速反转

{

EvaRegs.T1PR = 0xFF00; // Timer1 period 周期EvaRegs.T1CMPR = 0x3C00; // Timer1 compare

EvaRegs.T1CNT = 0x0000; // Timer1 counter

EvaRegs.T1CON.all = 0x1042;

EvaRegs.T2PR = 0x0FFF; // Timer2 period

EvaRegs.T2CMPR = 0x03C0; // Timer2 compare

EvaRegs.T2CNT = 0x0000; // Timer2 counter

EvaRegs.T2CON.all = 0x1042;

EvaRegs.GPTCONA.bit.TCMPOE = 1;

EvaRegs.GPTCONA.bit.T1PIN = 1;

EvaRegs.GPTCONA.bit.T2PIN = 2;

EvaRegs.CMPR1 = 0x5000; //占空比

EvaRegs.CMPR2 = 0x3C00;

EvaRegs.CMPR3 = 0xFC00;

EvaRegs.ACTRA.all = 0x0666;

EvaRegs.DBTCONA.all = 0x0000; // Disable deadband https://www.doczj.com/doc/8017679627.html,CONA.all = 0xA600;

}

void init_eva3() //全速反转

{

EvaRegs.T1PR = 0xffff; // Timer1 period 周期EvaRegs.T1CMPR = 0x3C00; // Timer1 compare

EvaRegs.T1CNT = 0x0000; // Timer1 counter

EvaRegs.T1CON.all = 0x1042;

相关主题
文本预览
相关文档 最新文档