《基于ARM的交通灯设计.doc》由会员分享,可在线阅读,更多相关《基于ARM的交通灯设计.doc(18页珍藏版)》请在三一办公上搜索。
1、嵌入式系统课程设计报告 (基于ARM的交通灯控制系统) 院 系: 机电学院 学生姓名: 专 业: 应用电子教育 班 级: 指导教师: 田丰庆 付广春 完成时间: 2013年3月28日 1引言11.1设计主旨11.2设计原理11.3总体设计方案12 GPIO的简介42.1 GPIO口的应用42.2 GPIO端口的配置42.3 GPIO 的功能53 STM32最小系统电路5 3.1 STM32芯片管脚介绍5 3.2 STM32复位和时钟电路设计54总结85参考文献10附录一11附录二12基于ARM的交通灯设计摘要:本设计选择STM32为核心控制元件,设计了一款基于ARM3的十字路臂交通灯控制系统,
2、实现对行人、非机动车等的指示。关键词:STM32 ARM 交通灯1引言近年来,城市人口与流动人口急剧增加,全国大中城市人口普遍存在着交通拥挤,道路阻塞,率速缓慢等现象。如何解决城市交通问题成为全社会关注的焦点。随着嵌入式系统的飞速发展,这一问题已经得到了解决,通过嵌入式的设计解决了交通的拥堵问题。1.1设计主旨 利用ARM芯片模拟实现交通灯控制。自行选择所需ARM芯片,查阅相关文献资料,熟悉所选ARM芯片,了解所选ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等相关原理,通过软硬件设计实现利用ARM芯片完成交通灯的模拟控制。 本实验的目的是为了通过设计交通灯从而更好的了解关于ST
3、M32、FLASH等芯片的工作作用。并且对嵌入式有深刻的意识。达到了解交通灯工作原理以及时间控制红蓝绿三灯的闪亮的技术问题。1.2设计原理STM32系列微控器是以ARM Cortex_M3为内核开发生产的32位微控制器,专为高性能,低成本,低功耗的嵌入式应用专门设计。本次实验就是基于ARM的十字路口交通灯设计,通过对现实路况交通灯的分析研究,理解交通控制系统的实现方法,并通过本次实习用开发版实现其功能。通过设计,培养自己综合应用所学知识,独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练,加深对ARM芯片的了解;熟悉ARM芯片各个引脚的功能,工作方式,计数/定时,I
4、/O口,中断等相关原理,巩固学习嵌入式的相关内容知识。利用ARM芯片模拟实现交通灯控制。1.3总体设计方案 本设计采用STM32为主芯片,形成主控制电路。通过程序控制整个电路的运转一级红黄绿三种信号的转换。STM32系列单片机有包含若干定时器/计数器。其中,TIM1和TIM8是高级控制定时器,TIM2TIM5为通用定时器。TIM6和TIM7为基本定时器。在嵌入式系统中,定时器是依靠时钟源来完成定时功能的。 一个十字路口由东西,南北两干道构成,各有一组红,绿,黄三色指示灯。红灯亮禁止通行,绿灯亮允许通行,黄灯亮警示人们注意红,绿灯即将切换且黄灯亮的时间为东西,南北两干道的公共停车时间。当开发版和
5、电脑连接好以后,将程序下载到开发板中可以看到外接电路的红,绿,黄灯的变化情况。一通上电时南北方向上的直走和右转绿灯亮,延时20S后黄灯亮,黄灯延时5S后左转绿灯亮,(在绿灯亮的时候其余方向上的灯都为红灯),延时40S后黄灯亮,延时5S后都被切换成红灯。延时80S再继续循环。此次实习因为资源有限只演示南北方向上的红绿灯变化情况。具体的工作流程如下。图1 流程图2 GPIO的简介2.1 GPIO口的应用 函数GPIO口的具体实现在库文件“stm32f10x_gpio.c”中,其作用是定义各个通用IO端口的模式,对应到外设的输入/输出功能有以下三种情况:(1) 外设对应的引脚为输入:则根据外围电路的
6、配置可以选择浮空输入.带上拉输入或带下拉输入。(2) ADC对应的引脚:配置引脚为模拟输入。(3) 外设对应的引脚为输出:需要根据外围电路的配置选择对应的引脚为复用功能的推挽输出或复用功能的开漏输出。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将引脚配置成复用输出功能后,如果外设没有被激活,它的输出将不确定。2.2 GPIO端口的配置图2 端口配置电路2.3 GPIO 的功能(1)最基本的功能是可以驱动LED.产生PWM.驱动蜂鸣器等。(2)具有单独的位设置或位清楚,编程简单。(3)具有外部中断/唤醒能力,端口配置成输入模式时,具有外部中断能力。(4)具有
7、复用功能,复用功能的端口兼有I/O功能等。(5)GPIO 口的配置具有锁定机制,当配置好GPIO口后,在一个端口位上执行了锁定,可以通过程序锁住配置组合,在下一次复位之前,将不能再更改端口位的配置。3 STM32最小系统电路3.1 STM32芯片管脚介绍STM32F103R6T6管脚示意图,如图3所示。图3 STM32F103R6T6管脚示意图3.2 STM32复位和时钟电路设计 此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图4(右)所示:其中7脚为STM32的复位端。时钟电路如图4(左)所示:晶振采用的是8MHz和32.786KHz,8MKz分
8、别接STM32的5脚和6脚,32.786KHz分别接STM32的3脚和4脚。图4 STM32复位和时钟电路定时器程序如下。#include Time_test.h/* * 函数名:TIM2_NVIC_Configuration * 描述 :TIM2中断优先级配置 * 输入 :无 * 输出 :无 */void TIM2_NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQCha
9、nnel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);/*TIM_Period-1000 TIM_Prescaler-71 -中断周期为1ms*/void TIM2_Configuration(void) TIM_TimeBaseInitTy
10、peDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=1000; /* 自动重装载寄存器周期的值(计数值) */ /* 累计 TIM_Period个频率后产生一个更新或者中断 */ TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); /* 时钟预分频数 72M/72 */ TIM_TimeBaseStructure.TIM_ClockDivi
11、sion=TIM_CKD_DIV1; /* 采样分频 */ TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); /* 清除溢出中断标志 */ TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2, ENABLE); /* 开启时钟 */ RCC_APB1PeriphClockCmd(
12、RCC_APB1Periph_TIM2 , DISABLE);/*先关闭等待使用*/ #include Time_test.h/* * 函数名:TIM2_NVIC_Configuration * 描述 :TIM2中断优先级配置 * 输入 :无 * 输出 :无 */void TIM2_NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
13、NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);/*TIM_Period-1000 TIM_Prescaler-71 -中断周期为1ms*/void TIM2_Configuration(void) TIM_TimeBaseInitTypeDef TIM_TimeBase
14、Structure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period=1000; TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); /* 时钟预分频数 72M/72 */ TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
15、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update);/* 清除溢出中断标志 */ TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2, ENABLE);/* 开启时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);/*先关闭等待使用*/ 4. 总结 两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一
16、件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。 课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础 通过这次交通灯设计,本人在多方面都有所提高。通过这次交通灯设计,培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训
17、练。了解所选择的ARM芯片各个引脚功能,工作方式,计数/定时,I/O口,中断等的相关原理,并巩固学习嵌入式的相关内容知识。通过软硬件设计实现利用ARM芯片完成交通灯控制功能。首先查阅相关文献资料,熟悉所选ARM芯片。第二步总体设计方案规划,设计车辆遇到红灯停绿灯行情况,红绿灯时间均为80s,切换时间为10s,最后5s为黄灯闪烁。接下来 系统硬件设计,熟悉IO接口,定时器计数器工作原理。最后系统软件设计,包括交通信号灯的工作流程软件实现,用C语言编程。提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。 在这次设计过程中,体现出自己单独设计模
18、具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。 由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。5. 参考文献1 潘松、黄继业等.EDA技术实用教程(第一版)M.科学出版社 2002年10月2 陆坤、奚大顺、李之权等.电子设计技术M.四川:电子科技大学出版社.1997年.682-688,838-9413 王永红、徐炜、赫立平.STM32系列ARM Cortex-M3微控制器原理与实践M.北京航空航天大学出版社,2008.4 ARM Limite
19、d.Cortex-M3 Technical Reference Manual(r2p0). ARM DDI 0037G 2008.5 6 谢自美、阎树兰、赵云娣等.电子线路设计实验测试(第二版)M.湖北:华中理工大学出版社.2000年.293-3007 杨邦文.新型实用电路制作200例M.北京:人民邮电出版社.1998年.175-2888 宋春荣、刘芳芳、杨礼成等.通用集成电路速查手册M.山东:山东科学技术出版社.1995年.30-1079 梅遂生、杨家德.光电子技术信息装备的新秀M.北京:国防工业出版社.1999年.88-10210 赵俊超.集成电路设计VHDL教程(第一版)M. 北京:北京
20、希望电子出版社.2002年附录一:总体电路图附录二#include stm32f10x.h#include led.h #include Time_test.hvolatile u32 time; / ms 计时变量volatile u32 south_front_R_time;volatile u32 south_front_G_time;volatile u32 south_right_R_time;volatile u32 south_right_G_time;volatile u32 south_light_R_time;volatile u32 south_light_G_time;
21、volatile u32 east_front_R_time;volatile u32 east_front_G_time;volatile u32 east_right_R_time;volatile u32 east_right_G_time;volatile u32 east_light_R_time;volatile u32 east_light_G_time;volatile u32 south_yellow_time;volatile u32 east_yellow_time;/* * 函数名:main * 描述 :主函数 * 输入 :无 * 输出 :无*/int main(voi
22、d) SystemInit(); */ 配置系统时钟为 72M */ LED_GPIO_Config(); */LED 端口配置 */ TIM2_NVIC_Configuration(); /* TIM2 定时配置 */TIM2_Configuration(); /* TIM2 开始计时 */START_TIME;while(1)if ( south_front_G_time = 25 ) /南北面直走绿亮GPIO_SetBits(GPIOC, GPIO_Pin_6); if ( south_front_G_time = 25025 ) /南北面直走绿灭GPIO_ResetBits(GPIOC
23、, GPIO_Pin_6); if ( south_front_G_time = 80025 )south_front_G_time = 0;if ( south_front_R_time = 25025 ) /南北面直走灯亮GPIO_SetBits(GPIOC, GPIO_Pin_4); if ( south_front_R_time = 80025 ) /南通灯红灯GPIO_ResetBits(GPIOC, GPIO_Pin_4);south_front_R_time = 0; if ( south_right_G_time = 25 ) /南北面右拐绿灯GPIO_SetBits(GPIO
24、C, GPIO_Pin_5); if ( south_right_G_time = 25025 ) /南北面右拐绿灭GPIO_ResetBits(GPIOC, GPIO_Pin_5); if ( south_right_G_time = 80025 )south_right_G_time = 0; if( south_right_R_time = 28025 ) /南北面右拐红亮GPIO_SetBits(GPIOC, GPIO_Pin_3); if( south_right_R_time = 80025 ) /南北面右灭GPIO_ResetBits(GPIOC, GPIO_Pin_3); so
25、uth_right_R_time = 0; if( south_light_G_time = 28025 ) /南北面左拐交通灯绿灯亮GPIO_SetBits(GPIOC, GPIO_Pin_2) ; if ( south_light_G_time = 43025 ) /南北面左拐交通灯绿灯灭GPIO_ResetBits(GPIOC, GPIO_Pin_2); if ( south_light_G_time = 80025 )south_light_G_time = 0; if ( south_light_R_time = 25 ) /南北面左拐交通灯红灯亮GPIO_SetBits(GPIOC
26、, GPIO_Pin_1) ; if ( south_light_R_time = 28025 ) /南北面左通灯红灯灭GPIO_ResetBits(GPIOC, GPIO_Pin_1);if ( south_light_R_time = 46025 ) /南北面左拐交通灯红灯亮GPIO_SetBits(GPIOC, GPIO_Pin_1) ; if ( south_light_R_time = 80025 )south_light_R_time = 0; if ( south_yellow_time = 25025) /南北面黄灯亮GPIO_SetBits(GPIOC, GPIO_Pin_0
27、) ; if ( south_yellow_time = 28025 ) /南北面黄灯灭GPIO_ResetBits(GPIOC, GPIO_Pin_0); if ( south_yellow_time = 43025 ) /南北面黄灯亮GPIO_SetBits(GPIOC, GPIO_Pin_0);if ( south_yellow_time = 46025 ) /南北面黄灯灭GPIO_ResetBits(GPIOC, GPIO_Pin_0); if ( south_yellow_time = 80025 )south_yellow_time = 0; #define_LED_H#inclu
28、de stm32f10x.h/* the macro definition to trigger the led on or off * 1 - off - 0 - on */#define ON 0#define OFF 1#define LED1(a) if (a)GPIO_SetBits(GPIOC,GPIO_Pin_0);elseGPIO_ResetBits(GPIOC,GPIO_Pin_0)#define LED2(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_1);elseGPIO_ResetBits(GPIOC,GPIO_Pin_1)#define LE
29、D3(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_2);elseGPIO_ResetBits(GPIOC,GPIO_Pin_2)#define LED4(a)if (a)GPIO_SetBits(GPIOC,GPIO_Pin_3);elseGPIO_ResetBits(GPIOC,GPIO_Pin_3)void LED_GPIO_Config(void);#endif /* _LED_H */#include stm32f10x_it.hextern volatile u32 south_front_R_time;extern volatile u32 south_
30、front_G_time;extern volatile u32 south_right_R_time;extern volatile u32 south_right_G_time;extern volatile u32 south_light_R_time;extern volatile u32 south_light_G_time;extern volatile u32 east_front_R_time;extern volatile u32 east_front_G_time;extern volatile u32 east_right_R_time;extern volatile u
31、32 east_right_G_time;extern volatile u32 east_light_R_time;extern volatile u32 east_light_G_time;extern volatile u32 south_yellow_time;extern volatile u32 east_yellow_time;void TIM2_IRQHandler(void)if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); south_front_R_time+;south_front_G_time+; south_right_R_time+; south_right_G_time+; south_light_R_time+; south_light_G_time+; east_front_R_time+; east_front_G_time+; east_right_R_time+; east_right_G_time+; east_light_R_time+; east_light_G_time+; south_yellow_time+; east_yellow_time+;