基于ARM的交通灯设计说明书.docx
《基于ARM的交通灯设计说明书.docx》由会员分享,可在线阅读,更多相关《基于ARM的交通灯设计说明书.docx(15页珍藏版)》请在冰点文库上搜索。
基于ARM的交通灯设计说明书
\\
\\\\\\\\\sfe
攀枝花学院本科课程设计
基于ARM的交通灯设计
学生姓名:
学生学号:
院(系):
电气信息工程学院
年级专业:
指导教师:
二〇一四年十二月
摘要
本设计是基于STM32微控制器进行的交通灯设计.STM32是意法半导体以ARM为核心的微控制器。
交通灯通常指由红、黄、绿三种颜色灯组成用来指挥交通的信号灯。
绿灯亮时.准许车辆通行.黄灯亮时.已越过停止线的车辆可以继续通行;红灯亮时.禁止车辆通行。
交通灯的硬件设计主要由三部分组成:
微控制器最小系统.交通灯的信号灯.显示时间的数码管。
软件部分由三部分组成:
数码管显示函数.交通灯切换函数.时间计时函数。
交通灯工作的流程是计数器每秒钟减一.减到零时切换信号灯.在主函数中调用数码管显示函数.以便快速扫描显示。
交通灯设计的关键问题是实现信号灯切换、计数器自减、数码管扫描显示等功能。
同时该设计具有设计方法合理.简单易行.成本低.安全实用等特点.具有推广价值。
关键词微控制器.交通灯.数码管.STM32.ARM
1绪论
1.1本课题研究的背景及意义
随着社会的发展.人们不断地从农村涌入城市.城市人口越来越多.现在中国的千万级人口的城市越来越多。
人口多伴随的是车辆越来越多.而且我们的生活越来越好.私家车越来越多.如果没有一个良好的交通规则.那么城市的交通系统必然会瘫痪。
交通警察是有限的.这种情况下永不下岗的“交通警察”交通灯就派上大用场了。
现在的交通灯已经是城市中不可缺少的基础设施。
交通灯通常指由红、黄、绿三种颜色灯组成用来指挥交通的信号灯。
绿灯亮时.准许车辆通行.黄灯亮时.已越过停止线的车辆可以继续通行;红灯亮时.禁止车辆通行。
1.2国内外研究现状、水平
目前设计交通灯的方案有很多.西方国家已经有应用CPLD设计实现交通信号灯控制器方法;有应用PLC实现对交通灯控制系统的设计;有应用单片机实现对交通信号灯设计的方法。
目前.国内的交通灯一般设在十字路门.在醒目位置用红、绿、黄三种颜色的指示灯。
加上一个倒计时的显示计时器来控制行车。
对于一般情况下的安全行车.车辆分流尚能发挥作用.但根据实际行车过程中出现的情况.还存在以下缺点:
1.两车道的车辆轮流放行时间相同.在十字路口.经常一个车道为主干道.车辆较多.放行时间应该长些;另一车道为副干道.车辆较少.放行时间应该短些。
2.两条干道的红绿时间不能随时间的改变而修改。
1.3本课题的发展趋势
随着智能时代的到来.让交通灯也智能的想法已经不是难事.智能的表现方式主要是拥有自动调整亮灯时间长短的功能。
譬如说.它能自动感应该地区的交通情况.如果塞车的话该交通灯能自行控制红、黄与绿等的亮灯时间长短。
而这个检测道路车辆数量的方案有很多种.技术上比较难施工上比较容易的是在交通的上加上摄像头.运用数字图像处理技术来识别车辆的数量。
另一种方法是可以在公路下面埋上压力传感器.这种方法技术上没什么难度.但施工比较麻烦。
1.4本课题的研究内容
本设计是基于STM32F407的交通灯设计.交通灯的硬件设计主要由三部分组成:
微控制器最小系统.最小系统的构建有主控芯片STM32.晶振.滤波电容.复位电路;交通灯的信号灯.信号灯由超低功耗的LED组成.LED的正极接电源正极.负极连接STM32I/O口.并且要串联一个限流电阻;显示时间的数码管数码管用以显示倒计时.倒计时只有几十秒.所以只用2个数码管就够了.数码管采用动态扫描显示方式.所以在程序中需要不断的刷新显示.给程序增加了难度。
软件部分由三部分组成:
数码管显示函数.函数输入一个数字.数码管就可以显示该数字;交通灯切换函数.倒计时为0时.就要执行该函数.实现红绿灯的切换;时间计时函数.该函数实现倒计时.是本设计的核心。
交通灯工作的流程是计数器每秒钟减一.减到零时切换信号灯.在主函数中调用数码管显示函数.以便快速扫描显示。
ARM处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器。
更早称作AcornRISCMachine。
ARM处理器本身是32位设计.但也配备16位指令集.一般来讲比等价32位代码节省达35%.却能保留32位系统的所有优势。
早期的ARM以ARM7、ARM9等命名.在推出了ARM11之后的ARM核心采用了不同的命名方式.这就是新型的Cortex内核.分为三个系列.A系主打高端市场.R系用于实时性要求很高的领域.M系是面向控制的内核.与单片机一样.Cortex-M核目前有M0、M3、M4.前不久ARM推出了最新的ARM7.为可穿戴设备设计。
STM32是意法半导体基于ARM核心加上外围模块构成的新型微控制器。
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M内核.STM32F1等基于Cortex-M3.STM32F4等基于Cortex-M4。
STM32F407采用了90纳米的NVM工艺和ART.ART技术使得程序零等待执行.提升了程序执行的效率.将Cortex-M4的性能发挥到了极致.该芯片最高工作频率可达到168MHz.运行速度接近低端微处理器.STM32F407集成了单周期DSP指令和FPU(浮点单元).提升了计算能力.可以进行一些复杂的计算和控制。
2方案设计
2.1微控制器选择
ARM体系是一个很大的体系.基于ARM设计的微控制器、微处理器很多.由于交通灯设计主要是控制而非处理.所以我们选择微控制器作为主控芯片
基于ARM的微控制器有很多.主要有意法半导体的STM32系列.飞思卡尔公司的K系列.以及爱特梅尔、TI等公司都在做基于ARM的微控制器。
由于意法半导体的STM32性价比非常高且容易买到.所以我们选择STM32作为本次设计的主控芯片。
STM32也是一个家族.有F1系列、F2系列、F3及F4系列.其中F4系列基于ARMCortex-M4内核.比Cortex-M3要先进.而且具有学习价值.所以我们选择STM32F407作为主控芯片。
2.2显示设备的选择
显示设备有很多种.有LED、LCD、OLED、数码管、TFT等。
由于本设计中显示设备只用显示数字.所以用高级显示设备就会造成资源浪费.增加设计成本。
所以我们这里选择地端的显示设备.低端的显示设备主要有LED和数码管。
LED只能显示点.要显示数字的话就得用很多LED组成点阵.所以我们选择数码管作为本设计的显示设备.在实际运用中.数码管的大小以及亮度达不到实际要求.所以可以采用大量LED组成的点阵来显示。
实验中采用数码管显示是为了降低成本。
2.3信号灯的选择
由于信号灯需要红、黄、绿三种颜色.而且是一天24小时显示.不能选择功率大的信号灯.信号灯的亮度不能太低.不然司机看不清楚.基于以上情况我们选择超低功耗的LED作为信号灯。
实验中我们采用一个LED.在实际中为了增加亮度可以采用很多LED组成LED群.以此增加显示亮度。
2.4系统设计思路
由于采用了高性能的STM32作为主控芯片.所以在资源上不必担心.芯片得有一个最小系统才能运作。
交通灯有一个倒计时器.所以必须有一个定时器作为时钟。
还有显示倒计时的设备.这里用数码管代替.实际中得用LED做成的显示面板。
信号灯用单个LED灯代替.实际中要用大量LED同时显示.LED的颜色要有红、黄。
绿三种。
定时器一上电就不断地运行.为交通灯提供时间信息.在定时器中会控制2个计数变量.一个变量代表一组信号灯的时间.当计数变量倒计时为0时.就执行信号灯切换函数.实现红黄绿灯的切换。
另外外需要实时显示时间.所以每当计数变量减一时数码管就要变化。
2.5方案框图
图2.2方案框图
2.6方案论证
本方案简单易行.且性价比高.高性能STM32芯片能稳定地运行.而且由于设计中所用的LED、数码管、STM32都是低功耗器件.所以整个系统的功耗都很低。
3硬件设计与实现
3.1电路设计框图
本设计主要由ARM微控制器STM32F407、LED灯、数码管等部分组成。
其中STM32F407是主控芯片.是整个硬件电路的核心.主要完成LED灯、数码管的控制。
其系统原理框图如图3.1所示。
图3.1系统原理框图
3.2最小系统设计
STM32有众多系列和型号.我们选择STM32F407作为主控芯片.因为这款芯片是基于最新的Cortex-M4,具有比较高的学习价值和代表性。
对于STM32这种高级的微控制器来说.最小系统比较复杂.不像51单片机那样简单.因为其速度非常快.可以达到168MHz.速度快就对信号的稳定和抗干扰有较高的要求.又由于现在的集成电路工艺技术并不能集成较大的电容.所以SOC设计者们将需要电容的电路接上引脚.在芯片外部接上电容.这样就解决了上面的问题.不过使最小系统变复杂了。
由于STM32内部集成了震荡源.所以没有外部晶振也可以工作。
不过内部震荡源有着不精确地缺点.在高精度场合我们还是有必要接上外部晶振.一般为8M或16M.晶振需要接上2个电容帮助其起振。
3.3LED模块
LED模块比较简单.STM32的IO口足以驱动LED.为了有更大的电流.我们采用灌电流输出方式.LED负极接IO口.正极接电源.中间还要加上限流电阻。
本设计中总共有2组信号灯.一组信号灯有红、黄、绿三颗LED.所以总共需要6颗LED。
3.4数码管模块
本设计中采用的数码管功率比较大.所以不能像LED模块那样直接接在IO口上.需要加上驱动电路.我们有两套驱动方案.方案一是用三极管驱动.这样需要4个三极管。
方案二是用锁存器。
鉴于三极管便宜且容易找到.所以我们采用三极管驱动方案。
3.5系统总电路图
图3.5系统总图
4软件设计
4.1软件的设计架构
yes
no
图4.1程序流程图
4.2软件设计过程
STM32的C语言开发思想与51有重大差别.51只需要一个reg52.h和一个C文件就可以开发。
STM32芯片非常复杂.而且是32位芯片.内部的寄存器数量巨大.我们不能像开发51那样直接操作寄存器.51的寄存器比较少且是8位机。
所以工程师们引入了一种新的开发方式-库开发.ST公司为每一款STM32开发了一个固件库.开放给开发人员免费使用.我们只需建好工程.然后添加这个库.在用户文件中直接调用这些库函数就可以了.这种开发方式非常方便.我们不必去记那么多寄存器或者翻数据手册。
加快了开发速度.减小了开发成本。
在主函数中.我们需要对外设进行初始化.首先要定义一个GPIO初始化函数GPIO_init(void).在函数中调用库函数对IO口进行初始化。
函数定义好后就在主函数中首先调用它.然后调用定时器初始化函数SysTick_Config(168000).并开启定时中断.至此初始化完成。
接下来进入一个死循环.在循环中主要检测倒计时是否为0.如果为0则进行红黄绿灯的切换.另外循环中还调用显示函数.不断的刷新显示.一是由于数码管采用的是动态扫描显示方式.需要不断地刷新.二是显示需要一定的实时性。
在定时中断服务函数中主要完成计数变量的自减。
4.3MDK工程建立及配置
建立STM32的工程很麻烦.需要将库函数移植到工程中.但是一旦移植好后.以后就不用再做同样的工作.只需将该工程拷贝就行.然后在里面修改代码。
我们这里就是用的工程模板.固件库有很多版本.我们用的是1.1版本。
一个完整的工程框架如图4.3.1所示。
图4.3.1工程框架
图4.3.1中DEMO是工程名.user里面放的是用户文件.CMISI里面放的是启动代码.FWlib里面放的是外设驱动与配置函数.它占据了整个库的大部分。
建立好工程后就要对其进行配置.鼠标右键点击工程名.选择Options选项.出现工程配置界面.如图4.3.2。
图4.3.2工程配置
配置界面有很多选项.Device选项是选择工程的目标芯片.我们选的是STM32F407.Output选项是选择工程输出文件的目录.C/C++选项是选择头文件的查询目录。
Bebug选项是选择仿真模式.我们有一个硬件仿真器STlink.所以这里选择硬件仿真.仿真器选STlink.如图4.3.3。
图4.3.3仿真模式
工程配置完成后就进行程序编写.编写程序是一个漫长的过程.本设计的核心内容就是编写程序.程序主要有3个函数.main函数实现信号灯的切换.定时器中断服务函数实现倒计时.显示函数实现数码管的动态扫描显示。
具体程序在后面列出。
编写好程序后就可以进行编译了.依次点击
后就完成了编译—汇编—链接.出现如图4.3.4的情况就编译完成了。
图4.3.4编译完成
4.4主要函数代码
/******************************************************************************
*主函数
*说明:
本函数中主要完成系统初始化、信号灯切换和显示刷新
******************************************************************************/
intmain()
{
unsignedcharlight_1=YELLOW,light_2=RED;
SysTick_Config(168000);//滴答定时器初始化,周期1毫秒
GPIO_init();//GPIO初始化
GPIO_Write(GPIOE,0xff);//关闭全部LED灯
while
(1)
{
if(time_1==0)//如果1组倒计时为0
{
if(light_1==RED)//如果1组为红灯
{
time_1=54;//绿灯倒计时55秒
light_1=GREEN;//红灯转换成绿灯
GPIO_Write(GPIOE,0xf6);
}
elseif(light_1==GREEN)//如果1组为绿灯
{
time_1=4;//黄灯倒计时5秒
light_1=YELLOW;//绿灯转换为黄灯
GPIO_Write(GPIOE,0xf5);
}
elseif(light_1==YELLOW)//如果1组为黄灯
{
time_1=59;//红灯倒计时60秒
light_1=RED;//转换为红灯
GPIO_Write(GPIOE,0xde);
}
}
if(time_2==0)//如果2组倒计时为0
{
if(light_2==RED)//如果2组为红灯
{
time_2=54;//绿灯倒计时55秒
light_2=GREEN;//转换为绿灯
GPIO_Write(GPIOE,0xde);
}
elseif(light_2==GREEN)//如果2组为绿灯
{
time_2=4;//黄灯倒计时5秒
light_2=YELLOW;//转换为黄灯
GPIO_Write(GPIOE,0xee);
}
elseif(light_2==YELLOW)//如果2组为黄灯
{
time_2=59;//红灯倒计时60秒
light_2=RED;//转换为红灯
GPIO_Write(GPIOE,0xf3);
}
}
Display(time_1,time_2);//调用显示函数.刷新数码管显示
}
}
/*******************************************************************************定时中断服务函数
*说明:
本函数主要完成倒计时减一
******************************************************************************/