您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页基于DSP的交通灯控制的设计

基于DSP的交通灯控制的设计

来源:纷纭教育


XXXXXX 电子信息工程学院

课程设计报告

交通灯综合控制

设计人: 专 班 学

业: 级: 号:

XXX

电子信息工程

电子班

指导教师:

二零一X年X月

精选文库

目 录

1 设计目的及要求 ......................................

1.1 设计目的 ......................................... 1.2 设计要求 .........................................

1.2.1 交通灯控制 ................................ 1.2.2 计时 ...................................... 1.2.3

紧急情况 ..................................

1.2.4 程序设计 ..................................2 设计原理及方案 .....................................2.1 课程设计总体方案 ................................2.1.1 设计思路 ..................................2.2 课程设计原理 .....................................2.2.1 系统工作原理 ...............................2.2.2 系统工作状态 ..............................3 硬件设计 ..........................................3.1 硬件总体设计 ..................................3.2 交通灯显示模块 ..............................3.3 计数显示模块 ..................................3.4 开关模块 ......................................4 软件设计 ...........................................4.1 程序流程 ......................................4.2 交通灯模拟显示 ................................4.3 定时器及中断设计 ..............................4.4 外中断设计 ....................................—

4 4 4

4 5

5 5 7

77 7

7 8

10

10 11 12 13

14

1515 16

2

14

5 系统调试 ........................................... 18 5.1 硬件调试 ......................................

18

5.1.1 电源调试 ..................................

18

5.1.2 Emulator 调试 ..............................

18

5.2 软件调试 ........................................

21

5.2.1 软件设计 .................................... 21

5.2.2 程序运行 .................................... 23

5.3 系统下载

......................................24

6 结论分析及体会 .....................................25

7 参考文献 ...........................................

26

— 精选文库

3

精选文库

1 设计目的及要求

1.1 设计目的

(1) 熟悉使用 ICETEK–F2812-AE 评估板控制 ICETEK-CTR上交通灯的方法。练习自主的设计,实现理论和实践的统一,提高

自我动手能力。

(2) 掌握 TMS320F2812DSP定时器的使用和编程。 (3) 掌握 TMS320F2812DSP外中断的使用和编程。 (4) 学习复杂控制程序设计思路。 (5) 利用 DSP开发环境 CCS

C2000对源程序文件进行编译、 链 DSP项目文件设计。

接、装载调试,以完成基本的

(6) 通过此次课程设计,学习 DSPF2812芯片的 I/O 端口控制方法,熟悉字模的简单构建和使用, 熟悉掌握在 DSP软硬件环境下的程序开发流程,达到学以致用的目的。

1.2 设计要求

1.2.1

交通灯控制要求:

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

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

对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通

— 4

精选文库

行,灯光闪烁表示信号即将改变。 计时显示: 8×8 点阵显示两

位计数,为倒计时,每秒改变计数显示。

正常交通控制信号顺

序:正常交通灯信号自动变换

(1) 南北方向绿灯,东西红灯 (20 秒) 。 (2) 南北方向绿灯闪烁 3 次, 东西红灯 (6 秒) 。 (3) 南北方向黄灯 , 东西红灯 (4 秒) 。

(4) 南北方向红灯,东西方向绿灯( 20 秒)。 (5) 南北方向红灯,东西方向绿灯闪 3 次(6 秒) 。 (6) 南北方向红灯,东西方向黄灯( 4 秒)。 (7) 返回 (1) 循环控制

紧急情况处理:模仿紧急情况 ( 重要车队通过、急救车通过等 ) 发

生时,交通手动控制

(1) 当任意方向通行剩余时间多于 10 秒,将时间改成 10 秒。 (2) 正常变换到四面红灯 (20 秒 ) 。

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

1.2.2

计时要求:

使用 TMS320VC5416DSP片上定时器,定时产生时钟计数, 再

利用此计数对应具体时间。

1.2.3

紧急情况要求:

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

1.2.4

程序设计要求

根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。

— 5

精选文库

这种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况, 可采用在正常顺序的控制中插入特殊控制序列的方式完成。

时钟计数:采用 250ms 一次中断进行累加计数。

