1引言交通信号灯指挥着人和各种车辆的安全运行,实现红、黄、绿灯的自动指挥是城乡交通管理现代化的重要课题。在城乡街道的十字交叉路口,为了保证交通秩序和行人安全,一般在每条道路上各有一组红、黄、绿交通信号灯,其中红灯亮,表示该条道路禁止通行; 黄灯亮,表示该条道路上未过停车线的车辆停止通行,已过停车线的车辆继续通行;绿灯亮,表示该条道路允许通行。交通灯控制电路自动控制十字路口两组红、黄、绿交通灯的状态转换,指挥各种车辆和行人安全通行,实现十字路口城乡交通管理自动化。
本文为了实现交通道路的管理,力求交通管理先进性、科学化。 分析应用了单片机实现智能交通灯管制的控制系统,以及该系统软、硬件设计方法,实验证明该系统实现简单、经济,能够有效地疏导交通,提高交通路口的通行能力。
2 相关内容及原理通过设计,培养自己综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。
利用ARM芯片模拟实现交通灯控制,自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片,了解所选ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制。
3 作品设计要求要求基于Cortex系列单片机设计一具有模拟道路路口交通灯相应功能的交通灯模拟系统。具体要求如下:
(1)具有三种颜色显示:红色、绿色和黄色,分别代表路口交通灯的三种颜色。
(2)所设计的系统应至少能够模拟两个路口的功能,具有直行和左转的功能。
(3)如果能力和时间允许,可以加入操作系统。
(4)适当加入一些其他元素,使其更加具有人性化设计。
4 作品方案设计4.1 设计思路利用STM32F103芯片实现单路交通灯的控制: a 实现红、绿、黄灯的循环控制。使用红、黄、绿三种不同颜色的LED灯实现此功能,主干道正前方方向的LED灯,编号分别为1、2、3,分别接在单片机的PB8、PB6、PB9的引脚上;主干道右方的LED灯,编号分别为4、5、6,分别接在单片机的PA14、PA10、PA8的引脚上;主干道后侧的LED灯,编号分别为7、8、9,分别接在单片机的PD10、PD12、PD14引脚上。主干道左方的LED灯,编号分别为10、11、12,分别接在单片机的PE7、PE11、PE15引脚上。以此实现四个路口的交通灯模拟系统。用软件控制灯的亮与灭来控制车辆和行人的通行。
交通路口示意图如图4.1车辆遇到红灯停绿灯行的行走情况,红绿灯时间均为2000ms,切换时间为2000ms,最后2000ms为黄灯闪烁。
图4.1 交通路口示意图
4.2 总体设计框图用ARM系列芯片STM32F103作为系统的主控芯片,控制交通灯的循环点亮并显示灯亮时间(采用倒计时显示),当定时时间到的时候通过灯的状态来提醒人们注意红绿灯的状态。
图4.2 交通灯总体设计框图
5 硬件电路模块设计及其分析根据设计任务要求,自行选择电子元件,画出电气原理图,并调试。一个完整的系统除了主控芯片以外,还需配上电源系统、时钟电路、复位电路等。独立的芯片是不能工作的。
5.1 STM32F103芯片介绍 STM32F103是基于一个支持实时仿真和嵌入式跟踪的32 位 CPU 的微控制器,STM32F1系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定时器,CAN,ADC,SPI,I2C,USB,UART,等多种功能。
具有以下一些特性:
- ARM 32位的Cortex-M3
- 最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHZ(DhrystONe2.1),从32K到512K字节的闪存程序存储器,最大64K字节SRAM
- 2.0-3.6V供电和I/O引脚
- 上电/断电复位(POR/PDR)、可编程电压监测器(PVD)
- 4-16MHZ晶振振荡器
- 内嵌经出厂调教的8MHz的RC振荡器
- 2个12位模数转换器,1us转换时间(多达16个输入通道),转换范围:0至3.6V,双采样和保持功能
- 2个DMA控制器,共12个DMA通道:DMA1有7个通道,DMA2有5个通道
- 片内晶振频率范围:1~30 MHz。
- 通过片内PLL可实现最大为60MHz的CPU操作频率,PLL的稳定时间
为100us
- 支持的外设:定时器、ADC、SPI、USB、IIC和UART
- 多达112个快速I/O端口(仅Z系列有超过100个引脚)
- 3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
- 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器
- ECOPACK封装
5.2 STM32F103主电路原理图图5.1为STM32F103芯片的原理图,多达100个引脚,采用3.3V或者5V电源供电,设计所需外接器件的网络名已经标出。
图5.1 STM32F103芯片的原理图
5.3 系统电源电路设计本电源运用5V的直流电源(图5.2所示)。通过LM78系列芯片将5V电压转换为电压,为STM32F103芯片供电,STM32F103芯片所能承受的电压范围是2V~3.6V。
图5.2 直流电源电路设计
5.4 晶振与复位电路模块
系统的晶振电路如图5.4所示STM32f103芯片采用8MHz的晶振作为振荡时钟源,外部是倍频72MHz晶振。通过对芯片的进行软件设计可以将晶体振荡器的频率分频为所需的频率;系统的复位电路如图5.5所示,STM32F103芯片的14号引脚连接到主控芯片的复位引脚(nRST)上,按下复位键S2时,系统将会复位到初始的状态。
图5.4 系统的晶振电路图 图5.5 系统的复位电路图
5.5 LED循环显示设计 由南向北和由北向南车道各用一组红、绿、黄三色的指示灯,左右两侧也是各三个灯,指挥车辆通行。绿灯是通行信号,面对绿灯的车辆可以直行,红灯是禁止通行信号,面对红灯的车辆必须在路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以继续行进。具体红绿灯时间分配时间如表5.1所示。
表5—1:红绿灯时间分配时间如表
上表说明主干通道绿灯亮、黄灯闪时人行道都是红灯亮,只有车道
红灯亮(车辆完全停下来)时人行道绿灯才亮,这样保证了过马路的行人人身安全,避免了不必要的交通事故。硬件电路连接图如图5.6所示
图5.6 硬件电路连接图
交通灯LED的发光和熄灭的控制,是通过控制GPIO寄存器组来完成的,须先将引脚PA、PB、PD、PE等通过引脚功能选择寄存器PINSEL1,设置为GPIO方式;再设置GPIO方向寄存器1(IO1DIR),对应的引脚设置为输出方向。要点亮LED1~LED12需要使用GPIO清零寄存器1(IO1CLR)的对应位设置为1,即在引脚PA、PB、PD、PE上加逻辑低电平,即可点亮这些灯。与之相反,要熄灭这些灯,则要用GPIO输出置位寄存器1(IO1SET)将对应的位置位即可。
6 系统软件设计及其分析6.1 软件设计流程图图6.1为ARM模拟交通灯控制程序流程图,主程序主要完成倒计时显示及控制蜂鸣器,中断服务程序主要控制那些灯亮以及亮的时间。
图6.1 ARM模拟交通灯控制程序流程图
6.2 ARM交通灯模拟控制程序设计定时器控制原理:定时器对外设时钟Fpclk周期进行计数,根据4个匹配寄存器的设定可设置为匹配(即达到匹配寄存器指定的定时值)时产生中断或执行其他操作。
设置P0、P1口为GPIO输出状态,初始化定时器,选定定时器0中断为向量IRQ,对VICIntEnable、VICIntSelect、VICvectCntl进行设置,初始化SPI接口,根据设计要求编写软件程序。根据事先画好的程序流程图,用C语言编写程序,在主程序中对需要用到的I/O口进行定义,并设置相应的I/O口,比如要求P1。18~P1。25引脚为GPIO功能,则通过对引脚功能选择 寄存器PINSEL1将对应的引脚设置为GPIO方式并设置GPIO方向,在GPIO方向寄存器IO1DIR里设置,之后对定时器0进行初始化,并开相应的中断。然后进入大循环进行倒计时显示、控制蜂鸣器的蜂鸣与否并判断flag是否加到设定值,对flag加到设定值后进行清零,让flag重新计数。中断服务程序的设计,每隔一秒钟定时器中断一次,每中断一次flag加1根据LED点亮的先后顺序以及点亮的时间,分别编写相应的程序。
7 系统软件代码7.1 软件设计流程图
图7.1 软件设计流程图
7.2 系统软件代码主程序部分:
#include "stm32f10x.h"
#include "led.h"
#include"timer.h"
u32 time=0;//Ms级延时变量
int i;
int main(void)
{
LED_GPIO_Configuration();
TIM2_Config1();
TIM2_NVIC_Config1();
TIM_Cmd(TIM2,ENABLE);//开启TIM2
while(1){
i=0;
Delay_MS(2000);
LED2(ON);LED4(ON);LED7(ON);LED10(ON);//直行灯亮
Delay_MS(2000);//延时
LED2(OFF);//直行灯灭
while(i<10) //黄灯闪烁
{ LED3(ON);
Delay_MS(100);
LED3(OFF);
Delay_MS(100);
i++;
}
LED2(OFF);LED4(OFF);LED7(OFF);LED10(OFF);//直行灯结束
LED1(ON);LED7(ON);LED10(ON);LED5(ON);//右行灯亮
Delay_MS(3000);
LED5(OFF);//右行灯灭
i=0;
while(i<10)
{ LED6(ON);
Delay_MS(100);
LED6(OFF);
Delay_MS(100);
i++;
}
LED5(OFF);LED1(OFF);LED7(OFF);LED10(OFF);//右行灯结束
LED1(ON);LED7(ON);LED4(ON);LED11(ON);//左行灯亮
Delay_MS(3000);
LED11(OFF);//左行灯灭
i=0;
while(i<10)
{ LED12(ON);
Delay_MS(100);
LED12(OFF);
Delay_MS(100);
i++;
}
LED11(OFF);LED1(OFF);LED7(OFF);LED4(OFF);//左行灯结束
LED1(ON);LED4(ON);LED10(ON);LED8(ON);//后行灯
Delay_MS(3000);
LED1(OFF);LED4(OFF);LED10(OFF);LED8(OFF);//后行灯灭
}
}
底层寄存器配置部分:
void LED_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOC&GPIOE的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
/* Configure PB.04, PB.06 and PB.08*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure PA.08, PA.10 and PA.12 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PD.10, PD.12 and PD.08 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Configure PE.07, PE.11 and PE.15 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
LED1(OFF);LED2(OFF);LED3(OFF);LED4(OFF);LED5(OFF);LED6(OFF);LED7(OFF);LED8(OFF);LED9(OFF);LED10(OFF);LED11(OFF);LED12(OFF);
内联函数定义LED函数部分:
#ifndef _LED_H
#define _LED_H
#include"stm32f10x.h"
#define ON 0
#define OFF 1
/***************内联函数定义LED函数****************/
#define LED1(a) if (a)
GPIO_SetBits(GPIOB,GPIO_Pin_8);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define LED4(a) if (a)
GPIO_SetBits(GPIOA,GPIO_Pin_12);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_12)
#define LED7(a) if (a)
GPIO_SetBits(GPIOD,GPIO_Pin_10);
else
GPIO_ResetBits(GPIOD,GPIO_Pin_10)
#define LED10(a) if (a)
GPIO_SetBits(GPIOE,GPIO_Pin_15);
else
GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define LED2(a) if (a)
GPIO_SetBits(GPIOB,GPIO_Pin_6);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define LED5(a) if (a)
GPIO_SetBits(GPIOA,GPIO_Pin_10);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_10)
#define LED8(a) if (a)
GPIO_SetBits(GPIOD,GPIO_Pin_12);
else
GPIO_ResetBits(GPIOD,GPIO_Pin_12)
#define LED11(a) if (a)
GPIO_SetBits(GPIOE,GPIO_Pin_11);
else
GPIO_ResetBits(GPIOE,GPIO_Pin_11)
#define LED3(a) if (a)
GPIO_SetBits(GPIOB,GPIO_Pin_9);
else
GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define LED6(a) if (a)
GPIO_SetBits(GPIOA,GPIO_Pin_8);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_8)
#define LED9(a) if (a)
GPIO_SetBits(GPIOD,GPIO_Pin_15);
else
GPIO_ResetBits(GPIOD,GPIO_Pin_15)
#define LED12(a) if (a)
GPIO_SetBits(GPIOE,GPIO_Pin_7);
else
GPIO_ResetBits(GPIOE,GPIO_Pin_7)
void LED_GPIO_Configuration(void);
#endif
8 Keil软件的运用与调试
根据事先画好的程序流程图,用C语言编写程序,并成功生成HEX文件,利用keil软件编译结果如图8.1 所示。
图8.1 编译结果示意图
调试过程截图:
设计为系统上电即点亮车道红灯以及马路绿灯,倒计时1000ms红灯开始闪烁,同时马路红灯亮,红灯闪1000ms接着转为黄灯闪1000ms,然后车辆通道转为绿灯亮,1000ms后绿灯闪1000ms,黄灯再闪1000ms之后又回到红灯亮,人行道只在车辆通道红灯时才亮绿灯。这主要靠在中断服务程序中对计数值flag的判断来对正在点亮的灯进行定时实现程序详细清单见附录。
9 实物演示照片
10 作品电路的PCB图在设计好软件流程图以及焊接好硬件电路后,用Altium Designer软件进行电路的PCB设计,下图是主电路芯片的PCB:
11 设计心得体会及总结
1、因为设计中所用的一些工具,平时虽然接触过,但研究不够深入,所以此次课程设计
在选好题目之后对设计所需资料进行了系统查询和整理,其中包括了我们学习过程中用
到的课本和网上搜索的期刊文献等;
2、此次嵌入式实验是比较全面的一个实验,所涉及的内容十分广泛,包括底层硬件结构
以及上层操作系统、驱动程序等方面,在实验过程中虽然遇到了各种各样的问题,但解
决问题的同时也锻炼了我们分析问题的能力以及动手能力,做完后感觉获益匪浅;
3、回顾此次ARM课程设计,我感慨很多,在这几星期里,可以说苦多于甜,但是确实
又学到了很多东西,不仅巩固了以前所学的知识,而且学到了很多书本上没有的新的知
识。在设计调试的过程中遇到了各种各样的问题,同时也发现了自己的不足之处;
4、在编译和调试的过程中,由进一步加强了自己编程和改错的能力,通过研究这方面的
课题,可以更深刻地理解交通信号灯的整个过程,同时也加强了嵌入式学习的技巧。由
于时间的关系,只能做到这些功能,我知道想要实现功能更强大的交通信号灯,还有大
量的工作要做,希望以后还可以进一步接触此类设计。