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為黃燈閃爍。
1.001.jpg (10.28 KB, 下載次數: 122)
下載附件
2017-6-28 23:14 上傳
圖4.1 交通路口示意圖
4.2 總體設計框圖用ARM系列芯片STM32F103作為系統的主控芯片,控制交通燈的循環點亮并顯示燈亮時間(采用倒計時顯示),當定時時間到的時候通過燈的狀態來提醒人們注意紅綠燈的狀態。
1.002.jpg (9.89 KB, 下載次數: 141)
下載附件
2017-6-28 23:14 上傳
圖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電源供電,設計所需外接器件的網絡名已經標出。
1.003.jpg (57.59 KB, 下載次數: 158)
下載附件
2017-6-28 23:14 上傳
圖5.1 STM32F103芯片的原理圖
5.3 系統電源電路設計本電源運用5V的直流電源(圖5.2所示)。通過LM78系列芯片將5V電壓轉換為電壓,為STM32F103芯片供電,STM32F103芯片所能承受的電壓范圍是2V~3.6V。
1.004.jpg (14.04 KB, 下載次數: 160)
下載附件
2017-6-28 23:14 上傳
圖5.2 直流電源電路設計
5.4 晶振與復位電路模塊
1.005.jpg (11 KB, 下載次數: 123)
下載附件
2017-6-28 23:14 上傳
系統的晶振電路如圖5.4所示STM32f103芯片采用8MHz的晶振作為振蕩時鐘源,外部是倍頻72MHz晶振。通過對芯片的進行軟件設計可以將晶體振蕩器的頻率分頻為所需的頻率;系統的復位電路如圖5.5所示,STM32F103芯片的14號引腳連接到主控芯片的復位引腳(nRST)上,按下復位鍵S2時,系統將會復位到初始的狀態。
1.006.jpg (9.89 KB, 下載次數: 130)
下載附件
2017-6-28 23:14 上傳
圖5.4 系統的晶振電路圖 圖5.5 系統的復位電路圖
5.5 LED循環顯示設計 由南向北和由北向南車道各用一組紅、綠、黃三色的指示燈,左右兩側也是各三個燈,指揮車輛通行。綠燈是通行信號,面對綠燈的車輛可以直行,紅燈是禁止通行信號,面對紅燈的車輛必須在路口的停車線后停車。黃燈是警告信號,面對黃燈的車輛不能越過停車線,但車輛已十分接近停車線而不能安全停車時可以繼續行進。具體紅綠燈時間分配時間如表5.1所示。
表5—1:紅綠燈時間分配時間如表
上表說明主干通道綠燈亮、黃燈閃時人行道都是紅燈亮,只有車道
紅燈亮(車輛完全停下來)時人行道綠燈才亮,這樣保證了過馬路的行人人身安全,避免了不必要的交通事故。硬件電路連接圖如圖5.6所示
1.007.jpg (27.46 KB, 下載次數: 126)
下載附件
2017-6-28 23:14 上傳
圖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模擬交通燈控制程序流程圖,主程序主要完成倒計時顯示及控制蜂鳴器,中斷服務程序主要控制那些燈亮以及亮的時間。
1.008.jpg (59.08 KB, 下載次數: 133)
下載附件
2017-6-28 23:14 上傳
圖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 軟件設計流程圖
1.009.jpg (23.74 KB, 下載次數: 131)
下載附件
2017-6-28 23:14 上傳
圖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 所示。
1.010.jpg (46.18 KB, 下載次數: 143)
下載附件
2017-6-28 23:14 上傳
圖8.1 編譯結果示意圖
調試過程截圖:
1.011.jpg (44.86 KB, 下載次數: 131)
下載附件
2017-6-28 23:14 上傳
1.012.jpg (47.03 KB, 下載次數: 142)
下載附件
2017-6-28 23:14 上傳
設計為系統上電即點亮車道紅燈以及馬路綠燈,倒計時1000ms紅燈開始閃爍,同時馬路紅燈亮,紅燈閃1000ms接著轉為黃燈閃1000ms,然后車輛通道轉為綠燈亮,1000ms后綠燈閃1000ms,黃燈再閃1000ms之后又回到紅燈亮,人行道只在車輛通道紅燈時才亮綠燈。這主要靠在中斷服務程序中對計數值flag的判斷來對正在點亮的燈進行定時實現程序詳細清單見附錄。
9 實物演示照片
1.013.jpg (33.6 KB, 下載次數: 132)
下載附件
2017-6-28 23:14 上傳
1.014.jpg (24.69 KB, 下載次數: 121)
下載附件
2017-6-28 23:14 上傳
1.015.jpg (17.48 KB, 下載次數: 107)
下載附件
2017-6-28 23:14 上傳
1.016.jpg (21.96 KB, 下載次數: 127)
下載附件
2017-6-28 23:14 上傳
1.017.jpg (28.53 KB, 下載次數: 103)
下載附件
2017-6-28 23:14 上傳
10 作品電路的PCB圖在設計好軟件流程圖以及焊接好硬件電路后,用Altium Designer軟件進行電路的PCB設計,下圖是主電路芯片的PCB:
1.018.jpg (81.45 KB, 下載次數: 106)
下載附件
2017-6-28 23:14 上傳
11 設計心得體會及總結
1、因為設計中所用的一些工具,平時雖然接觸過,但研究不夠深入,所以此次課程設計
在選好題目之后對設計所需資料進行了系統查詢和整理,其中包括了我們學習過程中用
到的課本和網上搜索的期刊文獻等;
2、此次嵌入式實驗是比較全面的一個實驗,所涉及的內容十分廣泛,包括底層硬件結構
以及上層操作系統、驅動程序等方面,在實驗過程中雖然遇到了各種各樣的問題,但解
決問題的同時也鍛煉了我們分析問題的能力以及動手能力,做完后感覺獲益匪淺;
3、回顧此次ARM課程設計,我感慨很多,在這幾星期里,可以說苦多于甜,但是確實
又學到了很多東西,不僅鞏固了以前所學的知識,而且學到了很多書本上沒有的新的知
識。在設計調試的過程中遇到了各種各樣的問題,同時也發現了自己的不足之處;
4、在編譯和調試的過程中,由進一步加強了自己編程和改錯的能力,通過研究這方面的
課題,可以更深刻地理解交通信號燈的整個過程,同時也加強了嵌入式學習的技巧。由
于時間的關系,只能做到這些功能,我知道想要實現功能更強大的交通信號燈,還有大
量的工作要做,希望以后還可以進一步接觸此類設計。