表格 1

信号灯状态

编 号

状态定义

保持时间 ( 计数 值,起始时间,结

束时间 )

计 数 显 示

1

南北绿灯,东西红灯 南北绿灯闪烁,东西 红灯

2

3 南北黄灯,东西红灯 4 5

6

statusNSGreenEWR 20 秒(160 ,0,159) 20-0 ed statusNSFlashEWR

6 秒 (24 ,160,183) 0

ed statusNSYellowEW

4 秒 (16 ,184,199) 20

Red

南北红灯,东西黄灯 南北红灯,东西绿灯 南北红灯,东西绿灯

statusNSRedEWYel 4 秒 (16 ,200,215) 20 low statusNSRedEWGre 20 秒(160 ,216,

20-1

en 375)

statusNSRedEWFla 6 秒 (24 ,376,399) 0

闪烁 sh

statusNSRedEWYel

7 南北红灯,东西黄灯 4 秒 (16 ,400,415) 20

low statusNSYellowEW

8 南北黄灯,东西红灯 4 秒 (16 ,416,431) 20

Red

20 秒(160 ,0,159) 20-1 * 南北红灯,东西红灯其 StatusHold

中,正常顺序每 112 秒( 计数值 448) 为一个循环,状态“* ” 为非顺序状态。

这样,只要根据计数值就可确定当前状态,根据状态再分情况处理。

对于计数显示,当处于状态 1、5、* 中时需要进行倒计时,需要计算在此状态中的计数值增量, 根据增量判断是否更新计数显示。

— 6

精选文库

2 设计原理及方案

2.1 设计总体方案

2.1.1

设计思路

根据 DSP的硬件中断、定时器、 I/O 访问的原理。用定时器

定时,用 I/O 口控制红绿黄灯的开关,用硬件外部中断模拟急救

车的到达。有急救车到达时,两向为全红,以便让急救车通过。

急救车通过后,交通灯恢复硬件中断前的状态。触发开关

( 红色

按纽 ) 为中断申请,表示有急救车通过。在实验箱上交通灯模块

由高 8 位数据线控制:南北红灯 D9、D11为高,南北黄灯 D9、D11、D13、 D15为高,南北绿灯 D13、 D15为高,东西红灯 D8、D10为

高,东西黄灯由 D8、 D10、D12、D14 为高,东西绿灯 D12、 D14 为高。交通灯模块的 I/O 地址: 0x5008h

2.2 课程设计原理

2.2.1

系统工作原理

本设计硬件由定时模块、发光二极管模块、数码管显示模块

和紧急中断模块组成。信号灯受芯片中输出高低电平的控制。当

锁存器 I/O 口输出为高电平时, 他所驱动的信号灯即发光二极管

就会亮起来。定时模块采用硬件定时和软件定时相结合的方法,

用 DSP定时 / 计数器定时 100ms,再用软件计时实现所需的定时。发光二极管模块由 DSP控制发光二极管来实现。 数码管显示模块由实验平台上的 LED显示模块实现。 紧急中断模块是由单脉冲发生单元和 DSP中断控制器组成。 本次设计中东西南北路口的红灯

— 7

精选文库

均亮 1 秒,信号灯开始工作,东西红灯亮

20 秒,在东西红灯亮

的同时,南北绿灯亮 20 秒。到 20 秒时,东西绿灯闪亮,绿灯闪 亮的周期为 2 秒( 亮 1 秒,灭 1 秒) 。绿灯闪亮 3 次后灭,东西黄

灯亮并维持 4 秒。到 4 秒时,东西黄灯灭,东西红灯亮,同时南

北红灯灭,南北绿灯亮。东西红灯亮维持

20 秒,南北绿灯亮维

持 20 秒,到 20 秒时,南北绿灯闪亮 3 次后灭,南北黄灯亮,并维持 4 秒。到 4 秒时,南北黄灯灭,南北红灯亮,同时东西红灯灭,东西绿灯亮。紧接着开始第二周期的动作,以后周而复始的循环。

2.2.2

系统工作状态

系统工作状态

状态一:南北绿灯、东西红灯,延时

20 秒, 20 秒后南北绿

