用DSP的GPIO口实现控制交通灯

更新时间:2023-11-22 16:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

用DSP的GPIO口实现控制交通灯

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实验总体方案

本次设计过程中主要利用了F2812的通用I/O来实现对东西南北方向红绿灯亮灭的控制,以及数码管显示的控制。而实现定时的操作主要通过定时器0中断调用来实现。硬件设计的总框图如下:

1.3实验原理

1.2.1 F2812中GPIO的介绍

F2812有多达56个通用数字量输入输出端口(GPIO),其中绝大部分是通用I/O和专用功能复用引脚。数字量I/O端口模块采用一种灵活配置的方法控制复用引脚功能。

GPxMUX寄存器:选择F2812的引脚操作模式。 GPxDIR寄存器:配置数字量I/O的方向。 GPxSET寄存器:对数字量进行置位。 GPxDAT寄存器:独立读/写I/O信号。

GPxQUAL寄存器:消除数字量I/O引脚的噪声信号。 GPxCLEAR寄存器:对数字量进行清零。 1.2.2定时器0及其中断介绍

F2812器件上有3个32位的CPU定时器(TIMERO/1/2)。定时器1和2留给实时操作系统DSP/BIOS使用,只有定时器0可以在应用程序中使用。 若处理器采用30MHz的外部时钟经过锁相环10/2倍频之后,系统时钟工作在150MHz,一旦定时器被使能,定时器时钟经过与预定标记数器递减计数,预订标计数器产生下溢之后向定时器的32位计数器借位。最后定时器产生溢出使定时器向CPU发出中断。每次预订计数器产生溢出后使用分频寄存器中的值重新装载,同样的32位周期寄存器为32的计数器提供重新装载值。

2.1实验硬件部分

2.1.1硬件总体设计

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

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

110 紧急车要通过, 此时就可以通过小键盘进行突发状况模拟。通过按键进

入到中断服务子程序, 相当于原来先要通过的车辆在突发状况来了以后就要先让紧急车辆通过。原理框图如图3.1所示。

TMS320F2812PGFA JTAG JTAG SRAM:64K*16bit 数据 地址 扩展DSP引脚 控制 I/O PWM SPI CPLD PORT A/D 片上资源: 主频:150MHz RAM:128K*16bit 16路,12bit DSP总线 FLASH128*16bit CAN RS232 CAN 驱动 驱动 LED 4个用户可控开关 图2.1 ICETEK-F2812-AE原理框图

2.1.2 交通灯显示模块

利用ICETEK-CTR上的一组发光二极管(共12只,分为东西南北四组、红黄绿三色)的亮灭实现交通信号的模拟。TMS320F2812 DSP有最多56个专门的通用输入输出管脚。这些通用输入输出管脚通过专用寄存器可以由软件控制,比如指定输入、输出以及输出值等。通过ICETEK-F2812-AE评估板的插座,扩展板(通用输出/控制模块ICETEK-CTR)将板上的一个指示灯和DSP的一个通用输入/输出管脚直接相连。这个管脚为PWM12,可以设置成通用输入/输出管脚使用。扩展原理如图3.2所示。

图2.2 发光二极管设计原理

2.1.3计数显示模块

计数显示采用放光二极管显示阵列显示。TMS320F2812 DSP的存储器扩展接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线和一组控制线,ICETEK-F2812-A评估板已将这些扩展线引到了板上的扩展插座上,供扩展使用。发光二极管显示阵列由扩展端口控制,EMIF接口的两个寄存器提供具体控制。原理图如图3.3所示。

图2.3 计数显示原理

2.1.4开关模块

开关模块采用外部外部存储器扩展接口(EMIF)上的PS2接口键盘,通过扫描码判断输入键值。TMS320F2812 DSP的扩展存储器接口(EMIF)用来与大多数外围设备进行连接,典型应用如连接片外扩展存储器等。这一接口提供地址线、数据线和一组控制线,ICETEK-F2812-A评估板已将这些扩展线引到了板上的扩展插座上。键盘的扫描码由DSP的扩展地址0x108001给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0。开关设计原理如图3.4所示。

图1.4 开关设计原理

3.1程序流程

该设计实现的功能是南北方向绿灯,东西红10秒,南北方向绿灯闪烁3次,东西红灯4秒,南北方向黄灯,东西红灯2秒,南北方向红灯,东西方向绿灯10秒,南北方向红灯,东西方向绿灯闪3次4秒,南北方向红灯,东西方向黄灯(2秒)。在紧急情况下,当任意方向通行剩余时间多于10秒,将时间改成10秒,正常变换到四面红灯20秒,然后直接返回正常信号顺序的下一个通行信号(跳过闪烁绿灯、黄灯状态)。程序流程图如图4.1所示。

开始 定时器中断服务程序入口 初始化: CPU频率、ICETEK-CTR、定时器、 中断控制寄存器、工作变量 根据定时器计数确定当前状态 计数工作变量值在原基础上加1 根据当前状态设置发光二极管显示阵列状态

图3.1 程序流程图

结束 结束? 设置突发事件标志 否 键盘中断服务程序入口 读取键盘输入 根据当前状态设置指示灯状态 退出定时器中断服务程序 是 退出键盘中断服务程序 4.1实验调试

4.1.1电源调试

