嵌入式交通信号灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式系统设计专题实践交通灯控制系统
专业:电子信息工程
班级:电子 1102 班
学生姓名:王石岩
学号: 1110910213
指导教师:高华
目录
一、方案设计与论证................................ 错误!未定义书签。

1.1系统任务描述................................. 错误!未定义书签。

1.2系统方案设计................................. 错误!未定义书签。

1.3系统框图 (5)
二、硬件电路设计 (5)
2.1 K60P144M100SF2RM最小系统设计 (5)
2.2数码管显示模块设计 (7)
2.3交通灯指示模块设计 (8)
三、系统软件设计 (8)
3.1系统软件流程图 (8)
3.2 500ms定时器子程序设计 (9)
3.3 计数显示子程序设计 (10)
四、系统调试 (12)
4.1硬件调试 (11)
4.2软件调试 (11)
4.3 综合调试 (12)
五、总结 (12)
六、心得体会 (12)
七、附录 (13)
7.1系统实物图 (13)
7.2程序代码 (14)
7.3参考文献 (19)
摘要
当前伴随着信息化社会的快速发展,国家不断走向繁荣昌盛。

与此同时,快节奏也成为当代人们在各大城市的主要特征。

当今社会上汽车越来越多,为了减少城市交通阻塞和维持良好稳定的交通次序、加强对道路的管理力度。

因此合理设计交通灯控制系统对维护道路安全和社会交通次序有着不可替代的作用。

本文主要阐述交通灯控制系统的设计原理和过程,采用飞思卡尔K60作为系统的控制芯片,对系统的软件和硬件进行模块化设计,最终实现了基于飞思卡尔K60芯片的交通灯控制系统。

该系统用红、黄、绿三种颜色的发光二极管来代替三种实际中的交通灯,在控制器的驱动下来形象化的演示实际中交通灯的运行模式和工作过程。

最终该系统实现了对车辆直行、左转、停止等待等基本功能。

能够有效地对城市中的车辆产生明确的指导和控制。

关键词:交通灯 K60P144M100SF2RM 数码管定时显示
一、方案设计与论证
1.1系统任务描述
本次设计中根据实际需要,结合嵌入式系统的特点,完成对交通灯的控制系统设计。

系统功能包括实现对车辆的直行,左拐、停止等待等功能。

基于飞思卡尔K60P144M100SF2RM控制器,实现对车辆进行指导控制。

本系统中主要由控制器最小系统、数码管显示模块、交通灯模块等相关模块构成。

系统任务包括三个环节。

假设十字路口南北方向为主干车道,东西方向为支干道。

状态一:南北方向、东西方向均设有红、黄、绿三个指示灯。

首先南北方向绿灯亮一分钟、东西方向红灯亮一分钟。

此时处于向北方向的车辆处于绿灯状态,可以直行通过十字路口,而处于向东方向的车辆由于是红灯等待则不能前行,需在线外等待向东方向的绿灯来临才能前行。

状态二:一分钟之后,北方向的绿灯变为黄灯亮,且亮十秒钟。

而在向东方向的红灯还没转变状态,红灯此时会连续闪烁10秒钟,作为东西方向
将变成绿灯通行状态的提示。

与此同时,向西方向的左转指示灯会变亮,也是亮10秒钟,车辆可以左转。

状态三:10秒钟过后,北方向的黄灯灭,红灯亮60秒,处于主干道上的车辆不能直行通过。

与此同时东方向的红灯会灭,绿灯亮60秒,处于干道上的车辆可以直行。

向北方向的车辆不能左转。

左转指示灯会熄灭。

状态三执行完毕重新进入状态一开始执行,整过过程在K60控制器上电以后就进入工作状态,无需人工干预。

图1—1为系统的工作状态图:
图1—1 系统的工作状态图
图1—2 系统的工作方式图
1.2系统方案设计
本系统基于K60P144M100SF2RM控制器设计的交通灯控制系统。

设计过程主要采用自上向下的设计思路和模块化设计的设计思想,对软件和各个硬件模块进行独立设计,综合调试。

软件包括显示、定时器、GPIO、时钟等设置。