灯闪 3 次,东西红灯延时 6 秒;如图所示

图 2.1 状态一

状态二:南北黄灯、东西红灯,持续 6 秒;

— 8

精选文库

图 2.2 状态二

状态三:东西绿灯、南北红灯,延时 20 秒, 20 秒后东西绿灯闪 3 次,南北红灯持续 6 秒;

图 2.3 状态三

状态四:东西黄灯、南北红灯,持续 6 秒;

— 9

精选文库

图 2.4 状态四

状态五:紧急状态下东西南北均亮红灯;

图 2.5 状态五

3 硬件设计

3.1 硬件总体设计

1 根据设计要求,由于控制是由不同的各种状态按顺序发生的 , 我可以采用状态机制控制方法来解决此问题。 这种方法是 : 首

先列举所有可能发生的状态;然后将这些状态编号

, 按顺序产生

, 可采用

这些状态;状态延续的时间用程序控制,对于突发情况

在正常顺序的控制中插入特殊控制序列的方式完成。

2

突发事件设置 , 在实际交通过程中会出现突发状况 , 比如说有

救护车或者 110 紧急车要通过 , 此时就可以通过小键

盘进行突发状况模拟。通过按键进入到中断服务子程序 , 相当于原

来先要通过的车辆在突发状况来了以后就要先让紧急车辆 通过。原理框图如图 3.1 所示。

— 10

精选文库

图 3.1 ICETEK-F2812-AE原理框图

3.2 交通灯显示模块

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

TMS320F2812 DSP有最多 56 个专门的通用输入输出管脚。这些通用输入输出管脚通过专用寄存器可以由软件控制, 比如指定输入、输出以及输出值等。通过 ICETEK-F2812-AE评估板的插座,

扩展板(通用输出 / 控制模块 ICETEK-CTR)将板上的一个指示灯

和 DSP的一个通用输入 / 输出管脚直接相连。这个管脚为

PWM12,

可以设置成通用输入 / 输出管脚使用。扩展原理如图 3.2 所示。

— 11

精选文库

图 3.2 发光二极管设计原理

3.3 计数显示模块

计数显示采用放光二极管显示阵列显示。 TMS320F2812 DSP

的存储器扩展接口( EMIF)用来与大多数外围设备进行连接,典

型应用如连接片外扩展存储器等。这一接口提供地址线、数据线

和一组控制线,ICETEK-F2812-A评估板已将这些扩展线引到了板

上的扩展插座上,供扩展使用。发光二极管显示阵列由扩展端口

控制, EMIF 接口的两个寄存器提供具体控制。原理图如图

3.3

所示。

图 3.3

计数显示原理

— 12

精选文库

3.4 开关模块

开关模块采用外部外部存储器扩展接口(

EMIF)上的 PS2接

口键盘,通过扫描码判断输入键值。 TMS320F2812 DSP的扩展存

储器接口( EMIF)用来与大多数外围设备进行连接,典型应用如

连接片外扩展存储器等。这一接口提供地址线、数据线和一组控

制线,ICETEK-F2812-A评估板已将这些扩展线引到了板上的扩展

插座上。键盘的扫描码由 DSP的扩展地址 0x108001 给出,当有

键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的

结果为 0。开关设计原理如图 3.4 所示。

图 3.4

开关设计原理

— 13

精选文库

4 软件设计

4.1 程序流程

该设计实现的功能是南北方向绿灯,东西红

10 秒,南北方

向绿灯闪烁 3 次, 东西红灯 4 秒,南北方向黄灯 , 东西红灯 2 秒, 南北方向红灯,东西方向绿灯

10 秒,南北方向红灯,东西方向

2 秒)。在紧