1.连接电源:打开实验箱,取出三相电源连接线(如右图),将电源线的一端插入实验箱外部左侧箱壁上的电源插孔中。确认实验箱面板上电源总开关(位于实验箱底板左上角)处于“关”的位置,连接电源线的另一端至220V 交流供电插座上,保证稳固连接。

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

源断开。连接ICETEK-CTR 板上边插座到实验箱底板上+12V电源 插座;ICETEK-CTR 板下边插座到实验箱底板上+5V 电源插座;如使用PP(并口)型仿真器,则连接仿真器上插座到实验箱底板上+5V电源插座;连接DSP 评估板模块电源插座到实验箱底板上+5V 电源插座。注意各插头要插到底,防止虚接或接触不良。

3.连接DSP 评估板信号线:当需要连接信号源输出到A/D 输入插座时,使用信号连接线(如右图)分别连接相应插座。

4.接通电源:检查实验箱上220V 电源插座(箱体左侧)中保险管是否完好,在连接电源线以后,检查各模块供电连线是否正确连接,打开实验箱上的电源总开关(位于实验箱底板左上角),使开关位于“开”的位置,电源开关右侧的指示灯亮。 4.1.2 Emulator调试 1.启动Simulator 方式

双击桌面上图标: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)双击桌面上仿真器初始化图标:如果出现下面图5.1提示窗口,表示初

始化成功,按一下空格键进入下一步操作。

图4.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 仿真器”。

⑩如果遇到反复不能连接或复位仿真器、进入CCS 报错,请打开Windows 的“任务管理器”,在“进程”卡片上的“映像名称”栏中查找是否有“cc_app.exe”,将它结束再试。

4.1.3软件调试

CCS 可以工作在纯软件仿真环境中,就是由软件在PC 机内存中构造一个虚拟的DSP 环境,可以调试、运行程序。但一般软件无法构造DSP 中的外设,所以软件仿真通常用于调试纯软件的算法和进行效率分析等。 在使用软件仿真方式工作时,无需连接板卡和仿真器等硬件。

(1)单击桌面上图标:进入CCS 设置窗口。

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

图4.2 仿真设置图

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

此时CCS 已经被设置成Simulator 方式(软件仿真TMS320VC5416 器件的方式),如果一直使用这一方式就不需要重新进行以上设置操作了。

2. 设置CCS 通过ICETEK-5100USB 仿真器连接ICETEK-VC5416-A 硬件环境进行软件调试和开发。

(1)单击桌面上图标:进入CCS 设置窗口

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

图4.3 CSS2设置图

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

图4.4 CSS2设置图

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

图4.5 CSS2设置图

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

图4.6 CSS2设置图

以上设置完成后,CCS 已经被设置成Emulator 的方式(用仿真器连接硬件板卡的方式),并且指定通过ICETEK-5100USB 仿真器连接ICETEK-VC5416-A 评估板。如果您需要一直使用这一方式就不需要重新进行以上设置操作了。 5.2.2程序运行

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

图4.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:\\ti\\C5400\\cgtools\\lib\\rts.lib。

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

4.1.4系统下载

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

C:\\ICETEK-VC5416-EDULab\\Lab0601-UseCCS\\Debug\\Trafficlight.out 文件。 (2) 设置软件调试断点:在项目浏览窗口中,双击Trafficlight.c 激活这个文件,移动光标到main()行上,单击鼠标右键选择Toggle Breakpoint 或按F9 设置断点(另外,双击此行左边的灰色控制条也可以设置或删除断点标记)。 (3) 利用断点调试程序:选择Debug→Run 或按F5 运行程序,程序会自动停在main()函数上。

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

5.1实验程序

源程序 main() {

int nWork1,nWork2,nWork3,nWork4; int

nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;

unsigned int nScanCode;

nTimeCount=0; bHold=0;

uLightStatusEW=uLightStatusSN=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

nNowStatus=statusNSGreenEWRed;

else

if

(

nTimeCount

nNowStatus=statusNSFlashEWRed;

else

if

(

nTimeCount

nNowStatus=statusNSYellowEWRed;

else

if

(

nTimeCount

nNowStatus=statusNSRedEWYellow;

else

if

(

nTimeCount

nNowStatus=statusNSRedEWGreen;

else

if

(

nTimeCount

nNowStatus=statusNSRedEWFlash;

)

)

)

)

)

)

else if ( nTimeCount

nNowStatus=statusNSRedEWYellow;

else

if

(

nTimeCount

)

nNowStatus=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 )

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 ( nOldTimeCount!=nWork2 ) { }

nOldTimeCount=nWork2; SetLEDArray(nWork2); if ( nWork2>10 ) { }

nTimeCount=nWork1*10; nWork2=10;

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;

}

CTRLR=0; CTRLR=0x40;

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

CTRLR=0x0c1; // 开启发光二极管显示阵列 for ( k=0;k<8;k++ ) { }

k=CTRCLKEY;

// 清除键盘缓冲区

ledbuf[k]=0x0ff;

// 显示为空白

ledx[k]=(k<<4); // 生成显示列控制字

void interrupt xint2(void) // XINT2中断服务程序 { }

void EndICETEKCTR() { }

bHold=1;

int k; CTRLR=0; CTRLR=0x40;

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

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

// 清除键盘缓冲区

本文来源:https://www.bwwdw.com/article/ggpv.html

Top