基于DSP实现道路交通灯控制系统设计

基于DSP实现道路交通灯控制系统设计
基于DSP实现道路交通灯控制系统设计

1 引言 (1)

2项目设计实现功能 (2)

2.1交通灯控制要求 (2)

2.2 液晶显示器控制 (3)

3 项目实现方案 (3)

3.1项目设计整体思路 (3)

3.2设计原理 (5)

3.2.1 CPU定时器原理 (5)

3.2.2 DSP外设中断扩展模块 (6)

3.2.3 发光二极原理 (6)

3.2.4 TMS320F28x DSP 的I/O (7)

3.2.5 液晶显示器控制原理 (8)

4 程序设计 (9)

4.1 程序总体设计 (9)

4.2 程序编写(见附页) (10)

5 心得体会 (10)

附页 (10)

基于DSP实现道路交通灯控制系统设计

摘要:DSP数字信号处理,是一门涉及多学科而又广泛应用于许多领域的新兴学科。随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法。本次设计是基于dsp原理设计交通灯控制系统软硬件系统,利用发光二极管亮灭模拟交通信号,数码管倒计时时间,利用TMS320F2812 DSP片上定时器产生时钟计数,设计模拟实际生活中的十字路口交通灯。

关键字:DSP;TMS320F2812;发光二极管;交通灯;

Abstract: DSP digital signal processing, is a multidisciplinary and widely applied in many fields of the emerging discipline. Along with the computer and the rapid development of information technology, digital signal processing technology to emerge as the times require and develop rapidly. Digital signal processing is through the use of a mathematical skills to perform the conversion or extraction of information, to deal with real signal method. The design is based on the principle of DSP design of traffic light control system software and hardware system, using light-emitting diodes to eliminate simulated traffic signal countdown time, digital tube, the use of TMS320F2812 DSP on-chip timer generates a clock counting, designed to simulate the actual life of the crossroads traffic lights.

Keyword: DSP; TMS320F2812; light emitting diode; traffic lights;

1 引言

交通是经济、社会发展的基础性产业,是社会、经济活动中人流、物流、资金流和信息流的主要流动方式。现代社会中,如果没有高效运转的交通运输体系,就不可能有经济的持续发展。然而,随着社会经济的发展,机动车辆迅速增加,人们在赚取由机动车辆所带来的巨额利润以及充分享受汽车带来的巨大便利的同时,越来越被交通拥堵、交通事故频发、环境污染加剧和燃油损耗上升等诸多问题所困扰。

随着交通的不断发展和汽车化进程的加快,交通拥挤加剧,交通事故频发,交通环境恶化,已经成为引人注目的城市问题之一。交通问题不仅在发展中国家,就在发达国家也是一个令人困扰的严重问题。众所周知,缓解交通拥挤的最直接和最有效办法是提

高路网的通信能力。但无论哪个国家的大城市,不可能无限制地修建道路,不论是资金因素还是土地因素,都限制了道路的无节制增长。因此,无限制地修建道路难满足日益增长的交通需求。与此同时,通过限制车辆增加削减交通需求也受到客观因素的制约而无法取得满意的结果。事实上,由于交通系统是一个相当复杂的大系统,无论单独从车辆方面考虑还是从道路方面考虑,都很难从根本上解决问题。

道路交通系统是一个地区、一个城市的主要组成部份,这个系统的运行状况如何,直接反映了一个地区、一个城市的现代化管理水平。在这一系统中,道路不仅仅是易变化的部分,而其它组成部分则存在着较大的可变性和随机性。只有对这一系统的组成及其运行机理进行科学客观的分析研究,对能制定出科学有效的管理和控制对策,从而保障系统的有效运行。

2项目设计实现功能

2.1交通灯控制要求

交通灯分红黄绿三色,东、南、西、北各一组,用灯光信号实现对交通的控制:绿灯信号表示通行,黄灯表示警告,红灯禁止通行,灯光闪烁表示信号即将改变。

计时显示:液晶屏幕上8×8 点阵显示0-9 计数。

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

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

⑵南北方向绿灯闪烁。

⑶南北方向黄灯。

⑷南北方向红灯,东西方向黄灯。

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

⑹东西方向绿灯闪烁。

⑺东西方向黄灯。

⑻返回⑴循环控制。

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

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

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

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

2.2 液晶显示器控制

本次设计使用ICETEK-F2812-A板,ICETEK-F2812-A是一块以TMS320F2812DSP 为核心的DSP 扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。液晶显示模块的访问、控制是由2812DSP对扩展扩展接口的操作完成。

控制扩展口的寻址:命令控制扩展接口的地址为0x108001,数据控制扩展接口的地址为0x108003 和0x108004,辅助控制扩展接口的地址为0x108002。

可以观察到液晶显示从0到9的计数。灵活使用控制字,可以实现复杂多变的显示。当使用点阵图形显示时需要在 DSP 内存中建立图形存储缓冲;适当更新显示可取得动画效果。在实际生活中观察点阵显示的霓虹灯广告、交通指示牌、报站牌等领会这种控制的具体应用。