绿灯闪 3 次 4 秒,南北方向红灯,东西方向黄灯( 急情况下,当任意方向通行剩余时间多于

10 秒,将时间改成 10

秒,正常变换到四面红灯

20 秒,然后直接返回正常信号顺序的

下一个通行信号 ( 跳过闪烁绿灯、黄灯状态 ) 。程序流程图如图 4.1

所示。

开始

定时器中断服务程序入口

初始化: CPU 频率、 ICETEK-CTR 、定时器、

中断控制寄存器、工作变量

计数工作变量值在 原基础上加

根据定时器计数确定当前状态

1

根据当前状态设置指示灯状态

退出定时器中断服务程

根据当前状态设置发光二极管显示阵列状

键盘中断服务程序入口

读取键盘输入

设置突发事件标志

结束?

退出键盘中断服务程14序

结束

精选文库

图 4.1

程序流程图

4.2 交通灯模拟显示

显示 / 控制模块上的发光二极管是由连接在

2812DSP扩展地

址接口上的寄存器 EWR和 SNR控制的。这两个寄存器均为 6 位寄 存器,其位定义见表

4.1 表 4.2 。两个寄存器的地址均映射到

2812DSP的扩展空间, CTRLR地址为 0x108007, DSP通过对该地

址的写操作来修改两个寄存器上各位的状态,当寄存器某位取

‘ 1’值时, 相应指示灯被点亮, 取‘0’值则熄灭。 当写入 CTRLR

的数据 (8 位有效值 ) 的高两位为‘ 00’时,数据的低 6 位将写入

EWR寄存器;当高两位的值为‘ 01’时,写入 SNR寄存器

bit5 东 - 红

bit4 东- 黄

bit3 东- 绿

表 4.1

bit2 西- 红

bit1 西 - 黄

bit0 西- 绿

寄存器 EWR

bit5 南 - 红

bit4 南- 黄

bit3 南- 绿

表 4.2

bit2 北- 红

bit1 北 - 黄

bit0 北- 绿

寄存器 SNR

4.3 定时器及中断设计

TMS320F2812A内部有三个 32 位通用定时器( TIMER0/1/2),定时 器 1 和 2 被保留给实时操作系统( DSPBIOS)用,只有定时器 0 可以提供给用户使用。 定时器采用中断方式, 中断过程如下:a.接受中断请求。必须由软件中断(从程序代码)或硬件中断

(从一个引脚或一个基于芯片的设备) 提出请求去暂停当前主程序的执行。 b.响应中断。必须能够响应中断请求。如果中断是

— 15

精选文库

可屏蔽的,则必须满足一定的条件,按照一定的顺序去执行。而

对于非可屏蔽中断和软件中断,会立即作出响应。

c.准备执行

中断服务程序并保存寄存器的值。

d.执行中断服务子程序。调

用相应得中断服务程序 ISR,进入预先规定的向量地址,并且执 行已写好的 ISR。定时器及中断的流程如图 4.2 。

开始

中断服务开始

初始化 DSP 时钟

改变指示灯状态

初始化中断向量

中断服务结束

初始化定时器

等待中断产生

图 4.2

定时器及中断流程图

4.4 外中断设计

紧急情况时,利用 ICETEK-CTR上键盘产生外中断,中断正

常信号顺序,模拟突发情况。显示 / 控制模块 ICETEK-CTR通过接

口 P8 连接小键盘,接收小键盘传送的扫描码,并在每个扫描码

结束后保存,同时向 DSP的 XINT2 发送中断信号;当 DSP读键盘

— 16

精选文库

时将扫描码送到数据总线上。小键盘上每次按下一个键将产生

个扫描码、 2 次中断。外中断的程序流程图如图

4.3 所示。

开始

中断服务开始

初始化: DSP 时钟、 ICETEK-CTR

改变指示灯状态

初始化中断控制寄存器

中断服务结束

等待中断产生

图 4.3

外中断程序流程图

— 2

17精选文库

5 系统调试

5.1 硬件调试

5.1.1 电源调试

1 .连接电源:打开实验箱,取出三相电源连接线 ( 如右图 ) ,将

电源线的一端插入实验箱外部左侧箱壁上的电源插孔中。 确认实

验箱面板上电源总开关 ( 位于实验箱底板左上角 ) 处于“关”的位

置,连接电源线的另一端至 220V 交流供电插座上,保证稳固连

接。

2 .使用电源连接线 ( 如右图,插头是带孔的 ) 连接各模块电源:

确认实验箱总电源断开。连接 ICETEK-CTR板上边插座到实验箱

底板上 +12V电源 插座;ICETEK-CTR板下边插座到实验箱底板上

+5V 电源插座;如使用 PP(并口 ) 型仿真器,则连接仿真器上插座

到实验箱底板上 +5V电源插座;连接 DSP 评估板模块电源插座到

实验箱底板上 +5V 电源插座。注意各插头要插到底,防止虚接或

接触不良。

3 .连接DSP 评估板信号线:当需要连接信号源输出到 A/D 输入

插座时,使用信号连接线 ( 如右图 ) 分别连接相应插座。

4 .接通电源:检查实验箱上 220V 电源插座 ( 箱体左侧 ) 中保险

管是否完好,在连接电源线以后,检查各模块供电连线是否正确

连接,打开实验箱上的电源总开关 ( 位于实验箱底板左上角 ) ,使

开关位于“开”的位置,电源开关右侧的指示灯亮。

5.1.2 Emulator

调试

1 .启动 Simulator 方式

— 18

精选文库

双击桌面上图标:

2 .启动 Emulator 方式

(1) 首先将实验箱电源关闭。连接实验箱的外接电源线。 (2) 检查 ICETEK-5100USB仿真器的黑色 JTAG 插头是否正确接到 ICETEK-VC5416-A板的 J3 插头上。注:仿真器的插头中有

个孔加入了封针与 J3 插头上的缺针位置应重合,保证不会插错。 (3) 检查是否已经用电源连接线连接了ICETEK-VC5416-A 板的 POW1插座和实验箱底板上 +5V 电源插座。

(4) 检查其他连线是否符合实验要求。 检查实验箱上三个拨动开

关位置是否符合实验要求。

(5) 打开实验箱上电源开关 ( 位于实验箱底板左上角 ) ,注意开关边上红色指示灯点亮。 ICETEK-VC5416-A 板上指示灯 D1 和D2 点亮。如果打开了 ICETEK-CTR的电源开关, ICETEK-CTR板上指示灯 L1、L2 和L3 点亮。如果打开了信号源电源开关,相应开关边的指示灯点亮。

(6) 用实验箱附带的 USB 信号线连接 ICETEK-5100USB仿真器和

PC 机后面的 USB 插座,注意 ICETEK-5100USB仿真器上指示灯

Power 和Run 灯点亮。

(7) (7) 双击桌面上仿真器初始化图标:

如果出现下面图 5.1

提示窗口,表示初始化成功,按一下空格键进入下一步操作。

— 19

精选文库

图 5.1

初始化图

如果窗口中没有出现“按任意键继续 ”,请关闭窗口,关闭

实验箱电源,再将 USB 电缆从仿真器上拔出,返回第 (2) 步重试。

如果窗口中出现“ The adapter returned an error.

”,并

提示“按任意键继续

”表示初始瑞泰创新——

ICETEK-VC5416-A-USB-EDU教学实验系统软件实验指导

III - 7化失败,请关闭窗口重试两三次,如果仍然不能初始化则 关闭实验箱电源,再将 USB 电缆从仿真器上拔出,返回第 (2) 步重试。

⑧双击桌面上图标:

启动 CCS2.21。

⑨如果进入 CCS 提示错误,先选“ Abort ”,然后用“初始化

ICETEK-5100USB2.0 仿真器”初始化仿真器,如提示出错,可多

做几次。如仍然出错,拔掉仿真器上

USB 接头 ( 白色方形 ) ,按一

下 ICETEK-VC5416-A板上 S1 复位按钮,连接 USB 接头再做“初始化 ICETEK-5100 USB2.0 仿真器”。

— 20

精选文库

⑩如果遇到反复不能连接或复位仿真器、进入

CCS 报错,请打开

Windows 的“任务管理器”,在“进程”卡片上的“映像名称” 栏中查找是否有“ cc_app.exe ”,将它结束再试。

5.2 软件调试

5.2.1 软件设计

CCS 可以工作在纯软件仿真环境中,就是由软件在

PC 机内存

中构造一个虚拟的 DSP 环境,可以调试、运行程序。但一般软件无法构造 DSP 中的外设,所以软件仿真通常用于调试纯软件的算法和进行效率分析等。

在使用软件仿真方式工作时,无需连接板卡和仿真器等硬件。

(1) 单击桌面上图标:

进入 CCS设置窗口。

(2) 在出现的窗口中按标号顺序进行如下图 5.2 设置:

图 5.2

仿真设置图

接着在下面出现的窗口中选择“否 (N) ”。

此时 CCS 已经被设置成 Simulator 方式 ( 软件仿真 TMS320VC5416

器件的方式 ) ,如果一直使用这一方式就不需要重新进行以上设

置操作了。

— 21

精选文库

2. 设置 CCS 通过 ICETEK-5100USB仿真器连接 ICETEK-VC5416-A

硬件环境进行软件调试和开发。

(1) 单击桌面上图标:

进入 CCS 设置窗口

(2) 在出现的窗口中按标号顺序进行如下图 5.3 设置:

图 5.3 CSS2 设置图

(3) 接着在下面的窗口中按标号顺序进行如下图 5.4 选择:图 5.4 CSS2 设置图

在出现的窗口按标号顺序进行如下图

5.5 设置:

— 22

精选文库

图 5.5 CSS2 设置图

(5) 在出现的窗口按标号顺序进行如下图 5.6 设置:

图 5.6 CSS2 设置图

以上设置完成后, CCS已经被设置成 Emulator 的方式 ( 用仿真器

连接硬件板卡的方式 ) ,并且指定通过 ICETEK-5100USB仿真器连

接 ICETEK-VC5416-A评估板。如果您需要一直使用这一方式就不需要重新进行以上设置操作了。

5.2.2 程序运行

选择菜单“ Project ”的“ New ”项。如图 5.7 所示。

— 23

精选文库

图 5.7 CSS2 设置图

如下图,按编号顺序操作建立

Trafficlight.pjt 工程文件 :

展 开主窗口左侧 工程 管理窗口中 “ Projects “ Trafficlight.pjt

” 下新建立的

”,其中各项均为空。

(2) 在工程文件中添加程序文件:

选择菜单“ Project ”的“Add Files to Project ”项;在“ Add

Files to Project

”对话框中

选择文件目录为 C:\\ICETEK-VC5416-EDULab\\Lab0601-UseCCS,改

变文件类型为“ C Source

Files(*.c;*.ccc)

”,选择显示出来的文件 “ Trafficlight.c ”;

重复上述各步骤,添加 Trafficlight.cmd 中;

文件 , 到volume 工程

添加 C:\i\\C5400\\cgtools\\lib\\rts.lib

(3) 编译连接工程:选择菜单“ Project ”的“ Rebuild All ”项, 或单击工具条中的按钮;注意编译过程中 CCS 主窗口下部的 “ Build ”提示窗中显示编译信息,最后将给出错误和警告的统计数。

5.3 系统下载

(1) 下载程序:执行 File → Load Program , 在随后打开的对话框

— 24

精选文库

中选择刚刚建立的

C:\\ICETEK-VC5416-EDULab\\Lab0601-UseCCS\\Debug\\Trafficlig

ht.out

文件。

(2)

设置软件调试断点:在项目浏览窗口中,双击

Trafficlight.c 激活这个文件,移动光标到 main() 行上,单击鼠标右键选择 Toggle Breakpoint 或按 F9 设置断点 ( 另外,双击此行左边的灰色控制条也可以设置或删除断点标记 ) 。

(3) 利用断点调试程序:选择 Debug→ Run 或按 F5 运行程序,

程序会自动停在 main() 函数上。

(4) 在 ICETEK-CTR附带的小键盘上按下按键, 观察信号是否满足要求。

6 设计心得与体会

此次课程设计,通过学习,我进一步熟悉了 CCS软件,巩固了以前所学过的知识。通过对书本上的理论知识与实际的操作相结合,对所学的理论知识也有了更深层次的理解。

本次设计中主要用到了 DSP的硬件中断、定时器以及 I/O 访

问等方面的相关的知识。对于这几方面知识我并不陌生,在以前

的的课程设计中,这些内容都曾涉及,再加上曾经

DSP课程的学

习。因此在本次的功能实现方面遇到的问题并不是太多。不过毕 竟 DSP的相关知识有别于单片机, 因此对编程的理解上还是出现了一些问题,通过对课本以及相关资料的查询,这些问题也及时的得到了解决。

— 25

精选文库

通过对问题的发现与解决, 使我更加了解 DSP的原理及其编

程的相关注意事项,加深了对课本理论知识的理解。

7 参考文献

[1] 刘和平等. DSP原理及电机控制应用—基于 TMS320LF2407x

系列 [M] .北京航空航天大学出版社, 2006.

[2] 宁改娣等 . DSP 控制器原理及应用 [M] .北京 : 科学出版社, 2002.

[3] 仿真系统使用说明书,北京瑞泰创新有限公司。

[4] 清源科技 .TMS320C54xDSP应用程序设计教程 [M]. 机械工业

出版社 ,2004.1.

[5] 清源科技 .TMS320C54x 硬件开发教程 [M]. 机械工业出版社 ,2003.1.

附录一

控制源程序

#include \"scancode.h\"

— 26

#define SPSA0 *(unsigned int *)0x38

#define SPSD0 *(unsigned int *)0x39

#define REGISTERCLKMD (*(unsigned int *)0x58)

#define TIM *(int *)0x24 #define PRD *(int *)0x25 #define TCR *(int *)0x26 #define IMR *(int *)0x0 #define

IFR

*(int *)0x1

#define PMST *(int *)0x1d

#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

精选文库

27

#define statusNSRedEWYellow 3

#define statusNSRedEWGreen 4

#define statusNSRedEWFlash 5

#define statusHold 6

ioport unsigned int port3004;

// CTR 扩展寄存器定义

ioport unsigned int port8000;

ioport unsigned int port8001;

ioport unsigned int port8002;

ioport unsigned int port8003;

ioport unsigned int port8004;

ioport unsigned int port8005;

ioport unsigned int port8007;

#define CTRGR

port8000

#define CTRLCDCMDR port8001 #define CTRKEY

port8001

#define CTRCLKEY port8002 #define CTRLCDCR port8002

#define CTRLCDLCR port8003

#define CTRLCDRCR port8004

#define CTRLA

port8005 #define CTRLR

port8007

void InitDSP();

void InitTimer();

精选文库

28

精选文库

void InitICETEKCTR();

void interrupt time(void);

void interrupt xint2(void); // XINT2

中断服务程序

void SetLEDArray(int nNumber);

// 修改显示内容

void RefreshLEDArray();

// 刷新显示

void EndICETEKCTR();

unsigned int uWork,nTimeCount;

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,0x,0x,0x76,

0x38,0x24,0x22,0xFF,0x4F,0x,0x,0x71,

0x7E,0x,0x,0x72,0x01,0xF1,0x09,0x07,

0x76,0x,0x,0x76,0x4E,0x91,0x91,0x7E

};

