https://v.youku.com/v_show/id_XMzg5MTc4NzE2NA==.html
2 系統硬件設計
2.1 器件選定
各類汽車逐漸在現代家庭普及,停車場的車位設計要求越來越嚴苛,日益擁擠的泊車環境和窄小車位,要求人們泊車時對汽車的操縱必須更加嫻熟。因此,市場對于自動泊車等汽車智能化功能的要求也日益增加。目前自動泊車系統的設計大多是基于DSP、FPGA等的控制處理平臺,系統設計復雜,價格昂貴。由于STM32較于DSP、FPGA系統設計簡單,價格低廉,故而本文以無人駕駛智能汽車自動泊車系統為應用背景,以紅外線技術為依托,完成基于STM32F103控制平臺的智能車研究與應用。
將單片機用作測控系統時,總要有被測信號輸入通道,由計算機拾取必要的輸入信息。對于測量系統而言,其核心任務是怎么樣獲得準確的被測信號;而對測控系統來說,不可缺少的環節是對條件的監測和對被控對象狀態的測試,傳感器是實現測量與控制的第一環節,是測控系統的關鍵部分,一切準確的測量和控制都將在傳感器對原始信號的準確可靠的轉換和捕捉,工業生產過程的自動化測量和控制,基本主要依賴各種傳感器來控制和檢測生產過程中的各種量,使系統和設備在最佳狀態正常運行,從而保證生產的高質量和高效率。
2.2 主控系統電路和各硬件模塊
2.1.1 STM32F103ZET6開發平臺
本研究采ARM cortex-M3內核的32位處理器STM32F 103ZET6作為主控制器,LQFP-144封裝,該芯片內部采用哈佛結構、其中集成有64KB的RAM和512KB的FLASH,運算速度快,并且具有體積小和低功耗的特點,在工業控制方面具有較高的應用前景。
STM32F103ZET6芯片介紹:
1、基于ARM Cortex-M3核心的32位微控制器,LQFP-144封裝;
2、512K片內FLASH(相當于硬盤),64K片內RAM,片內FLASH支持在線編程;
3、高達72M的頻率,數據、指令分別走不同的流水線,以確保CPU運行速度達到最大;
4、通過片內BOOT區,可實現串口下載程序(ISP);
5、片內雙RC晶振,提供8M和32K的頻率;
6、支持片外高速晶振(8M),和片外低速晶振(32K)。其中片外低速晶振可用于CPU的實時時鐘,帶后備電源引腳,用于掉電后的時鐘行走;
7、42個16位的后備寄存器,利用外置的紐扣電池,和實現掉電數據保存功能;
8、支持JTAG,SWD調試.配合廉價的J-LINK,實現高速低成本的開發調試方案;
9、多達80個IO(大部分兼容5V邏輯),4個通用定時器,2個高級定時器,2個基本定時器,3路SPI接口,2路I2S接口,2路I2C接口,5路USART,一個USB從設備接口,一個CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash接口的16位總線-FSMC;
10、3路共16通道的12位AD輸入,2路共2通道的12位DA輸出。
11、CPU操作電壓范圍:2.0-3.6V;支持片外獨立電壓基準。
2.1.2 L298N電機驅動模塊
驅動模塊使用L298N作為主驅動芯片,具有驅動能力強,發熱量低,抗干擾能力強的特點。模塊可以使用內置的78M05通過驅動電源部分取電工作,但是為了避免穩壓芯片損壞,當使用大于12V驅動電壓的時候,需使用外置的5V邏輯供電。使用大容量濾波電容,續流保護二極管,可以提高可靠性。
L298N是一種高電壓、大電流電機驅動芯片。該芯片采用15腳封裝。主要特點是:工作電
壓高,最高工作電壓可達46V;輸出電流大,瞬間峰值電流可達3A,持續工作電流為2A;額定功率25W。內含兩個H橋的高電壓大電流全橋式驅動器,可以用來驅動直流電動機和步進電動機、繼電器線圈等感性負載,采用標準邏輯電平信號控制,具有兩個使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個邏輯電源輸入端。使內部邏輯電路部分在低電壓下工作;可以外接檢測電阻,將變化量反饋給控制電路。使用L298N芯片驅動電機,該芯片可以驅動一臺兩相步進電機或四相步進電機,也可以驅動兩臺直流電機。
2.1.3 TFT LCD顯示器
本文所研究的智能車采用以ILI9341為驅動器的TFT LCD作為顯示器,用于模擬汽車的駕駛儀表盤,顯示駕駛模式和車速等信息。
ILI9341是一個用于TFT液晶顯示的單芯片控制驅動器,具有262,144色的240RGB X 320 像素顯示解決方案。它的組成包括一個720通道的源極驅動器,一個320通道的柵極驅動器,172800字節用于圖形顯示的GRAM,以及供電電路。
ILI9341支持8/9/16/18位數據總線的MCU接口,6/16/18位數據總線的RGB接口,以及3/4線的SPI接口。移動圖像區域可以通過窗口地址功能在內部GRAM來指定。指定的窗口區域可以選擇性地更新,因此,可以在圖像區域同時獨立地顯示移動圖像。
ILI9341可以使用1.65-3.3V的I/0接口電壓和一個對應的電壓跟隨電路來產生驅動LCD的電壓。ILI9341有精確的電壓控制,來支持全色,8色顯示模式和睡眠模式,這使得ILI9341成為一個理想的中小型手提產品的LCD驅動器,比如數字電話,智能手機,MP3和PMP。
2.1.4 紅外無線遙控套件
紅外無線遙控套件由Mini紅外遙控器和38KHz紅外接收模塊組成,Mini紅外遙控器具有17個功能鍵,發射距離遠可達8米,適合在室內操控多種設備。紅外接收模塊可接收標準38KHz調制的遙控器信號,通過對進行編程,即可實現對遙控器信號的、解碼操作,從而可制作多種遙控機器人以及互動作品。
紅外線簡介:人的眼睛能看到的可見光按波長從長到短排列,依次為紅、橙、黃、綠、青、藍、紫。其中紅光的波長范圍為0.62~0.76μm;紫光的波長范圍為0.38~0.46μm。比紫光波長還短的光叫紫外線,比紅光波長還長的光叫紅外線。紅外線遙控是利用波長為0.76~1.5μm之間的近紅外線來傳送控制信號。
通常紅外遙控為了提高抗干擾性能和降低電源消耗,紅外遙控器常用載波的方式傳送二進制編碼,常用的載波頻率為38kHz,這是由發射端所使用的455kHz晶振來決定的。在發射端要對晶振進行整數分頻,分頻系數一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遙控系統采用36kHz、40kHz、56kHz等,一般由發射端晶振的振蕩頻率來決定。所以,通常的紅外遙控器是將遙控信號(二進制脈沖碼)調制在38KHz的載波上,經緩沖放大后送至紅外發光二極管,轉化為紅外信號發射出去的。二進制脈沖碼的形式有多種,其中最為常用的是NEC Protocol的PWM碼(脈沖寬度調制)和Philips RC-5 Protocol的PPM碼(脈沖位置調制碼,脈沖串之間的時間間隔來實現信號調制)。若需要開發紅外接收設備,一定要了解紅外遙控器的編碼方式和載波頻率,才能選取一體化紅外接收頭和制定解碼方案。
NEC碼的位定義:一個脈沖對應560us的連續載波,一個邏輯1傳輸需要2.25ms(560us脈沖+1680us低電平),一個邏輯0的傳輸需要1.125ms(560us脈沖 + 560us低電平)。而紅外接收頭在收到脈沖的時候為低電平,在沒有脈沖的時候為高電平,這樣,我們在接收頭端收到的信號為:邏輯1應該是560us低 + 1680us高,邏輯0應該是560us低 + 560us高。所以可以通過計算高電平時間判斷接收到的數據是0還是1。
NEC遙控指令的數據格式為:引導碼、地址碼、地址反碼、控制碼、控制反碼。引導碼由一個 9ms 的低電平和一個 4.5ms 的高電平組成,地址碼、地址反碼、控制碼、控制反碼均是8 位數據格式。按照低位在前,高位在后的順序發送。采用反碼是為了增加傳輸的可靠性(可用于校驗)。數據格式如下圖
NEC碼還規定了連發碼(由 9ms 低電平 +2.5ms 高電平 +0.56ms 低電平 +97.94ms 高電平組成),如果在一幀數據發送完畢之后,紅外遙控器按鍵仍然沒有放開,則發射連發碼,可以通過統計連發碼的次數來標記按鍵按下的長短或次數。
2.1.5 紅外避障與循跡模塊
本設計采用了七路紅外避障模塊和兩路TCRT5000紅外反射傳感器。七路紅外避障模塊主要用作自動泊車功能的探測傳感器,兩路TCRT5000紅外反射傳感器則是應用于黑線循跡功能。
紅外避障傳感器模塊對環境光線適應能力強,其具有一對紅外線發射與接收管,發射管發射出一定頻率的紅外線,當檢測方向遇到障礙物(反射面)時,紅外線反射回來被接收管接收,經過比較器電路處理之后,綠色指示燈會亮起,同時信號輸出接口輸出數字信號(一個低電平信號),可通過電位器旋鈕調節檢測距離,有效距離范圍2~30cm,工作電壓為3.3V-5V。該傳感器的探測距離可以通過電位器調整、具有干擾小、便于裝配、使用方便等特點,可以廣泛應用于機器人避障、避障小車、流水線計數及黑白線循跡等眾多場合。
模塊參數說明:
1、當模塊檢測到前方障礙物信號時,電路板上綠色指示燈點亮電平,同時OUT端口持續輸出低電平信號,該模塊檢測距離2~30cm,檢測角度35°,檢測距離可以通過電位器進行調節,順時針調電位器,檢測距離增加;逆時針調電位器,檢測距離減少。
2、傳感器主動紅外線反射探測,因此目標的反射率和形狀是探測距離的關鍵。其中黑色探測距離最小,白色最大;小面積物體距離小,大面積距離大。
3、傳感器模塊輸出端口OUT可直接與單片機IO口連接即可,也可以直接驅動一個5V繼電器;連接方式:VCC-VCC;GND-GND;OUT-IO;
4、比較器采用LM393,工作穩定;
5、可采用3-5V直流電源對模塊進行供電。當電源接通時,紅色電源指示燈點亮;
6、具有3mm的螺絲孔,便于固定和安裝;
7、電路板尺寸:3.2cm*1.4cm。
智能車使用12V 18650鋰電池組作為電源,為MCU及各個模塊進行供電。采用LM2596S DC-DC可調降壓穩壓電源模塊和AMS1117-3.3V 降壓穩壓模塊對驅動電路及控制電路進行降壓穩壓保護。在實驗過程中,多次使用萬用表對各個模塊的電壓進行測量,以防燒毀元器件。
3 系統軟件設計
3.1 軟件設計思路
在軟件設計部分,本設計主要分成了五大部分,其中包括LED控制程序、TFT LCD驅動程序、按鍵驅動程序、電機控制程序、紅外遙控程序。在電機控制程序部分,包括了PWM配置函數、紅外傳感器輸入信號配置函數、TIM3初始化程序、自動泊車程序、黑線循跡程序、測速程序,并且編寫了13種不同占空比的小車前進、后退、轉向函數。在紅外遙控程序部分,先用紅外解碼獲得遙控器鍵值的編碼數據,再對所需要的鍵值進行定義,從而實現固定按鍵控制相應的功能。TFT LCD顯示的數據依次為:設計名稱、車速、遙控器鍵值、按鍵連續按下次數、智能車行駛狀態。
3.2 系統調試
若要實現本設計中的自動泊車及黑線循跡兩大功能,除了傳感器的選用及調試外,更為重要的是如何在不同的路況下改變智能車的行駛速度。本設計使用PWM輸出實現對電機轉動速度的控制。PWM是Pulse Width Modulation的縮寫,中文意思是脈沖寬度調制,簡稱脈寬調制。它是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,其控制簡單、靈活和動態響應好等優點而成為電力電子技術最廣泛應用的控制方式,其應用領域包括測量,通信,功率控制與變換,電動機控制、伺服控制、調光、開關電源,甚至某些音頻放大器,因此學習PWM具有十分重要的現實意義。也可以這樣理解,PWM是一種對模擬信號電平進行數字編碼的方法。通過高分辨率計數器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM 信號仍然是數字的,因為在給定的任何時刻,滿幅值的直流供電為完全有(ON),或完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上。通(ON)的時候即是直流供電被加到負載上的時候,斷(OFF)的時候即是供電被斷開的時候。若帶寬足夠,任何模擬值都可以使用 PWM 進行編碼。
為了實現智能車正常倒入車庫和自動循跡的功能,筆者在制作小車時進行了多次試驗,詳細記錄各類情況,淘汰掉不合適的數據,最終獲得較為穩定的車速變化數據,并對自動泊車的算法進行了多次優化,觀察到了較為理想的實驗現象。
黑線循跡功能采用反射式光電開關來識別軌跡上的黑線標記信號,這種光電開關的紅外發射管和接收管位于同一側,光敏三極管只能接收反射回的紅外光。當車身下面是黑線時,由于黑線吸收部分光,光敏三極管接收到的紅外光不能使光敏三極管導通,光電開關輸出高電平,經非門輸出低電平。反之,當車身下面是白色的地面時,紅外發射管發射的光經其反射后,被接收管接受,光電開關輸出低電平,經非門整形后輸出高電平。將非門的輸出接至單片機IO口。車在前進和后退過程中,小車每過一道黑線,便產生一次電平變化,主程序從而調用相應的子程序,隨著小車的不斷行駛,相應的程序依次被調用執行,使小車在跑道上按設計要求時快、時慢、時前進、時轉向。
單片機源程序如下:
- #include "led.h"
- #include "key.h"
- #include "delay.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "remote.h"
- #include "beep.h"
- #include "motor_control.h"
- int main(void)
- {
- u8 key;
- u8 t=0;
- u8 *str=0;
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為115200
- LED_Init(); //LED端口初始化
- LCD_Init();
- Beep_Init();
- Remote_Init(); //紅外接收初始化
- GPIO_Configuration();//電機
- Control_GPIOC_Config();//傳感器
-
- POINT_COLOR=RED; //設置字體為紅色
- LCD_ShowString(30,50,200,16,16,"STM32 CAR");
- LCD_ShowString(30,70,200,16,16,"REMOTE CAR");
- LCD_ShowString(30,90,200,16,16,"SPEED: ");
- LCD_ShowString(30,130,200,16,16,"KEYVAL:");
- LCD_ShowString(30,150,200,16,16,"KEYCNT:");
- LCD_ShowString(30,170,200,16,16,"SYMBOL:");
- while(1)
- {
- key=Remote_Scan();
- if(key)
- {
- LCD_ShowNum(86,130,key,3,16); //顯示鍵值
- LCD_ShowNum(86,150,RmtCnt,3,16); //顯示按鍵次數
- switch(key)
- {
- case 24: Forward_run();str="UP";break; //UP
- case 74: Backward_run();str="DOWN";break; //DOWN
- case 16: LEFT();str="LEFT";break; //LEFT
- case 90: RIGHT();str="RIGHT";break; //RIGHT
- case 56: Stop();str="STOP";break; //STOP
-
- case 162: LED_L();str="1";break; //"1"
- case 98: LED_M();str="2";break; //"2"
- case 226: Left_Back();str="AUTO_PARKING";break; //"3"
- case 34: X_J();str="TRACKING";break; //"4"
- }
- LCD_Fill(86,170,116+8*8,170+16,WHITE); //清楚之前的顯示
- LCD_ShowString(86,170,200,16,16,str); //顯示SYMBOL
- }else delay_ms(10);
-
- t++;
- if(t==50)
- {
- t=0;
- LED0=!LED0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
紅外遙控循跡自動泊車智能車程序.rar
(343.4 KB, 下載次數: 258)
2018-10-31 15:14 上傳
點擊文件名下載附件