一、前言
1.1 項目背景
根據(jù)美國玩具協(xié)會在一項研究中,過去幾年全球玩具銷售增長與GDP的世界平均水平大致相同。但全球玩具市場的內(nèi)部結(jié)構(gòu)已經(jīng)占據(jù)了巨大的位置變化:傳統(tǒng)玩具的市場份額正在下降,高科技電子玩具正在蓬勃發(fā)展。全球玩具市場的高科技電子游戲2010年的年銷售額增長了67%,但傳統(tǒng)玩具的年銷售額僅增長了1%。
2001年,十大最受歡迎的圣誕玩具之一有電子玩具。智能系統(tǒng)之前在很多領(lǐng)域,如智能工程、IT、集成引擎及行業(yè)整合正在討論,就必須變得更聰明??梢妭鹘y(tǒng)的控制概念不能滿足用戶的需求,并與這些傳統(tǒng)的控制相關(guān)的智能控制提高了一般的優(yōu)勢和較好滿足人的需求。人工智能和計算機的不斷發(fā)展,智能控制領(lǐng)域取得了很大的創(chuàng)新。因此,找到并使用遠程控制和智能技術(shù)非常重要。而且市場價值超群。
智能汽車是一種識別的多功能智能設(shè)備決策的自主水平的機械設(shè)計,信息技術(shù)和人工智能領(lǐng)域的主動管理的環(huán)境中。它可分為三個部分:一個驅(qū)動部件,所述檢測傳感器和所述控制器的一部分。分別在物流運輸方面發(fā)揮軍事,安全檢查和破壞程度進行評估的應(yīng)用的作用。
1.2 小車的現(xiàn)狀
【1】國內(nèi):在上世紀80年代末,中國開始研究智能車,幾十年的研究后,取得了一些階段性成果。7B.8智能車輛系統(tǒng)。該系統(tǒng)是由南京理工大學(xué)、北京理工大學(xué)、浙江大學(xué)、國防科技大學(xué)、清華大學(xué)等多所院校聯(lián)合硏制,屬于軍用室外智能車輛,于1995年底通過驗收。
【2】國外:智能車輛的研發(fā)在國外的很多機構(gòu)都得到了很大的創(chuàng)新,尤其是在科學(xué)和工業(yè)設(shè)計等領(lǐng)域,獲得了更進一步的擴展,研發(fā)技術(shù)已經(jīng)達到了很高的水平,其中具有代表性的智能車輛包括:
美國卡內(nèi)基梅隆大學(xué)機器人研究所研制的Navlab系列智能車輛系統(tǒng), 該系統(tǒng)的車體采用 Pontiac運動跑車,其傳感器系統(tǒng)包括視覺、差分GPS系統(tǒng)。
德國 Vamos—P智能車輛系統(tǒng)該傳感器系統(tǒng)包括兩個有源雙筒望遠鏡系統(tǒng)配置PZSA相機4種顏色,三個線性加速度計和角慣性傳感器改變狀態(tài)轉(zhuǎn)速計和發(fā)動機的測量裝置。驅(qū)動方向包括發(fā)動機轉(zhuǎn)矩,液壓制動器和電子節(jié)氣門。
二、系統(tǒng)設(shè)計
2.1 主控系統(tǒng)設(shè)計
根據(jù)設(shè)計要求,控制器主要用在控制電機,并通過有關(guān)的傳感器處理通道的軌道信息,將處理信號傳送給控制器,然后通過控制器可以進行相應(yīng)的處理,以此用來實現(xiàn)電機的前進和后退,確保在實驗范圍內(nèi)能夠進行躲避障礙和尋找痕跡還有加速減速等等動作。
供應(yīng)鏈管理為核心的系統(tǒng),在汽車的道路的控制,以達到他們的目標。 我們的系統(tǒng)進行完整的分析,關(guān)鍵要實現(xiàn)自動車輛控制,但此刻,微控制器已經(jīng)顯示出它的優(yōu)勢是簡單,方便,快捷。
STM32具有低功耗,高時鐘速度和短中斷延遲的特點。 CORTEX-M3是一款32位ARM7系列處理器,包括處理器內(nèi)核,內(nèi)存單元,總線接口和跟蹤調(diào)試單元。本設(shè)計中使用的STM32 F103ZET6微控制器直接用于最小的開發(fā)板,便于學(xué)習(xí)和使用。STM32F103功能及特點。
功能包含內(nèi)核(ARM 32位的Cortex?-M3 CPU)、儲存器、時鐘、復(fù)位和電源管理、 低功耗、 2個12位模數(shù)轉(zhuǎn)換器, 1μs轉(zhuǎn)換時間(多達16個輸入通道)、 DMA、多達80個快速I/O端口、 調(diào)試模式、多達7個定時器、多達9個通信接口、CRC計算單元, 96位的芯片唯一代碼。
特點是集成了強大的硬件系統(tǒng),使其在工作中消耗更少的電力。它是一個16/32位混合編碼指令,可以與拇指指令兼容。NVIC是CORTEX-M3的緊密耦合部分,可配置240個中斷并分為256個優(yōu)先級,CORTEX-M3還使用尾鏈技術(shù),使得背對背中斷響應(yīng)僅6個時鐘周期,因此中斷響應(yīng)更迅速。
MPU是處理器中的存儲模塊,通過定義和檢查存儲區(qū)域的屬性來實現(xiàn)存儲功能。調(diào)試訪問接口可以用作串口或串行JTAG調(diào)試端口。串口調(diào)試端口只能通過時鐘和數(shù)據(jù)兩個引腳進行調(diào)試,以保證低成本。
STM32處理器分為標準化、增強型和最新產(chǎn)品。STM32 F101為標準型,頻率為36兆赫 ;STM32 F103是增強型,頻率為72兆赫,STM32 F105和STM32 F107是最新的系列產(chǎn)品,增加了USB和以太網(wǎng)接口。
依據(jù)如上的分析,選擇P89C51 RAM單片機為這個設(shè)計的主要控制裝備,使用STM32芯片作為設(shè)計的開發(fā)芯片。由于其存儲性能強,功耗小,能滿足復(fù)雜編程功能的要求,且成本較低,對于這種設(shè)計來說是綽綽有余。
2.2 電機驅(qū)動模塊
2.2.1 供電方式
方案一:采用單電源同時提供單片機和直流電機。該方案的優(yōu)點是減小了機身的重量,操作簡單。這會讓單片機的波動變得很大,影響到單片機的性能,穩(wěn)定性變得不高。
方案二:采用雙電源供電,通過兩個外界移動電源進行供電,該方案的優(yōu)點是減小了波動,穩(wěn)定性更好,可以更好地操作汽車。
方案三:多電池串聯(lián)供電。由于單片機的工作電壓在5V左右,直流電壓也小,可以通過電池供電,使電池串聯(lián)連接,保證了系統(tǒng)的正常運行。
綜合考慮,使用第二方案。
2.2.2 驅(qū)動電機方式
功率晶體管用作功率放大器的輸出信號以驅(qū)動DC電動機。 線性控制電路的結(jié)構(gòu)比較簡單,原理簡單,加速度強。 方案H橋達林頓配置。 達林頓微處理器控制,可調(diào)孔隙率操作狀態(tài)切換時,電機速度的更精確的控制。
從電路的管道飽和效率關(guān)模式是非常高的。H型橋式電路確保了速度和方向的簡單控制。電子管的開關(guān)速度非??欤€(wěn)定性很強。它是一種廣泛應(yīng)用的PWM調(diào)速技術(shù)。現(xiàn)在市場上有很多芯片。我選擇了L298N。該實施例具有優(yōu)異的特性的頭速度,平滑控制,一個寬的速度范圍,大的過載可承受頻繁的沖擊載荷也可以實現(xiàn)無級地頻繁很快開始,制動和扭轉(zhuǎn)等。 因此,我們決定使用的功率晶體管作為發(fā)動機功率放大器DC的輸出控制。
圖2.1.1 H橋式電路
圖2.2.2 L298N
2.2.3 電機驅(qū)動選擇
方案一:DC電機的使用具有硬件電路設(shè)計簡單的優(yōu)點。當(dāng)使用額定的直流電壓時,速度變化不大,調(diào)速性能很好,性價比很高。對于小車,它可以很好地控制。
方案二:步進電機,步進電機可實現(xiàn)精確的轉(zhuǎn)角輸出,只要應(yīng)用合適的脈沖序列,電機就可以按照人們預(yù)定的速度或方向連續(xù)旋轉(zhuǎn),控制速度很慢,但軟件程序的編程是一個比直流電機更復(fù)雜。
所以我選擇方案一,好控制且性價比高。
2.3 循跡模塊
方案一:這個模塊使用了兩個紅外對管(如圖2.3),分別放在小車車前左右兩邊,由光電開關(guān)的檢測情況可知,來控制小車的行駛和轉(zhuǎn)向,通過測試表明,只要合理的安排兩個光電開關(guān)的位置,就可以達到循跡的功能。
方案二:使用三對紅外管,其中的兩個紅對外管可以檢測到黑線。 在黑線軌道之后,汽車將立即調(diào)整到中心燈開關(guān)的方向,再次檢測黑線,即返回軌道。那么它就會再次沿著黑線行駛。但是,現(xiàn)場的觀察表明,小車在尋機的過程中會左右搖擺,雖然可以正確的尋跡,但是成本和穩(wěn)定性都無法和第二方案相比較。
通過比較,我選取第二種方案來實現(xiàn)循跡
圖2.3 紅外對管
2.4 避障模塊
2.4.1 紅外線避障
方案一:在小車的中央使用紅外線管。安裝容易,可以檢測障礙物的存在,但很難確定汽車是否會在水平方向上與障礙物碰撞,不容易使汽車做出準確的轉(zhuǎn)向反應(yīng)。最終沒有采納這個方案。
方案二:車輛的前部的兩側(cè)布置了兩個紅外線管,平行于機器方向。 它可以精確地確定車輛和障礙,和及時響應(yīng)的相對距離和方向。缺點是對硬件要求較高,且成本比較大。
方案三:在小車的右側(cè)使用紅外線管。通過對該方案的測試,可以避免障礙物,充分利用資源而不浪費。但是在右側(cè)會有部分死角,不利于小車完美避障。最終沒有采納這個方案。
方案四:把一個包括有舵機的紅外線管裝置在小車的頭部。借助旋轉(zhuǎn)的功能可以全方位的了解四周的情況并及時作出反應(yīng),缺點就是我們需要安裝舵機,并編寫多個程序使它運行,這就加大了工作負擔(dān)。并且需要制作不宜過重的舵機,還要是其旋轉(zhuǎn)角度為最佳,工作過程過于麻煩,故未選擇該方案。
所以采用第二種。
2.4.2 超聲波避障
方案一:串聯(lián)電阻轉(zhuǎn)速控制系統(tǒng)。
方案二:靜態(tài)可控整流器。V-M系統(tǒng)簡稱。
方案三:脈寬調(diào)制系統(tǒng)。
旋轉(zhuǎn)式交流轉(zhuǎn)換系統(tǒng)由交流發(fā)電機驅(qū)動,交流發(fā)電機改變直流電動機,并由需要速度控制的直流電動機發(fā)電機供電。發(fā)電機的輸出電壓可以通過調(diào)整發(fā)電機勵磁電流和通過調(diào)節(jié)電機的速度被改變。
如果激勵變化的側(cè)電流 輸出電壓的極性是從電機的極性不同。因此,G-M系的可逆操作可以是相對簡單的。 該系統(tǒng)需要一個可變旋轉(zhuǎn)速度旋轉(zhuǎn)單元,其包括具有相同容量的電動機速度控制的至少兩個旋轉(zhuǎn)機械。它還需要一個激勵發(fā)生器。但他的裝備很笨重。成本高,效率低,維護不實用。而且由于技術(shù)落后,因此不需要擱置。
V-M系統(tǒng)是直流調(diào)速系統(tǒng)的主要形式。 有許多類型,例如:單相,三相或更多,相位,半波,交替,半控制,總控制等,它們可以實現(xiàn)平穩(wěn)的速度控制。 V-M系統(tǒng)的缺點是晶閘管的單向?qū)щ娦?。它不允許反向電流引起系統(tǒng)的可逆操作。另一個缺點是高操作和維護條件。最后,如果系統(tǒng)以低速運行,其功率將非常低,此時產(chǎn)生的高諧波電流將損壞附近的電氣設(shè)備。
晶閘管與相位無關(guān)。當(dāng)晶閘管跳閘時,電源電壓會施加到電機上。當(dāng)晶閘管斷開時,直流電源與電動機斷開。電動機繼續(xù)在二極管中流動,并且通過它的電壓接近零。脈沖寬度調(diào)制(PWM)。脈沖具有恒定的周期,并且僅改變?yōu)榫чl管指定的時間,即通過改變脈沖的寬度來調(diào)節(jié)連續(xù)速度。
與V-M系統(tǒng)相比,PWM調(diào)速系統(tǒng)具有以下優(yōu)點:
(1)由于PWM速度控制系統(tǒng)的高頻開關(guān),只能通過發(fā)動機電感濾波器獲得小的DC紋波電流。由于上述現(xiàn)有的信號系統(tǒng),V-M的系統(tǒng),具有相同的平均電流相對小的熱機。
(2)由于開關(guān)頻率高,如果快速響應(yīng)匹配到發(fā)動機,該系統(tǒng)能夠是寬帶,響應(yīng)速度快,因此,良好的性能,動感較強的抗干擾能力。
根據(jù)上述的綜合比較,和發(fā)動機控制能力,并在這種設(shè)計中的DC馬達的速度調(diào)節(jié)的發(fā)展方向,該設(shè)計依賴于調(diào)節(jié)PWM輸出的速度,以一個小的計算機芯片的單MEGA16,從而可以實現(xiàn)更好的控制EF。FECT與LM29芯片相結(jié)合。在避開障礙物的過程中,電機也可以通過直接控制LM29 8芯片來控制。操作方便,易于翻轉(zhuǎn)和倒退功能。
所以我選擇了方案三。
2.5 遙控變速系統(tǒng)
本課題要求智能小車可以遙控可變速,所以加上遙控系統(tǒng)。
在本課題中利用按鍵和LCD1602結(jié)合進而改變小車的速度問題。這樣可以減輕負擔(dān)且更加直接的改變小車的速度。
2.6 LCD1602液晶顯示模塊
在日常生活中,我們對液晶顯示器并不陌生。我使用的液晶的顯示部,許多電子產(chǎn)品,如計算器,萬用表,數(shù)字時鐘,和許多消費電子產(chǎn)品,數(shù)碼屏幕基材以及特殊字符和圖形的通道。 人與機器在單芯片微型計算機之間的通信接口, 一般輸出模式如下:管發(fā)光管,LED數(shù)字顯示,屏幕流體。
液晶顯示器的好處如下:顯示質(zhì)量高,由于每個點都保持液晶彩色LCD,在接收到信號亮度后,產(chǎn)生耐用性,不像陰極射線管供電(CRT),需要不斷更新新的亮點。因此,液晶顯示器畫質(zhì)高且不會閃爍。而且其數(shù)字式接口體積小、重量輕功耗低 。
另一方面,LCD的功耗主要在其內(nèi)部電極和驅(qū)動器的IC器件上消耗,因此比其他監(jiān)視器消耗更少的能量。
2.6.1 液晶顯示簡介
- 液晶顯示原理
液晶顯示器的原理依賴于液晶的物理特性。通過控制其顯示區(qū)域中的電壓,存在電子顯示器,即可以顯示圖像。其中,適用于LSI直接控制且易于操作的低厚度液晶顯示器廣泛用于移動通信設(shè)備的許多領(lǐng)域,例如筆記本電腦,數(shù)碼相機和個人數(shù)字助理。
- 液晶顯示器的分類
LCD的分類方法有很多種,根據(jù)顯示的不同,可以分為段類型,字符類型,點陣類型等。除了黑白顯示外,LCD還具有多級彩色顯示屏。如果按行為方式劃分,則可分為靜態(tài)(靜態(tài)),簡單矩陣(簡單矩陣)和有源矩陣(有源矩陣)。
字符的顯示用LCD顯示一個字符時比較復(fù)雜,因為一個字符由6×8或8×8點陣組成,既要找到和顯示屏幕上某幾個位置對應(yīng)的顯示RAM區(qū)的8字節(jié),還要使每字節(jié)的不同位為“1”,其它的為“0”,為“1”的點亮,為“0”的不亮。這樣一來就組成某個字符。但由于內(nèi)帶字符發(fā)生器的控制器來說,顯示字符就比較簡單了,可以讓控制器工作在文本方式,根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)找出顯示RAM對應(yīng)的地址,設(shè)立光標,在此送上該字符對應(yīng)的代碼即可。
1602字符型LCD簡介
液晶顯示單元是專門用于顯示字母,數(shù)字,符號等的點陣LCD顯示器。目前常用161,162,202和402行等的模塊。一般1602字符型液晶顯示器實物如圖2.6.1和2.6.2:
圖2.6.1
圖2.6.2 1602字符型液晶顯示器實物圖
2.6.2 1602LCD的基本參數(shù)及引腳功能
1602LCD主要技術(shù)參數(shù):
顯示容量:16×2個字符
芯片工作電壓:4.5—5.5V
工作電流:2.0mA(5.0V)
模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
引腳功能說明:
各引腳接口說明如表1所示:
編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 |
---|---|---|---|---|---|
1 | VSS | 電源地 | 9 | D2 | 數(shù)據(jù) |
2 | VDD | 電源正極 | 10 | D3 | 數(shù)據(jù) |
3 | VL | 液晶顯示偏壓 | 11 | D4 | 數(shù)據(jù) |
4 | RS | 數(shù)據(jù)/命令選擇 | 12 | D5 | 數(shù)據(jù) |
5 | R/W | 讀/寫選擇 | 13 | D6 | 數(shù)據(jù) |
6 | E | 使能信號 | 14 | D7 | 數(shù)據(jù) |
7 | D0 | 數(shù)據(jù) | 15 | BLA | 背光源正極 |
8 | D1 | 數(shù)據(jù) | 16 | BLK | 背光源負極 |
表2.6.1 引腳接口說明表
2.6.3 1602LCD的指令說明
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2所示:
序號 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 清顯示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 光標返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
3 | 置輸入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
4 | 顯示開/關(guān)控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
5 | 光標或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * |
6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * |
7 | 置字符發(fā)生存貯器地址 | 0 | 0 | 0 | 1 | 字符發(fā)生存貯器地址 | |||||
8 | 置數(shù)據(jù)存貯器地址 | 0 | 0 | 1 | 顯示數(shù)據(jù)存貯器地址 | ||||||
9 | 讀忙標志或地址 | 0 | 1 | BF | 計數(shù)器地址 | ||||||
10 | 寫數(shù)到CGRAM或DDRAM) | 1 | 0 | 要寫的數(shù)據(jù)內(nèi)容 | |||||||
11 | 從CGRAM或DDRAM讀數(shù) | 1 | 1 | 讀出的數(shù)據(jù)內(nèi)容 |
表2.6.2 控制命令表
1602液晶模塊通過指令編程來實現(xiàn)讀寫操作、屏幕和光標的操作。(說明:1為高電平、0為低電平)
2.6.4 1602LCD的RAM地址映射及標準字庫表
LCD模塊運行緩慢,因此在執(zhí)行每條命令前檢查模塊的忙標志,將其設(shè)置為低電平表示它不忙,否則命令無效。要顯示其指示器模塊,字符顯示的第一個字符輸入字符顯示地址,圖2.6.3是1602的內(nèi)部顯示地址。
圖2.6.3 1602LCD內(nèi)部顯示地址
當(dāng)初始化設(shè)置在液晶模塊,其中所述第一顯示模式時,光標自動地移動到右側(cè),如果液晶顯示單元的符號,無需人工干預(yù)。 前每個命令輸入被定義為液晶模塊處于繁忙狀態(tài)。
1602 LCD模塊在字符生成存儲器(CGROM)中存儲了160個不同的點陣字符,如圖2.6.4所示。這些字符是:日語假名等,每一個字符具有固定的代碼,如英文大寫字母“代碼”是01000001b(41H)時,模塊顯示在41H的圖矩陣字符。我們就能看到字母“A”。
圖2.6.4 字符代碼與圖形對應(yīng)圖
2.6.5 1602LCD的一般復(fù)位過程
延時15mS
寫指令38H(不檢測忙信號)
延時5mS
寫指令38H(不檢測忙信號)
延時5mS
寫指令38H(不檢測忙信號)
以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測忙信號
寫指令38H:顯示模式設(shè)置
寫指令08H:顯示關(guān)閉
寫指令01H:顯示清屏
寫指令06H:顯示光標移動設(shè)置
寫指令0CH:顯示開及光標設(shè)置
2.7 機械系統(tǒng)
本設(shè)計要求汽車的機械系統(tǒng)穩(wěn)定、靈活、簡單,三輪運動系統(tǒng)具有上述特點。
驅(qū)動部分:由于玩具車的直流電機功率小,車內(nèi)裝有電池、電機和電子設(shè)備,使電機負荷較重。為了使汽車平穩(wěn)地起動和平穩(wěn)地行駛,在直流電動機和輪軸之間安裝了三個減速齒輪。
電源部分:利用兩個外接電源。
電機驅(qū)動部分主要由單芯片L29 8N和ATMEGA16芯片連接,ATMGA16芯片直接與驅(qū)動電路相連。M軸承電壓,7和805,電機電壓,選擇12V電源)電源電壓輸入端子。L29 8N可同時驅(qū)動兩臺電機,最大輸出電流為2A,以其性能和價格好,選用L29 8N作為電機驅(qū)動芯片,L29 8N芯片如圖2-3所示,為了達到控制停止電機的目的。ATMEGA16的兩個PB4和PB5端口直接連接到L29 8N的兩個啟用的ENA和ENB端子。L29 8N的四個輸出端子直接連接到兩個電機以驅(qū)動電機。
三、硬件設(shè)計
3.1 總體設(shè)計
智能車由后輪驅(qū)動,后輪由兩側(cè)的電機驅(qū)動。前兩個輪子的速度被制作和停止以控制轉(zhuǎn)向。前輪是萬象車輪,起支撐作用。跟蹤光電管分別安裝在車身的左右兩側(cè)。如果左傳感器從黑線,主命令中心接收信息左側(cè)晶圓控制輪上的電機停止工作,同時右側(cè)電機繼續(xù)運行這樣使小車左向左行使。當(dāng)右側(cè)右側(cè)的傳感器感受到黑線時,主控制芯片控制和左側(cè)相同原理,這使小車向右行駛就和向左相同。
避障原理與直線相同。小車按尋跡路線行走,3個超聲波傳感器檢測,檢測前方是否有障礙物,當(dāng)有障礙物,停止,沒有障礙物,前進;前方有障礙,左右兩邊檢測,哪邊檢測距離大,往那邊走,按鍵設(shè)置前方障礙的最小距離;在避障模式下,按鍵設(shè)置最小轉(zhuǎn)彎半徑,小于轉(zhuǎn)彎半徑視為不能轉(zhuǎn)彎,小車原地后退,然后停車由此來避免障礙物做到避障功能。
3.2 驅(qū)動電路
H橋發(fā)動機電路集成在L298上面 ,因此我們可以借助該集成電路來 驅(qū)使發(fā)動機,該發(fā)動機引擎通常使用H橋發(fā)動機電路,因此L298N能夠用于驅(qū)動發(fā)動機。
圖3.2.1 L298N引腳圖
圖3.2.2原理圖
3.3 主控制電路
這個模塊主要針對采集到的信號進行了分析,并給出PWM波形來控制電機啟動、旋轉(zhuǎn)速度和停下。并重新檢測障礙物報警等功能。
圖3.5.1原理圖
四、軟件設(shè)計
4.1 電機驅(qū)動程序
#include "stm32f10x.h"
#include "SZ_STM32F103C8_LIB.h"
#include "LCD1602.h"
#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "ultrasonic.h"
u16 count = 0; //定時器計數(shù)
u32 juli_up = 200; //最小距離
u16 juli_Q = 0;
u16 juli_Z = 0;
u16 juli_Y = 0;
u16 juli = 0; //距離設(shè)定
u32 temp;
u8 start = 0; //0手動 1自動
//停止
void stop()
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
//前進
void qianjin()
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
//后退
void houtui()
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
//左轉(zhuǎn)
void zuozhuan()
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
//右轉(zhuǎn)
void youzhuan()
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
4.2 尋跡程序
void TIM3_IRQHandler(void) //TIM3
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(start==1)
{
count++;
//超聲波距離判斷 低于最小距離
if(juli<juli_up)
{
stop(); //停止
}
else
{
if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0))
{
if(count%2==0)
qianjin();//前進
else
stop(); //停止
}
else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==1)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0))
{
if(count%2==0)
zuozhuan(); //左轉(zhuǎn)
else
stop(); //停止
}
else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==1))
{
if(count%2==0)
youzhuan(); //右轉(zhuǎn)
else
stop(); //停止
}
else
{
stop(); //停止
}
}
}
}
}
int main(void)
{
delay_init(); //初始化定時器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LCD_1602Init(); //初始化lcd1602
GPIO_Configuration(); //GPIO初始化
Ultran_Init(); //超聲波初始化
delay_ms(500);
TIM3_Int_Init(20,35999); //10ms
while (1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0)
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0);//等待按鍵抬起
set_juli(); //設(shè)置距離
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0)
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0);//等待按鍵抬起
start = 1; //循跡模式
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0)
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0);//等待按鍵抬起
start = 2; //行走
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
{
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0);//等待按鍵抬起
start = 0;
}
Ultra_Ranging1(&temp); //獲取距離
juli_Q = temp;
if(start==2)
{
Ultra_Ranging2(&temp); //獲取距離
juli_Z = temp;
Ultra_Ranging3(&temp); //獲取距離
juli_Y = temp;
}
display(); //顯示界面
delay_ms(100);
}
}
4.3 避障程序
void TIM3_IRQHandler(void) //TIM3
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(start==1)
{
count++;
//超聲波距離判斷 低于最小距離
if(juli<juli_up)
{
stop(); //停止
}
else
{
if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0))
{
if(count%2==0)
qianjin();//前進
else
stop(); //停止
}
else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==1)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0))
{
if(count%2==0)
zuozhuan(); //左轉(zhuǎn)
else
stop(); //停止
}
else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==1))
{
if(count%2==0)
youzhuan(); //右轉(zhuǎn)
else
stop(); //停止
}
else
{
stop(); //停止
}
}
}
}
}