main()

{

int nWork1,nWork2,nWork3,nWork4;

int

nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;

29

精选文库

unsigned int nScanCode;

nTimeCount=0; bHold=0;

uLightStatusEW=uLightStatusSN=0;

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

InitDSP();

InitICETEKCTR(); InitTimer();

// 初始化 DSP,设置运行速度 // 初始化显示 / 控制模块 // 设置定时器中断

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

{

if ( bHold && nNowStatus==statusHold )

{

if ( nTimeCount>=nStatusHold )

{

nNowStatus=nSaveStatus;

nTimeCount=nSaveTimeCount;

bHold=0;

}

}

else

if ( nTimeCountnNowStatus=statusNSGreenEWRed;

else

if ( nTimeCountnNowStatus=statusNSFlashEWRed;

30

精选文库

else

if ( nTimeCountnNowStatus=statusNSYellowEWRed;

else

if ( nTimeCountnNowStatus=statusNSRedEWYellow;

else

if ( nTimeCountnNowStatus=statusNSRedEWGreen;

else

if ( nTimeCountnNowStatus=statusNSRedEWFlash;

else

if ( nTimeCountnNowStatus=statusNSRedEWYellow;

else

if ( nTimeCountnNowStatus=statusNSYellowEWRed;

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 )

— 31

精选文库

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

x40);

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):(0

x00);

break;

case statusNSGreenEWRed:

nWork1=nStatusNSGreenEWRed/30;

if ( nWork1>0 )

{

nWork2=30-nTimeCount/nWork1;

if ( bHold )

{

if ( nWork2>10 )

{

nTimeCount=nWork1*10;

32

精选文库

nWork2=10;

}

}

if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray(nWork2);

}

}

break;

case statusNSRedEWGreen:

nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/30

;

if ( nWork1>0 )

{

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

if ( bHold )

{

if ( nWork2>10 )

{

nTimeCount=nStatusNSRedEWYellow+nWork1*10;

nWork2=10;

33

精选文库

}

}

else

{

}

}

if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray(nWork2);

}

}

break;

case statusHold:

nWork1=nStatusHold/30;

if ( nWork1>0 )

{

nWork2=30-nTimeCount/nWork1;if ( nOldTimeCount!=nWork2 )

{

nOldTimeCount=nWork2;

SetLEDArray(nWork2);

}

}

break;

34

精选文库

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;

35

精选文库

SetLEDArray(18);

break;

case statusNSFlashEWRed:

uLightStatusEW=0x24;

uLightStatusSN=0x49;

SetLEDArray(0);

break;

case statusNSYellowEWRed:uLightStatusEW=0x24;

uLightStatusSN=0x52;

SetLEDArray(20);

break;

case statusNSRedEWYellow:uLightStatusEW=0x12;

uLightStatusSN=0x;

SetLEDArray(20);

break;

case statusNSRedEWGreen:

uLightStatusEW=0x09;

uLightStatusSN=0x;

SetLEDArray(20);

break;

case statusNSRedEWFlash:

uLightStatusEW=0x09;

uLightStatusSN=0x;

36

精选文库

SetLEDArray(0);

break;

case statusHold:

uLightStatusEW=0x24;

uLightStatusSN=0x;

SetLEDArray(20);

break;

}

}

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

RefreshLEDArray();

// 刷新发光二极管显示

nScanCode=port8001; // 读键盘扫描码 nScanCode&=0x0ff;

if ( nScanCode==SCANCODE_Enter ) break;

}

EndICETEKCTR();

exit(0);

}