硬件电路包括由三极管驱动的数码管显示电路以及交通灯显示电路。

1.3系统框图
图1—3 系统框图
二、硬件电路设计
本系统中硬件系统包括K60P144M100SF2RM最小系统设计、数码管显示模块、交通灯显示模块。

采用模块化设计的思想对以上模块进行设计。

2.1 K60P144M100SF2RM最小系统设计
Kinetis是低功耗可扩展和在工业上使用混合信号ARM Cortex-M4系列MCU 的最好的组合。

Kinetis系列MCU结合了最新的低功耗革新技术和高性能,高精密混合信号功能与连通,人机界面,安全及外设广泛。

Kinetis MCUs使用了飞思卡尔和ARM第三方合作伙伴的市场领先的捆绑模式。

所有Kinetis系列都包涵强大的逻辑、通信和时序阵列和带有伴随着闪存大小和I/O数量的集成度等级的控制外围部件。

Kinetis 产品组合内核具有以下特点:ARM Cortex-M4 内核带DSP 指令,性能可达 1.25 DMIPS/MHz ( 部分Kinetis 系列提供浮点单元);32 通道的DMA 可用于外设和存储器数据传输并减少CPU 干预;提供不同级别的CPU 频率50 MHz、72 MHz 和100 MHz (部分Kinetis 系列提供120 MHz 和150 MHz );10 种低功耗操作模式用于优化外设活动和唤醒时间以延长电池的寿命;行业领先的快速唤醒时间。

正是由于K60控制器在性能上有较多的优点和较低的功耗,因而适合用来开发交通灯控制系统。

以下为本控制器的最小系统原理图:
(1)
(2)
(3)
图2—1 最小系统原理图
2.2数码管显示模块设计
数码管分为七段和八段两种。

根据极性也可分为共阴和共阳两种类别。

其原理是根据发光二极管的组合成显示0~9,还包括字母A,B,C,D,E,F等。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

图2—2 数码管工作原理图
分别对三个状态进行计时,个位和十位分别用一个数码管显示,每次计时加一的时间是1s。

以下是本模块的原理图:
图2—3 数码管显示模块原理图
其中由数码管的位选端和段选端进行控制数码管的显示程序。

根据PNP 三极管的导通原理,当位选端为低电平时,三极管导通,根据共阳极编码进
行合理设置即可。

此外用三极管驱动数码管的原因是三极管显示更明亮一些。

用数码管显示效果比较直观。

2.3交通灯指示模块设计
本模块用红、黄、绿三种颜色的发光二极管来代替实际中的交通指示灯。

红灯亮则表示车辆停止等待,黄灯亮则表示绿灯在向红灯的跳变过程中允许已经越过规定线的车辆继续前行。

绿灯则表示车辆可以直行通过。

在此系统中,一共有7个指示灯。

图2—4 交通灯指示模块原理图
三、系统软件设计
3.1系统软件流程图
在系统的软件设计时,需要对系统时钟进行设计,以满足对本次系统的功能需求。

还需对GPIO端口进行初始化设置,500ms定时延迟设
置。

然后需要考虑交通灯的三个工作状态,合理安排显示与计数的时序
关系。

N
Y
图3—1 系统软件流程图
开始
系统初始化程序
时钟设置交通指示灯交替亮灭
500ms定时器设置
计数程序
数码管显示
计数结
束?
结束
3.2 500ms定时器子程序设计
本模块是将产生500ms定时器,让在计数器计数时提供计时间隔,同时也可作为数码管个位和十位的刷新时间,即每次数码管显示
更新递增一个数字经过的时间是1s。

以下是本模块的子程序软件流程
图3—2 定时器子程序软件流程图
3.3 计数显示子程序设计
计数显示是在定时器运行前提下进行工作的。

数码管每刷新一个数时,时间是1s。

这样的好处是显示与指示灯状态同步起来。

同时也能做到效果比较直观。

以下是此部分模块的流程图:
图3—3 计数显示模块流程图
四、系统调试
4.1硬件调试
在硬件调试时,K60最小系统的调试就是用集成Mini核心板进行调试,
当系统上电后,将系统示例程序下载到开发板中,用一个示例LED等进行测试能否正常运行。