3 项目实现方案

3.1项目设计整体思路

根据DSP的硬件中断、定时器、I/O访问原理。用定时器定时。用I/O口控制红绿黄灯的开关,用硬件中断模拟紧急情况发生(如:急救车,消防车)。有紧急情况发生,两向全红,以便让紧急车通过。紧急车通过后,交通的恢复中断前的状态。

中断服务流程

设计总流程图

3.2设计原理

3.2.1 CPU定时器原理

F2810/F2812芯片内部有3个32位CPU定时器(TIMER0/1/2),其中定时器1和定时器2预留给实时操作系统使用(如 DSPBIOS),只有CPU定时器0用户可以在应用程序中使用。定时器功能框图如下:

在F281x芯片中,向CPU申请中断的定时器中断信号(TINT0、TINT1及TINT2)连接方式如下图:

为保证定时器正常,需要进行一下操作:首先将计数值写入32位计数寄存器(TIMH:TIM)内,该计数值放在周期寄存器(PRDH:PRD)中;然后按SYSCLOCKOUT的频率对计数值进

行减计数。当计数器的值计到0时,定时器会产生一个中断脉冲输出。

3.2.2 DSP外设中断扩展模块

2812的CPU为了能够及时有效的处理好各个外设的中断请求,设计了一个专门处理外设中断的扩展模块(the Peripheral Interrupt Expansion block),叫做外设中断控制器PIE,它能够对各种中断请求源(例如来自于外设或者其他外部引脚的请求)做出判断以及相应的决策。PIE 可以支持96个不同的中断,这些中断分成了12个组,每个组有8个中断,而且每个组都被反馈到CPU内核的12 条中断线中的某一条上(INT1-INT12)。PIE 目前只使用了96 个终端中的45 个,其他的等待将来的功能扩展。

2812的中断是3级中断机制,分别是外设级,PIE级以及CPU级,对于某一个具体的外设中断请求,任意一级的不许可,CPU最终都不会执行该外设中断。

3.2.3 发光二极原理

显示/控制模块上的发光二极管是由连接在F2812DSP 扩展扩展接口上的寄存器EWR和SNR控制的。这两个寄存器均为6 位寄存器,其位定义见下表:

两个寄存器的地址均映射到 F2812DSP 的扩展空间,地址为108007H,DSP 通过对扩展区域该地址的写操作来修改两个寄存器上各位的状态,当寄存器某位取‘1’值时,相应指示灯被点亮,取‘0’值则熄灭。当写入108007H 的数据(8 位有效值)的高两位为‘00’时,数据的低6 位将写入EWR 寄存器;当高两位的值为‘01’时,写入SNR 寄存器。

3.2.4 TMS320F28x DSP 的I/O

TMS320F28x DSP 的I/O 空间大部分被保留用于外部扩展。在扩展时一般将带有控制能的寄存器或分离地址访问的存储单元的地址映射到I/O 空间,访问这部分的单元又称I/O 端口访问。例如:可将控制指示灯组的寄存器或锁存器映射到一个I/O 端口地址上;A/D、D/A 等专用芯片控制端和状态寄存器也常映射到I/O 端口上。总之,在I/O 空间中扩展的设备一般重点用于控制,而使用大片连续存储空间的存储器单元一般映射到数据空间。ICETEK-F2812-A 板将指示灯、DIP 开关、A/D 和D/A 的控制端等映射在I/O 空间。在程序中,访问I/O 端口的语句较为简单。

3.2.5 液晶显示器控制原理

显示开关:0x3f 打开显示;0x3e 关闭显示;

设置显示起始行:0x0c0+起始行取值,其中起始行取值为0 至63;

设置操作页:0x0b8+页号,其中页号取值为0-7;

设置操作列:0x40+列号,其中列号为取值为0-63;

写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送到相应数据控制扩展接口即可。

液晶显示器与DSP 的连接:

数据信号的传送:由于液晶显示模块相对运行在8MHz 主频下的DSP 属于较为慢速设备,

连接时需要考虑数据线上信号的等待问题;

电平转换:由于DSP 为3.3V 设备,而液晶显示模块属于5V 设备,所以在连接控制线、数据线时需要加电平隔离和转换设备。

4 程序设计

4.1 程序总体设计

①根据设计要求,由于控制是由不同的各种状态按顺序发生的, 我们可以采用状态机

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

②定时器的设定, VC5509A 定时器是由一个4 位的预定标值PSC 和一个16 位的减法计

数的计数器TIM 组成。在实际工作中首先是每经过一个周期PSC 值减1, 一直减到0后TIM 开始减1, 直到减到0 后的第一个周期, 计数器会向CPU 发出中断请求。

③突发事件设置, 在实际交通过程中会出现突发状况, 比如说有救护车或者110 紧急