// 定时器中断服务程序,进行时钟计数

void interrupt time(void)

{

nTimeCount++;

nTimeCount%=nTotalTime;

//

37

}

// 设置发光二极管显示内容

void SetLEDArray(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 RefreshLEDArray()

{

int i;

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

{

CTRGR=ledx[i];

CTRLA=ledbuf[i];

}

精选文库

38

精选文库

}

// 初始化 DSP,设置运行速度

=8MHz void InitDSP() {

REGISTERCLKMD=0;// 速度设置 =8MHz }

// 设置定时器参数、允许中断 void InitTimer()

{

unsigned int k;

asm(\" ssbx

INTM\"); // 关中断,进行关键设置时不许打扰

// 设置通用定时器

k=PMST;

// 设置 PMST寄存器 PMST =k&0xff; // 中断向量表起始地址 =80H IMR = 0x0c;

// 使能 TINT TCR = 0x41f; // 预分频系数为 16 TIM = 0;

// 时钟计数器清 0

PRD = 0x0f423; // 周期寄存器为 0ffH TCR = 0x42f;

// 复位、启动

IFR = 0x0c;

// 清中断标志位

— 39

port3004=0;

// 使能 XINT2

asm(\" rsbx

INTM\");

// 开中断

}

// 初始化 ICETEK-CTR板上设备

void InitICETEKCTR()

{

int k;

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=CTRCLKEY; // 清除键盘缓冲区

}

void interrupt xint2(void)

// XINT2 中断服务程序{

精选文库

40

精选文库

bHold=1;

}

void EndICETEKCTR() {

int k;

CTRLR=0; // 关闭东西方向的交通灯 CTRLR=0x40;

// 关闭南北方向的交通灯

CTRLR=0x0c0; // 关闭发光二极管显示阵列 k=CTRCLKEY;

// 清除键盘缓冲区

}

附录二

实物图

— 41

精选文库

— 42

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务