在GPIO端口进行初始化后,应对端口进行合理设置。

在对核心板程序下载成功后,在程序能正确运行时,可以根据共阳数码管的特点进行测试,对显示电路能否正常工作进行测试。

验看数码管计数时是否与预想的一样,若不一样营及时修正程序。

最终使结果出现与预期一样。

4.2软件调试
在软件调试时,在IAR for ARM 6.30版本平台上进行编程下载,通过J—LinkJI进行下载到K60核心板中。

在调试时可以用单步调试,全速运行,设置断点等方式。

与此同时观看寄存器和变量的值在调试中常常发挥着重要作用。

在修改和完善程序后,最终下载到核心板中运行。

以下是IAR 开发界面:
图4—1 IAR 开发界面图
4.3 综合调试
在综合调试时,首先应确保硬件和软件都调试完毕,将程序下载到硬件系统中后,首先应注意以下事项;
在上电之前应用数字万用表检测硬件电路的电源VCC和地是否导通,若导通,应及时检查后确保不能让电源和地短路;同时检测电路是否有虚焊现象,应及时解决这些可能对结果造成不良影响的问题,然后才能上电。

上电之后,观看实验效果,看数码管刷新时间和交通指示灯亮灭是否和预期相同,若时序不符合要求,应及时调整硬件或者软件。

在与核心板连接线时,应避免与IO口短接,造成数码管显示乱码或者显示效果不佳。

五、总结
本次基于飞思卡尔K60P144M100SF2RM控制器设计的交通灯控制系统,通过合理的软件设计和硬件设计,实现了交通灯绿灯亮60秒,黄灯亮10秒,红灯亮60秒,对南北主干道方向和东西支干道车辆进行直行和左转控制。

用红、绿、黄LED发光二极管代替实际中的交通指示灯,用数码管对亮灭时间进行计时,使结果直观。

六、心得体会
本次关于嵌入式系统设计专题实践,通过用基于Cortex-M4内核的K60P144M100SF2RM控制器,我对嵌入式系统设计有了进一步的认识。

在本次系统设计过程中,主要采用的是模块化设计的思想和自顶向下的设计原则,将功能细化,每一功能对应一个功能子程序。

在软件设计时我进一步体会到了画流程图的重要性。

面对一个系统设计时,我们首先应该将功能划分和细化,每一部分可以画一些单个的子程序流程图,这样在软件设计时可以会在思绪上要清晰一些。

调试步骤则采用硬件和软件分开调试,最后再综合调试的方案。

在软件调试时,我们首先将程序编译通过后,经过J-Link下载到核心板中,然后可以在线仿真和调试。

在调试时,除了首先全速运行程序外,如果运行结果不太理想,这时我们可以采用单步调试,设置断点等方式进行调试。

还有需要注意的是,在烧写程序时,不能直接从核心板上拔下J-Link,应断电后小心取下。

关于软件调试和软件编写在本次实践中我的感悟还是挺多的。

在硬件调试时,一开始在程序正常运行时数码管始终效果不明显,后来分析得知是驱动电流不大造成数码管显示比较暗的。

最后的解决办法是在数码管的位
选端加了三极管进行放大,最终数码管显示的效果才会直观,明亮。

在测试LED 灯的好坏时,我由于没有考虑到发光二极管的导通电压,以为这个直径较大的发光二极管应该在3.3V电压时是不会击穿的。

因而也为了简易就没有加上限流电阻。

最后在测试时,在接上3.3V电压时,红色和黄色的LED发光二极管都在瞬间被击穿,只有绿灯能够正常导通发光。

所幸的是核心板有短路保护模式,不然结果是比较严重的。

最终我还是都接上了330欧姆的限流电阻,才解决这个问题。

这些都是我在不了解元器件的前提下所犯的错误。

通过此次实践,也让我吸取了这一点教训。

在实验之前,应对元器件有了基本的了解才能去利用它们进行设计。

通过这次交通灯的实验,我学会并了解了一些嵌入式与单片机的相同和不同之处,更让我感到了嵌入式的强大。

