资源描述
嵌入式系统设计专题实践
交通灯控制系统
专业:电子信息工程
班级:电子1102
姓名:XXX
学号:XXXXXXXX
同组人:XXX
指导教师:XXX
目录
一、方案设计与论证 1
1.1系统任务描述 1
1.2系统方案设计 4
1.3系统框图 4
二、硬件电路设计 4
2.1控制器最小系统设计 4
2.2数码管显示模块设计 6
2.3交通灯指示模块设计 8
三、系统软件设计 8
3.1系统软件流程图 8
3.2 500ms定期器子程序设计 9
3.3 计数显示子程序设计 10
四、系统调试 11
4.1硬件调试 11
4.2软件调试 11
4.3 综合调试 11
五、结论 12
六、心得体会 13
七、附录 15
7.1实物图..............................................................15
7.1参考文献 16
7.2示例代码 16
摘要
随着移动设备的流行和发展,嵌入式系统已经成为一个热点。它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的规定。嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大减少。最近的一种趋势是一个功能强大的嵌入式系统通常需要一种操作系统来给予支持,这种操作系统是已经成熟并且稳定的,本文将介绍一种基于飞思卡尔K60P144M100SF2RM控制的交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用嵌入式系统,本系统性能稳定,功能完善,实用性强。
关键词:交通灯 K60P144M100SF2RM 嵌入式系统 定期显示
一、方案设计与论证
1.1 系统任务描述
本次设计中根据实际需要,结合嵌入式系统的特点,完毕对交通灯的控制系统设计。系统功能涉及实现对车辆的直行,左拐、停止等待等功能。基于飞思卡尔K60P144M100SF2RM控制器,实现对车辆进行指导控制。本系统中重要由控制器最小系统、数码管显示模块、交通灯模块等相关模块构成。系统任务涉及三个环节。
假设十字路口南北方向为主干车道,东西方向为支干道。
1)完毕交通灯的变化规律,就是一个十字路口分别为东西向和南北向,四个路口均有红黄绿三灯和两位LED数码显示管,及每个路口有一个人行道交通灯。
2)交通灯上电后进入初始状态即东西红灯常亮60s,南北绿灯常亮60s,第一种状态:南北绿灯亮通车,东西红灯亮严禁通行,当东西红灯亮时,东西方向的人行道为绿灯,连续60s后转第二个状态:南北绿灯灭转黄灯闪亮10次,延时10s,东西仍然红灯,东西方向人行道仍为绿灯;10s后转第三个状态:东西绿灯亮通车60s,南北转红灯严禁通行60s,南北方向人行道为绿灯连续60s ;60s后转第四个状态:东西绿灯灭转黄灯闪亮10次,延时10s,南北仍然红灯,南北方向人行道仍为绿灯。最后循环至第一种状态。
3)用4个两位一体LED数码管(各个方向均有1个两位一体LED数码管,分别表达个位和十位)显示倒计时。倒计时用于提醒驾驶员和行人信号灯发生变化的时间,以便他们在“停止”和“通行”两者作出合适的选择。
以下为系统的工作状态图:
状态2
10s
状态3
60s
状态1
60s
图1-1工作状态图
下为本系统的工作方式图
图1-2工作方式图(1)
图1-2工作方式图(2)
1.2系统方案设计
本系统基于K60P144M100SF2RM控制器设计的交通灯控制系统。设计过程重要采用自上向下的设计思绪和模块化设计的设计思想,对软件和各个硬件模块进行独立设计,综合调试。软件涉及显示、定期器、GPIO、时钟等设立。硬件电路涉及由三极管驱动的数码管显示电路以及交通灯显示电路。
1.3系统框图
电源
交
通
灯
指
示
模
块
K60P144M100SF2RM
控制器
最小系统
数码管显示计时模块
图1-3系统框图
二、硬件电路设计
本系统中硬件系统涉及K60P144M100SF2RM最小系统设计、数码管显示模块、交通灯显示模块。采用模块化设计的思想对以上模块进行设计。
2.1 K60P144M100SF2RM最小系统设计
Kinetis是低功耗可扩展和在工业上使用混合信号ARM Cortex-M4系列的
最佳的组合。Kinetis MCUs使用了飞思卡尔的新的90nm带有独特FlexMemory的薄膜存储器(TFS)闪存技术。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控制器在性能上有较多的优点和较低的功耗,因而适合用来开发交通灯控制系统。以下为本控制器的最小系统原理图:
图2-1最小系统原理图
2.2数码管显示模块设计
LED 显示器采用发光二极管显示字段。单片机糸统中经常采用的是八段显示器,即LED显示器中有8个发光二极管,每段LED的笔画分别称为 a、b、c、d、e、f、g,代表“a.b.c.d.e.f.g.”七个字段和一个小数点“dp”。它有共阴和共阳两种结构。七段LED的阳极连在一起称为共阳极接法 ,而阴极接在一起的称为共阴极接法。
图2-2数码管
图2-2 七段LED的段代码
数码管的驱动分为静态和动态驱动。在本系统中采用两个共阳数码管进行动态显示。分别对三个状态进行计时,个位和十位分别用一个数码管显示,每次计时加一的时间是1s。以下是本模块的原理图:
图2-3四位共阳数码管
其中由数码管的位选端和段选端进行控制数码管的显示程序。根据PNP三极管的导通原理,当位选端为低电平时,三极管导通,根据共阳极编码进行合理设立即可。此外用三极管驱动数码管的因素是三极管显示更明亮一些。用数码管显示效果比较直观。
2.3交通灯指示模块
由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,指挥车辆通行。绿灯是通行信号,面对绿灯的车辆可以直行,红灯是严禁通行信号,面对红灯的车辆必须在路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。
三、软件设计
3.1软件系统流程图
在系统的软件设计时,需要对系统时钟进行设计,以满足对本次系统的功能需求。还需对GPIO端口进行初始化设立,500ms定期延迟设立。然后需要考虑交通灯的三个工作状态,合理安排显示与计数的时序关系。
开始
数码管显示
计数程序
500ms定期器设立
时钟设立
系统初始化程序
交通指示灯交替亮灭
计数结束?
N
Y
Y
结束
图3-1软件系统流程图
3.2 500ms定期器子程序设计
本模块是将产生500ms定期器,让在计数器计数时提供计时间隔,同时也可作为数码管个位和十位的刷新时间,即每次数码管显示更新递增一个数字通过的时间是1s。以下是本模块的子程序软件流程图:
开始
设立LPTMR定期器
设立count_val比较值
1KHz LPO时钟计数
到达count_val值?
N
Y
触发输出
清除标志位
结束
图3-2 定期器流程图
3.3 计数显示子程序设计
计数显示是在定期器运营前提下进行工作的。数码管每刷新一个数时,时间是1s。这样的好处是显示与指示灯状态同步起来。同时也能做到效果比较直观。以下是此部分模块的流程图:
dis_1>10 ?
dis_2>60?
dis_2++
数码管译码指示灯亮
1000ms定期器
dis_0>60
dis_0++
1000ms定期器
指示灯亮
1000ms定期器
dis_0=0 dis_1=0
dis_2=0初始化
开始
数码管译码指示灯亮
dis_1++
图3-3计数器
四、系统调试
4.1硬件调试
在硬件调试时,K60最小系统的调试就是用集成Mini核心板进行调试,当系统上电后,将系统示例程序下载到开发板中,用一个示例LED等进行测试能否正常运营。在GPIO端口进行初始化后,应对端口进行合理设立。
在对核心板程序下载成功后,在程序能对的运营时,可以根据共阳数码管的特点进行测试,对显示电路能否正常工作进行测试。验看数码管计数时是否与预想的同样,若不同样营及时修正程序。最终使结果出现与预期同样。
4.2软件调试
在软件调试时,在IAR for ARM 6.30版本平台上进行编程下载,通过J—LinkJI进行下载到K60核心板中。在调试时可以用单步调试,全速运营,设立断点等方式。与此同时观看寄存器和变量的值在调试中经常发挥着重要作用。在修改和完善程序后,最终下载到核心板中运营。
图4-1软件编程界面
4.3 综合调试
测试一开始,我们就发现了系统出现了两个问题:一是有一部分交通灯亮度不够,所发出来的光非常的薄弱以致于几乎感觉不到它的亮度;二是数码管不工作,没有时间显示。这与设计的规定完全不符。为了找出这个问题和解决方法,我们查找了电路的输出各部分的输出电平。发现了一个现象,我们采用的数码管是共阴极数码。而控制数码段显示的P1口输出的是高电平。
经多方查阅资料,解决第二个问题可以有两个解决方法。其一,将硬件电路作修改,将数码管换成共阳极的数码管。这样数码管就可以正常进行时间显示了。其二,修改程序,让控制数码管段码的P1输出的是低电平。若采用修改硬件电路的方法的话,硬件电路就得作变动。已经布好的线也必须有相应的变动,操作起来比较麻烦。所以,我们采用了第二种方法。修改了程序电路中的段码代码。再次调试,按照设计规定的指标,系统数码管电路部分基本能按照预先设定的规定来进行倒计时的显示。亮度规定也基本符合预先设想。
接下来尚有一个问题有待解决,交通灯亮度局限性,以致于部分交通灯只能勉强看得出来它在亮而已。这明显不能满足设计规定。经多方检测,我们认为这是由于LED灯驱动能力局限性引起的亮度弱问题。若要修正这个问题,那就得为LED灯增长驱动电路以提高电路的驱动能力。要实现这一环节必须对硬件电路进行一定的改动。LED灯的驱动电路可以用集成电路电路芯片来进行驱动。在初步方案中我们考虑要用集成电路来完毕。但是由于客观方面的因素,将要参与工作离开学校没有制作实物的环境条件。因此,这部分改善只作了一个设想,并没有时间去付诸实行。但基本问题和解决问题的原理我们还是有一定的了解。
五、总结
本次基于飞思卡尔K60P144M100SF2RM控制器设计的交通灯控制系统,通过合理的软件设计和硬件设计,实现了交通灯绿灯亮60秒,黄灯亮10秒,红灯亮60秒,对南北主干道方向和东西支干道车辆进行直行和左转控制。用红、绿、黄LED发光二极管代替实际中的交通指示灯,用数码管对亮灭时间进行计时,使结果直观。
六、心得体会
通过嵌入式课程设计,我不仅加深了对嵌入式理论的理解,将理论很好地应用到实际当中去,并且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。使之不断地战胜别人,超越前人。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不容易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
7.1实物图
(1)
(2)
(3)
7.2参考文献
[1]《嵌入式系统原理与实践——ARM Cortex M4 Kinetis微控制器》王宜怀著 电子工业出版社;
[2]《MC9S12XS 单片机原理及嵌入式系统开发》王宜怀著 电子工业出版社;
[3]付家才.单片机控制工程实践技术【M】.北京:化学工业出版社
[4]《单片机原理及应用》,李建忠著,西安,西安电子科技大学;
[5]《模拟电子技术基础》,童诗白,华成英等著,北京,高等教育出版社;
[6]《C程序设计》,谭浩强著,北京,清华大学出版社;
7.3示例代码:
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_MASK|PORT_PCR_PS_MASK;
//PORTE_PCR26=PORT_PCR_MUX(1)|PORT_PCR_IRQC(0xA)|PORT_PCR_PE_MASK|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));
}
展开阅读全文