车要通过, 此时就可以通过小键盘进行突发状况模拟。通过按键进入到中断服务子程序, 相当于原来先要通过的车辆在突发状况来了以后就要先让紧急车辆通过。

4.2 程序编写(见附页)

5 心得体会

随着信息技术的飞速发展,数字信号处理技术已逐渐发展成为一门主流技术,它在电子信息,通信,软件无线电,制动控制,仪表仪器,信息家电等高科技领域得到了越来越广泛的应用。数字信号处理器由于运算速度快,具有可编程特性和接口灵活的特点,使的它在许多电子产品的研制,开发与应用中,发挥着越来越重要的作用。采用DSP 芯片来实现数字信号处理系统更是当前的发展趋势。

通过做基于DSP 的交通灯的设计,进一步熟悉DSP 芯片及其开发环境CCS的功能。同时对当前交通控制的现状有了进一部的了解。为以后的学习打下了坚实的基础。随着科学技术的发展及各门学科的相互融合,DSP 将有更为广阔的应用前景。交通控制也会更智能,为人们的出行提供更多的便利。

附页

#include "scancode.h"

#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

#define statusNSRedEWYellow 3

#define statusNSRedEWGreen 4

#define statusNSRedEWFlash 5

#define statusHold 6

#define LCDDELAY 1

#define LCDCMDTURNON 0x3f

#define LCDCMDTURNOFF 0x3e

#define LCDCMDSTARTLINE 0xc0

#define LCDCMDPAGE 0xb8

#define LCDCMDVERADDRESS 0x40

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();

void InitICETEKCTR();

void interrupt time(void);

void interrupt xint2(void); //

XINT2中断服务程序

void SetLEDArray(int nNumber);

// 修改显示内容

void RefreshLEDArray();

// 刷新显示

void EndICETEKCTR();

void TurnOnLCD();

void LCDCLS();

void Delay(unsigned int

nDelay);

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, 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

};

unsigned char ledkey[10][8]= {

{0x00,0x00,0x7C,0x82,0x82 ,0x82,0x7C,0x00}, //0

{0x00,0x00,0x00,0x84,0xFE ,0x80,0x00,0x00}, //1

{0x00,0x00,0x84,0xC2,0xA2 ,0x92,0x8C,0x00}, //2

{0x00,0x00,0x44,0x92,0x92 ,0x92,0x6C,0x00},

{0x00,0x00,0x30,0x28,0x24 ,0xFE,0x20,0x00},

{0x00,0x00,0x4E,0x92,0x92 ,0x92,0x62,0x00},

{0x00,0x00,0x7C,0x92,0x92 ,0x92,0x64,0x00},

{0x00,0x00,0x02,0xC2,0x32 ,0x0A,0x06,0x00},

{0x00,0x00,0x6C,0x92,0x92 ,0x92,0x6C,0x00},

{0x00,0x00,0x4C,0x92,0x92 ,0x92,0x7C,0x00}

};

main()

{

int

nWork1,nWork2,nWork3,nWork4,tK ey;

int

nNowStatus,nOldStatus,nOldTime Count,nSaveTimeCount,nSaveStat us;

unsigned int nScanCode;

nTimeCount=0; bHold=0;

uLightStatusEW=uLightStat usSN=0;

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

InitDSP(); //

初始化DSP,设置运行速度

InitICETEKCTR(); // 初始

化显示/控制模块

InitTimer(); // 设置

定时器中断

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

// 根据状态设置计数和交通

灯状态

while ( 1 )

{

if ( bHold &&

nNowStatus==statusHold )

{

if

( nTimeCount>=nStatusHold )

{

nNowStatus=nSaveStatus;

nTimeCount=nSaveTimeCount;

bHold=0;

}

}

else if

( nTimeCount

ed )

nNowStatus=statusNSGreenE

WRed;

else if

( nTimeCount

ed )

nNowStatus=statusNSFlashE

WRed;

else if

( nTimeCount

Red )

nNowStatus=statusNSYellow

EWRed;

else if

( nTimeCount

low )

nNowStatus=statusNSRedEWY

ellow;

else if

( nTimeCount

en )

nNowStatus=statusNSRedEWG

reen;

else if

( nTimeCount

sh )

nNowStatus=statusNSRedEWF

lash;

else if

( nTimeCount

low1 )

nNowStatus=statusNSRedEWY

ellow;

else if

( nTimeCount

Red1 )

nNowStatus=statusNSYellow

EWRed;

if

( nNowStatus==nOldStatus )

{

switch

( nNowStatus )

{

case

statusNSFlashEWRed:

nWork1=nTimeCount-nStatus

NSGreenEWRed;

nWork2=nStatusNSYellowEWR

ed-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-nStatus

NSRedEWGreen;

nWork2=nStatusNSRedEWYell

ow1-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=nStatusNSGreenEWRe

d/20;

if

( nWork1>0 )

{

相关主题
相关文档
最新文档