以往在单片机的学习和课程设计中,一些知识点并不会显的十分复杂,而现在的嵌入式系涉及到了更多的知识和复杂的理论。

因为嵌入式不仅仅是一个高级的一些的单片机,而是涉及到了系统的概念,从功能上还是应用、实时、稳定上都要优于单片机。

另外,从做交通灯的实验中,学习和巩固了以前的编程知识,还有对天一些电路的分析,数电模电的知识等。

更重要的是在这次实验中,得到了动手能力和思维方式的锻炼。

做为一名自动化专业的学生,动手能力和思维方式的锻炼是成为得要的,特别在以后遇到问题时要有解决问题的能力。

七、附录
7.1系统实物图
·
(1)
(2)
(3)
图7—1 系统实物图
7.2程序代码:
void main (void)
{
//int m=0;
//printf("TWR-K60N512 GPIO Example!\n");
// uint i=0;
/* Turn on all port clocks */
SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK |
SIM_SCGC5_PORTE_MASK;
/* Enable GPIOA and GPIOE interrupts in NVIC */
//enable_irq(87); //GPIOA Vector is 103. IRQ# is 103-16=87 //enable_irq(91); //GPIOE Vector is 107. IRQ# is 107-16=91
/* Initialize GPIO on TWR-K60N512 */
init_gpio();
gpio_set (PORTB, 21, 1);
gpio_set (PORTB, 20, 1);
gpio_set (PORTA, 17, 0);
gpio_set (PORTA, 16, 0);
gpio_set (PORTA, 15, 0);
gpio_set (PORTA, 14, 0);
gpio_set (PORTA, 13, 0);
gpio_set (PORTA, 12, 0);
data7();
while(1)
{
for(dis_0 =0;dis_0<62;dis_0++)
{
if(dis_0<=60)
{
gpio_set (PORTA, 17, 1);
gpio_set (PORTA, 16, 1);
data7();
//time_delay_ms(1000);
gpio_set (PORTB, 20,0);
//time_delay_ms(1000);
Gpio_set_Pin(PORT_D,dis_code[dis_0%10]);
//gpio_set (PORTB, 20,1);
time_delay_ms(500);
//data7();
//delay();
gpio_set (PORTB, 20, 1);
data7();
gpio_set (PORTB, 21, 0);
Gpio_set_Pin(PORT_D,dis_code[dis_0/10]); //time_delay_ms(100);
//data7();
// delay();
time_delay_ms(500);
data7();
gpio_set (PORTB, 21,1);
//time_delay_ms(1000);
}
if(dis_0>60)
{
gpio_set (PORTB, 21, 1);
gpio_set (PORTB, 20, 1);
gpio_set (PORTA, 17, 0);
//gpio_set (PORTA, 13, 1);
for(dis_1 =0;dis_1<12;dis_1++)
{
if(dis_1<=10)
{
gpio_set (PORTA, 15, 1);
gpio_set (PORTA, 13, 1);
data7();
//time_delay_ms(1000);
gpio_set (PORTB, 20,0);
//time_delay_ms(1000);
Gpio_set_Pin(PORT_D,dis_code[dis_1]);
//gpio_set (PORTB, 20,1);
time_delay_ms(500);
gpio_set (PORTA, 16, 1);
//delay();
time_delay_ms(500);
gpio_set (PORTA, 16, 0);
//data7();
//delay();
///io_set (PORTB, 20, 1);
//data7();
//gpio_set (PORTB, 21, 0);
//Gpio_set_Pin(PORT_D,dis_code[dis_1/10]); //time_delay_ms(100);
//data7();
// delay();
//time_delay_ms(500);
//data7();
//gpio_set (PORTB, 21,1);
//time_delay_ms(1000);
}
if(dis_1>10)
{
gpio_set (PORTB, 20,1);
gpio_set (PORTB, 21,1);
gpio_set (PORTA, 16, 0);
gpio_set (PORTA, 15, 0);
gpio_set (PORTA, 13, 0);
for(dis_2=0;dis_2<61;dis_2++)
{
if(dis_2<60)
{
gpio_set (PORTA, 14, 1);
gpio_set (PORTA, 12, 1);
data7();
//time_delay_ms(1000);
gpio_set (PORTB, 20,0);
//time_delay_ms(1000);
Gpio_set_Pin(PORT_D,dis_code[dis_2%10]);
//gpio_set (PORTB, 20,1);
time_delay_ms(500);
//data7();
//delay();
gpio_set (PORTB, 20, 1);
data7();
gpio_set (PORTB, 21, 0);
Gpio_set_Pin(PORT_D,dis_code[dis_2/10]); //time_delay_ms(100);
//data7();
// delay();
time_delay_ms(500);
data7();
gpio_set (PORTB, 21,1);
}
if(dis_2>=60)
{
gpio_set (PORTB, 20,1);
gpio_set (PORTB, 21,1);
gpio_set (PORTA, 14, 0);
gpio_set (PORTA, 12, 0);
//gpio_set (PORTA, 13, 0);
}
//time_delay_ms(1000);
}
}
}
}
}
}
}
void init_gpio()
{
//Set PTA19 and PTE26 (connected to SW1 and SW2) for GPIO functionality, falling IRQ,
// and to use internal pull-ups. (pin defaults to input state)
//PORTA_PCR19=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MA
SK|PORT_PCR_PS_MASK;
//PORTE_PCR26=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MA
SK|PORT_PCR_PS_MASK;
//Set PTB10, PTB21, PTB21, and PTB23 (connected to LED's) for GPIO functionality//修改适合本电路板
PORTB_PCR20=(0|PORT_PCR_MUX(1));
PORTB_PCR21=(0|PORT_PCR_MUX(1));
//PORTB_PCR22=(0|PORT_PCR_MUX(1));
//PORTB_PCR23=(0|PORT_PCR_MUX(1));
PORTD_PCR0=(0|PORT_PCR_MUX(1));
PORTD_PCR1=(0|PORT_PCR_MUX(1));
PORTD_PCR2=(0|PORT_PCR_MUX(1));
PORTD_PCR3=(0|PORT_PCR_MUX(1));
PORTD_PCR4=(0|PORT_PCR_MUX(1));
PORTD_PCR5=(0|PORT_PCR_MUX(1));
PORTD_PCR6=(0|PORT_PCR_MUX(1));
PORTD_PCR7=(0|PORT_PCR_MUX(1));
PORTA_PCR17=(0|PORT_PCR_MUX(1));
PORTA_PCR16=(0|PORT_PCR_MUX(1));
PORTA_PCR15=(0|PORT_PCR_MUX(1));
PORTA_PCR14=(0|PORT_PCR_MUX(1));
PORTA_PCR13=(0|PORT_PCR_MUX(1));
PORTA_PCR12=(0|PORT_PCR_MUX(1));
//Change PTB20, PTB21, PTB22, PTB23 to outputs
GPIOB_PDDR=GPIO_PDDR_PDD(GPIO_PIN(20) | GPIO_PIN(21));
GPIOD_PDDR=GPIO_PDDR_PDD(GPIO_PIN(0) | GPIO_PIN(1) | GPIO_PIN(2) | GPIO_PIN(3)|GPIO_PIN(4)|GPIO_PIN(5)|GPIO_PIN(6)|GPIO_PIN(7));
GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(17)|GPIO_PIN(16)|GPIO_PIN(15)
|GPIO_PIN(14)|GPIO_PIN(13)|GPIO_PIN(12));
}
7.3参考文献
[1]何立民.单片机应用技术大全.北京:北京航空航天大学出版社,1994;
[2]付家才.单片机控制工程实践技术【M】.北京:化学工业出版社,2004;
[3]《单片机原理及应用》,李建忠著,西安,西安电子科技大学,2002;
[4]《模拟电子技术基础》,童诗白,华成英等著,北京,高等教育出版社,2000;
[5]《Protel DXP 高级应用》,张伟等著,北京,人民邮电出版社,2002;
[6]《C程序设计》,谭浩强著,北京,清华大学出版社,2004;
[7] 《单片机嵌入式应用的在线开发方法》,邵贝贝著,北京,清华大学出版
社,2004.。

相关文档
最新文档