欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5104|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于AVR單片機(jī)的多功能智能小車系統(tǒng)設(shè)計文檔 含原理圖 源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:236068 發(fā)表于 2018-12-28 12:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
作為現(xiàn)代社會的新發(fā)明,多種高科技技術(shù)的集中體現(xiàn),智能車輛將會是未來車輛發(fā)展的一個必然趨勢。它可以在無人參與的情況下,根據(jù)預(yù)習(xí)設(shè)定的信息,自動地完成一系列的工作,從而將許多人從繁重地勞動中解脫出來。與傳統(tǒng)汽車相比,智能車輛更加安全、節(jié)能、環(huán)保,可以大大地提高人們的生活質(zhì)量。目前為止,由最新技術(shù)生產(chǎn)的智能車輛已將在交通、運(yùn)輸、航天、工業(yè)等方面發(fā)揮出來舉足輕重地作用[1]。
單片機(jī)又名微控制器,它將一個大型計算機(jī)的幾乎所有功能都集中在了一個小小的芯片上,它體積小、質(zhì)量輕、功耗低,十分適合初學(xué)者進(jìn)行學(xué)習(xí)和開發(fā)使用,并且,單片機(jī)的結(jié)構(gòu)與真正的計算機(jī)幾乎相同,學(xué)習(xí)單片機(jī)是了解計算機(jī)原理和結(jié)構(gòu)的最佳選擇[2]。
在本次課題中,以AVR單片機(jī)為控制核心,以RPR220型光電對管、E18-D80NK傳感器等傳感器為輔助器件,設(shè)計并實現(xiàn)了智能小車系統(tǒng)。小車是一個二輪驅(qū)動小車,后方由一個萬向輪可以靈活轉(zhuǎn)向。在本文中,詳細(xì)介紹了智能小車的整體設(shè)計思路,以及各個部分的軟硬件設(shè)計。小車通過RPR220型光電對管實現(xiàn)了循跡功能,通過E18-D80NK傳感器實現(xiàn)了避障功能,并通過單片機(jī)將這些模塊有機(jī)的整合到一起,利用C語音進(jìn)行編程設(shè)計,使用ICC7.22開發(fā)環(huán)境對小車進(jìn)行程序開發(fā)。小車具有運(yùn)行穩(wěn)定、價格便宜、能耗低等優(yōu)點

目錄
摘   要
Abstract
第1章 緒論
1.1 研究的背景和意義
1.2 國內(nèi)外研究現(xiàn)狀及發(fā)展前景
1.3 本次設(shè)計的主要任務(wù)
第2章 系統(tǒng)方案設(shè)計
2.1 總體設(shè)計框圖
2.2 核心控制單元的選擇
2.3 循跡方案設(shè)計
2.4 避障方案設(shè)計
2.5 電機(jī)驅(qū)動方案選
2.6 電機(jī)選擇
第3章 系統(tǒng)硬件電路設(shè)計
3.1 最小系統(tǒng)電路
3.2 循跡模塊電路
3.3 避障模塊
3.4 電機(jī)驅(qū)動模塊
3.4.1 L298N電機(jī)驅(qū)動芯片
3.4.2 PWM調(diào)速原理
3.4.3 驅(qū)動電路
第4章 系統(tǒng)軟件設(shè)計
4.1 ICCAVR簡介
4.2 主控制模塊主程序設(shè)計
4.3 紅外循跡模塊子程序設(shè)計
4.4 紅外避障模塊子程序設(shè)計
4.5 電機(jī)驅(qū)動模塊子程序設(shè)計
第5章 結(jié)論
參考文獻(xiàn)
致    謝
附 錄A 總電路圖
附 錄B 源程序

第1章 緒論
1.1 研究的背景和意義
智能車輛技術(shù)集成了機(jī)械、電子、自動化等多學(xué)科的發(fā)展,代表了現(xiàn)代技術(shù)發(fā)展的前沿。是未來車輛發(fā)展的必然趨勢。在實際生活中,智能車輛通常需要根據(jù)人們的預(yù)設(shè)程序完成跟蹤和避障。其中,大多數(shù)依靠傳感器技術(shù)來獲取路線和周圍的環(huán)境。
本文以AVR作為控制核心,設(shè)計制作了智能尋線小車。它使用光線對管和紅外傳感器收集周圍的各種信息,自動沿著地面設(shè)定的路線行走,并且可以在行走過程中自動躲避障礙物。智能小車采用前輪驅(qū)動,兩輪采用直流電機(jī),后輪采用萬向輪。為了確保小車平穩(wěn)正常地運(yùn)行,我們采用PID算法控制直流電機(jī)地運(yùn)行。本系統(tǒng)具有操作簡單、成本低、可靠性高、結(jié)構(gòu)緊湊等特點[4]。
1.2 國內(nèi)外研究現(xiàn)狀及發(fā)展前景
智能車輛系統(tǒng)是一種集中了計算機(jī)技術(shù)、自動化技術(shù)、傳感器技術(shù)等多種高科技技術(shù)于一體的綜合系統(tǒng)。從目前的發(fā)展趨勢來看,智能車輛將是未來世界汽車行業(yè)發(fā)展的最終形態(tài)。相比于傳統(tǒng)汽車,智能車輛擁有無法比擬的巨大優(yōu)勢。
首先,智能車輛是由智能計算機(jī)系統(tǒng)控制、連接互聯(lián)網(wǎng)自動駕駛,相比于傳統(tǒng)汽車,不僅將駕駛?cè)藛T從繁重的駕駛工作中解放了出來,還可以大大地提高汽車行駛的安全系數(shù)。據(jù)谷歌調(diào)查,大部分交通事故都是人為造成的。目前隨著輔助駕駛技術(shù)、半自動駕駛技術(shù)的發(fā)展普及,智能駕駛系統(tǒng)可以實時監(jiān)控駕駛?cè)藛T的狀態(tài),防止駕駛?cè)藛T醉酒駕駛、疲勞駕駛、不遵守交通規(guī)則駕駛等行為,交通事故的發(fā)生率降低了50%~60%。在未來,隨著技術(shù)的發(fā)展,全自動駕駛普及后,完全不需要駕駛?cè)藛T,甚至可以完全避免交通事故的發(fā)生。
其次,智能車輛擁有更為先進(jìn)的人機(jī)交互界面。智能車輛不僅搭載有智能駕駛系統(tǒng),還擁有智能生活系統(tǒng),使駕駛?cè)藛T和乘客可以更舒適的享受在車上的時光。假如乘客有什么突發(fā)情況,智能生活系統(tǒng)還可以提供緊急解決方案。例如,在行駛過程中,如果乘客突發(fā)疾病,智能生活系統(tǒng)會主動提出醫(yī)療知識提示,防止周圍的朋友因為不懂醫(yī)療知識而妄動患者造成二次傷害。并且,智能生活系統(tǒng)會自動將情況上傳至互聯(lián)網(wǎng),將病情告知醫(yī)院。而且,智能生活系統(tǒng)還會憑借車聯(lián)網(wǎng)疏散通往醫(yī)院車輛,使得汽車可以盡快到達(dá)醫(yī)院,使病人得到及時的治療。
最后,相比傳統(tǒng)汽車,智能車輛更為節(jié)能、環(huán)保。據(jù)谷歌調(diào)查,傳統(tǒng)汽車大部分時間都處于停用狀態(tài),利用率較低。智能車輛可以整合車輛信息,將車輛按需分配,提高車輛的利用率,從而減少車輛數(shù)量,達(dá)到節(jié)能、環(huán)保的效果。
國外許多發(fā)達(dá)國家大約在1950年左右就開始研究智能車輛了,截止到目前,一些簡單地半自動智能車已經(jīng)得到廣泛地應(yīng)用,但是,全自動智能汽車仍然遙遙無期。2017年9月,美國運(yùn)輸部對汽車的無人駕駛系統(tǒng)的安全性做出了評估,為以后在國家層面制定相關(guān)法律法規(guī)奠定了基礎(chǔ)。截止現(xiàn)在,美國已經(jīng)有22個州以上通過了相關(guān)的法律。目前,輔助駕駛技術(shù)和半自動駕駛技術(shù)已經(jīng)得到廣泛的普及,世界汽車巨頭正在致力于發(fā)展第三階段的全自動駕駛。
與美國等發(fā)達(dá)國家相比,我國的智能車輛技術(shù)的發(fā)展之路還比較漫長。我國的智能車輛技術(shù)大約是從1980年左右開始起步研究的,目前在一些沿海城市有了很大的發(fā)展。在我國,人們正在不斷地加深對智能車輛的重視程度,國家正在不斷加大對智能車輛的研發(fā)資金投入力度。相信經(jīng)過我國的大力研究,以及龐大的市場刺激,我國戴爾智能車輛技術(shù)將會飛速提高。據(jù)大數(shù)據(jù)調(diào)查分析,未來我國對智能車輛的需求非常大,在2020年左右,半自動駕駛汽車的市場占有率將達(dá)到30%,在2025年左右,將達(dá)到50%。在2018年,中國的智能汽車將達(dá)到50萬輛。到時候,巨大的市場將會推動技術(shù)的快速發(fā)展,刺激我國的汽車產(chǎn)業(yè)尋求技術(shù)突破,促進(jìn)智能汽車產(chǎn)業(yè)的優(yōu)勝劣汰。如圖1-1為常見的智能小車。

圖1-1 智能小車

1.3 本次設(shè)計的主要任務(wù)
本次課題主要設(shè)計的是一個簡易的智能電動車,采用AVR單片機(jī)作為小車的檢測和控制核心。采用RPR220型光電對管來檢測道路上的黑線,從而把反饋到的信號送單片機(jī),是單片機(jī)按照預(yù)定的工作模式控制小車在各區(qū)域按預(yù)定的軌跡行駛。并且在小車的行駛過程中,可以自動識別障礙物并自動躲避。

第2章 系統(tǒng)方案設(shè)計
2.1 總體設(shè)計框圖
在系統(tǒng)層面而言,本系統(tǒng)由四個部分組成。控制核心、循跡模塊、避障模塊、電機(jī)驅(qū)動模塊。首先,循跡模塊和避障模塊獲取周圍的信息,然后將信息傳遞至控制核心,控制核心進(jìn)行信息處理后,根據(jù)預(yù)習(xí)設(shè)定的程序,將信號傳遞至電機(jī)驅(qū)動模塊,驅(qū)動電機(jī)運(yùn)行。這樣,就完成了小車的循跡和避障功能。系統(tǒng)組成框圖如圖2-1所示[5]。

圖2-1 總體設(shè)計框圖

2.2 核心控制單元的選擇
本課題采用ATmega16單片機(jī)作為核心控制單元,ATmega16單片機(jī)是采用 RISC結(jié)構(gòu)的AVR內(nèi)核單片機(jī)。ATmega16單片機(jī)擁有131個機(jī)器指令,32個8位通用工作寄存器等,并且在內(nèi)部具有2個時鐘周期的硬件乘法器。ATmega16單片機(jī)功耗低、價格便宜、運(yùn)行速度快,十分適合作為嵌入式控制核心。ATmega16單片機(jī)的實物圖如圖2-2所示。

圖2-3 ATmega16單片機(jī)的實物圖

2.3 循跡方案設(shè)計
方案1:用光敏電阻組成光敏探測器
光敏電阻的阻值會隨著周圍環(huán)境中的光線強(qiáng)度變化而變化,光照越強(qiáng),阻值就越低。當(dāng)小車行駛時,光敏探測器會不斷地對周圍的環(huán)境進(jìn)行探測。小車的行駛環(huán)境為純白色背景下的黑色軌跡。當(dāng)光敏探測器探測到白色背景時,反射光強(qiáng)度較強(qiáng),光敏電阻的阻值會降低;當(dāng)探測到黑色軌跡時,由于黑色的吸光作用,發(fā)射光的強(qiáng)度將會降低,光敏電阻的阻值將會變大。正是根據(jù)以上原理,小車可以使用光敏探測器進(jìn)行循跡檢測。但是由于光敏探測器受環(huán)境中光照強(qiáng)度的影響較大,不能穩(wěn)定的工作。
方案2:用CCD攝像頭傳感器
線性CCD傳感器攝像頭可以將光線信號轉(zhuǎn)換為電荷信號,再傳送至單片機(jī)進(jìn)行處理。CCD攝像頭傳感器的優(yōu)點是探測距離遠(yuǎn),可以提前探測道路情況,以便做出減速轉(zhuǎn)彎等操作。使得小車的整體平均速度得到提高,具有良好的前瞻性。但是CCD攝像頭傳感器對于單片機(jī)小車來說,消耗資源略大,而且在實際過程中,發(fā)現(xiàn)CCD攝像頭在市場上比較稀少,購買難度較大。
方案3:用RPR220型光電對管
RPR220與光敏探測器相似,是一款反射型的光電探測器。首先,RPR220型光電對管會發(fā)射出紅外線,當(dāng)紅外線傳至白色背景時,會反射回來重新被探測器接收,進(jìn)而輸出一個高電平;若紅外線傳至黑色軌跡時,黑色軌跡會將紅外吸收,探測器檢測不到反射光,就會輸出低電平。RPR220型光電對管具有體積小、結(jié)構(gòu)緊湊、電路簡單、性能穩(wěn)定等優(yōu)點。
由于光敏電阻易受周圍環(huán)境光照強(qiáng)度影響,CCD 攝像頭對單片機(jī)片內(nèi)資源消耗大等原因,本課題最終確定選擇方案3 。
2.4 避障方案設(shè)計
方案1:使用超聲波探測器
超聲波探測器的原理是由探測器發(fā)出人耳不可聽見的超聲波,超聲波觸碰到物體后反射回探測器。通過檢測超聲波從發(fā)射到反射回來所使用的時間,就可以計算出與物體的距離。超聲波探測器的優(yōu)點是可以在較差的環(huán)境中正常工作,缺點是探測精度較低,使用成本較高。
方案2:使用激光測距傳感器
激光測距傳感器的測距原理與超聲波探測器類似,傳感器發(fā)射出激光,經(jīng)反射后回到傳感器,經(jīng)過處理計算后即可得到相應(yīng)的距離。激光測距傳感器的優(yōu)點是測量距離較長,測量精度較高;缺點是對資源的消耗較大,價格略昂貴。
方案3:使用紅外避障傳感器
E18-D80NK傳感器的邏輯非常簡單,它由發(fā)射器和紅外接收器組成,負(fù)責(zé)感知某個物體的存在。它有一個圓柱形主體,通過鉆孔可以很容易地安裝到原型中,其中2個環(huán)用于固定,一個在內(nèi)部,另一個在原型外部。它的連接通過3個引腳完成,傳感器可以有兩種不同的連接模式,它有兩個信號電平,低電平(0.3到1.5V)和高電平(2.3到5V)。檢測距離可以在3到80厘米之間進(jìn)行調(diào)整,通過位于傳感器底部的電位計進(jìn)行。
由以上分析,本課題最終確定選擇方案3。
2.5 電機(jī)驅(qū)動方案選
方案1:采用由晶體管組成的H橋電路
H橋電路可以將直流電逆變?yōu)榭勺冾l率的交流電,采用PWM 方式控制電機(jī)的運(yùn)行。PWM是一種脈沖寬度調(diào)制方式,其原理是通過調(diào)整脈沖的占空比來調(diào)整一個周期內(nèi)電機(jī)的通電時間,進(jìn)而調(diào)節(jié)電機(jī)的運(yùn)轉(zhuǎn)速度。H橋電路的優(yōu)點是穩(wěn)定性好,應(yīng)用廣泛。
方案2:采用L298N驅(qū)動芯片
L298N屬于H橋集成電路,可驅(qū)動大功率直流電機(jī)、步進(jìn)電機(jī)等。L298N的優(yōu)點是它的輸入端可以直接與單片機(jī)相連,這樣,可以便于直接受單片機(jī)控制。最重要的是,L298N可以同時驅(qū)動兩臺直流電機(jī),恰好與本課題相符。
由于以上分析,本課題最終確定選擇方案2 。
2.6 電機(jī)選擇
方案1:采用步進(jìn)電機(jī)
步進(jìn)電機(jī)是由脈沖信號驅(qū)動轉(zhuǎn)動的,其特點是可以精確地定位其轉(zhuǎn)過的角度,進(jìn)而精確地確定其行駛的距離。但是,步進(jìn)電機(jī)難以獲得較大的轉(zhuǎn)矩,難以獲得較大的轉(zhuǎn)速,資源利用率略低,更多地使用在數(shù)控機(jī)床等需要精確控制的地方[6]。
方案2:采用直流減速電機(jī)
直流減速電機(jī)是指在普通直流電機(jī)的基礎(chǔ)上,配套齒輪減速箱。具有節(jié)省空間、能耗低、性能穩(wěn)定等優(yōu)點,廣泛地應(yīng)用于自動化行業(yè)中。
由以上分析,步進(jìn)電機(jī)不適用于本次設(shè)計的要求,故本課題最終確定采用方案2。

第3章 系統(tǒng)硬件電路設(shè)計
3.1 最小系統(tǒng)電路
本課題的中央處理器是ATMEGA16單片機(jī),其主要功能是不停地接收由尋跡模塊和避障模塊中的傳感器發(fā)送過來的信號,經(jīng)過處理后將信息發(fā)送至電機(jī)驅(qū)動模塊,從而實現(xiàn)對周圍環(huán)境的實時響應(yīng)。如圖3-1是較為常見的帶燒錄接口的單片機(jī)最小系統(tǒng)圖。

圖3-1 最小系統(tǒng)電路

3.2 循跡模塊電路
循跡模塊電路所用傳感器是RPR220型光電對管,如圖3-2所示。RPR220是一款集成式光電探測器,其發(fā)射極為GaAs紅外發(fā)射二極管,接收器為高靈敏度硅平面光電晶體管。

圖3-2 RPR220

GaAs紅外發(fā)射二極管向目標(biāo)發(fā)射紅外線,光電晶體管接收到由目標(biāo)反射的紅外線后,向單片機(jī)發(fā)射電平跳變信號。當(dāng)小車行駛在白色背景上時,安裝在小車下方的發(fā)射極對地面發(fā)射紅外光,經(jīng)白色背景反射后,光電晶體管將打開。尋跡模塊電路如圖3-3所示。

圖3-3尋跡模塊電路圖

當(dāng)小車行駛在黑色軌跡上時,紅外光被黑色背景吸收,光電晶體管不能接收到反射光,LM339電壓比較器截止,輸出低電平至單片機(jī)。因此,根據(jù)單片機(jī)I/O口接收電平不同,即可判斷小車的行駛情況。
為了保證小車沿黑線行駛,采用了四個檢測器并行排列,檢測器排列位置如圖3-4所示。其編號1至4對應(yīng)的硬件電路分別接在單片機(jī)的PA0、PA1、PA2、PA3端口。在小車運(yùn)動過程中,結(jié)合查詢方式,通過程序控制小車運(yùn)動軌跡。如果2號紅外對管和3號紅外對管檢測到黑線,則單片機(jī)控制小車向前直走;如果2號紅外對管偏離黑線,3號紅外對管檢測到黑線,則單片機(jī)控制小車輕微左移;如果3號紅外對管偏離黑線,2號紅外對管檢測到黑線,則單片機(jī)控制小車輕微右移;如果2號和3號紅外對管偏離黑線,1號紅外對管檢測到黑線,則單片機(jī)控制小車向左移動;如果2號和3號紅外對管偏離黑線,4號紅外對管檢測到黑線,則單片機(jī)控制小車向左移動[7]。

圖3-4 檢測器位置

3.3 避障模塊
避障模塊采用型號為E18-D80NK的紅外避障傳感器,如圖3-5所示。

圖3-5 E18-D80NK

E18-D80NK傳感器的邏輯非常簡單,它由發(fā)射器和紅外接收器組成,負(fù)責(zé)感知某個物體的存在。它有一個圓柱形主體,通過鉆孔可以很容易地安裝到原型中,其中2個環(huán)用于固定,一個在內(nèi)部,另一個在原型外部。它的連接通過3個引腳完成,傳感器可以有兩種不同的連接模式,它有兩個信號電平,低電平(0.3到1.5V)和高電平(2.3到5V)。檢測距離可以在3到80厘米之間進(jìn)行調(diào)整,通過位于傳感器底部的電位計進(jìn)行[8]。

圖3-6 E18-D80NK原理圖

E18-D80NK電氣特性如表3-1。

表3-1 E18-D80NK電氣特性

紅色

綠色

黃色

工作電壓

工作電流

驅(qū)動電流

感應(yīng)距離

VCC

GND

OUT

5VDC

10-15mA

100mA

3-80CM


E18-D80NK紅外避障傳感器在小車正常運(yùn)行時,輸出高電平;當(dāng)檢測到前方有障礙物時,輸出低電平,黃色的線作為E18-D80NK紅外避障傳感器的輸出口,直接與單片機(jī)相連,將檢測信號送入單片機(jī)中,經(jīng)進(jìn)一步處理后,使小車做出相應(yīng)的變化。避障模塊電路如圖3-7所示。避障模塊采用三只紅外避障傳感器,安裝于小車兩側(cè)及下中央,可以檢測兩側(cè)和正前方是否有障礙,檢測后將信號送入單片機(jī),單片機(jī)對信號進(jìn)行處理并發(fā)出相應(yīng)的信號驅(qū)動小車電機(jī),使小車躲避障礙。其左中右三個傳感器的硬件電路分別接到單片機(jī)的PB0、PB1、PB2 端口。當(dāng)三個傳感器檢測到無障礙時,小車正常前進(jìn)行駛;當(dāng)前側(cè)傳感器檢測到有障礙時,小車右轉(zhuǎn);當(dāng)左側(cè)或左及前側(cè)傳感器檢測到障礙時,小車右轉(zhuǎn);當(dāng)右側(cè)或右側(cè)及前側(cè)傳感器檢測到障礙時,小車左轉(zhuǎn);當(dāng)三個傳感器都檢測到有障礙或左右側(cè)傳感器檢測到有障礙時,小車停止[9]。

            

圖3-7避障模塊電路

3.4 電機(jī)驅(qū)動模塊
3.4.1 L298N電機(jī)驅(qū)動芯片
L298N是由意法半導(dǎo)體公司研發(fā)制造的一款雙全橋大電流(2A*2)電機(jī)驅(qū)動芯片,比較常見的是15腳MulTIwatt封裝的L298N,內(nèi)部同樣包含4通道邏輯驅(qū)動電路。可以方便的驅(qū)動兩個直流電機(jī),其實物圖及直流電機(jī)實物如圖3-8所示。

圖3-8 L298N及電機(jī)實物圖

L298N屬于H橋集成電路,可驅(qū)動大功率直流電機(jī)、步進(jìn)電機(jī)等。L298N的平均輸出電流為2A,最大時甚至可達(dá)到4A,其輸入端可以直接與單片機(jī)相連,從而很方便地受單片機(jī)的控制。
圖3-9為L298N的引腳圖,圖中Current sensing為電流感應(yīng)電阻,可以在Current sensing連接電流表,以此來檢測L298N中流過的電流。OUTPUT為L298N的輸出端,其中,OUTPUT 1和OUTPUT 2為A相的兩個輸出,OUTPUT 3和OUTPUT 4為B相的兩個輸出,可以用來連接電機(jī)。INPUT是L298N的輸入端,INPUT的電平?jīng)Q定了相應(yīng)編號的OUTPUT的電平。ENABLE為L298N的使能端,若ENABLE為高電平,則OTPUT就會與INPUT保持一致,否則,OUTPUT不與任何端口相連。LOGIC SUPPLY VOLTAGE VSS是L298N的邏輯電壓,為L298N中的邏輯器件提供電源。GND為L298N的接地端。SUPPLY VOLTAGE VSS為L298N的驅(qū)動電壓,為電機(jī)提供電源[10]。

圖3-9 L298N引腳

3.4.2 PWM調(diào)速原理
脈沖寬度調(diào)制(PWM)是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制。PWM調(diào)速的原理是調(diào)節(jié)在一個周期內(nèi)驅(qū)動脈沖的占空比,進(jìn)而調(diào)節(jié)電機(jī)的供電時間比例。在一個周期內(nèi),占空比越大,則電機(jī)的供電時間越長,電機(jī)的運(yùn)轉(zhuǎn)速度就越快。因此,電機(jī)的調(diào)速范圍最小為零,最大為持續(xù)供電的電機(jī)轉(zhuǎn)速[11]。
3.4.3 驅(qū)動電路
直流電機(jī)驅(qū)動電路使用H型全橋式驅(qū)動電路。這種驅(qū)動電路可以很方便實現(xiàn)直流電機(jī)的四象限運(yùn)行,分別對應(yīng)正轉(zhuǎn)、正轉(zhuǎn)制動、反轉(zhuǎn)、反轉(zhuǎn)制動。在本設(shè)計中電機(jī)驅(qū)動電路由集成驅(qū)動芯片L298N構(gòu)成,并結(jié)合PWM進(jìn)行調(diào)速。ATmega16單片機(jī)本身帶有四個PWM輸出端口,通過設(shè)定其內(nèi)部參數(shù)來控制PWM的輸出,來改變脈沖寬度調(diào)制的占空比。本設(shè)計選用四個I/O口中的PD4及PD5為PWM信號的輸出端口。它的基本原理圖如圖3-10所示[12]。

圖3-10 驅(qū)動電路

該驅(qū)動電路可以驅(qū)動兩路直流電機(jī),使能端ENA、ENB為高電平時有效,控制方式及直流電機(jī)狀態(tài)圖如表3-1所示。

表3-1 電機(jī)驅(qū)動控制方式及直流電機(jī)狀態(tài)

ENA

IN1

IN2

直流電機(jī)狀態(tài)

0

X

X

停止

1

0

0

制動

1

0

1

正轉(zhuǎn)

1

1

0

反轉(zhuǎn)

1

1

1

制動


若要對直流電機(jī)進(jìn)行PWM調(diào)速,需設(shè)置IN1和IN2,確定電機(jī)的轉(zhuǎn)動方向,然后對使能端輸出PWM脈沖,即可實現(xiàn)調(diào)速。注意,當(dāng)使能信號為0時,電機(jī)處于停止?fàn)顟B(tài);當(dāng)使能信號為1時,00和11的IN1和IN2,制動電機(jī),停止電機(jī)旋轉(zhuǎn)[13]。
對于汽車的轉(zhuǎn)向控制,需要向ENA和ENB輸入不同的PWM信號,以實現(xiàn)直流電動機(jī)的轉(zhuǎn)速差,從而實現(xiàn)汽車轉(zhuǎn)向。本設(shè)計中有微調(diào)轉(zhuǎn)彎和轉(zhuǎn)彎兩種轉(zhuǎn)彎狀態(tài),微調(diào)轉(zhuǎn)彎是其中一個PWM信號不變,另一個的占空比減少一半;轉(zhuǎn)彎是其中一個PWM信號不變,另一個無PWM信號輸出[14]。
1


沈陽工業(yè)大學(xué)本科生畢業(yè)論文
第4章 系統(tǒng)軟件設(shè)計
本課題的系統(tǒng)軟件部分采用模塊化設(shè)計方案。模塊化設(shè)計方案不僅邏輯清晰,而且便于編程,發(fā)現(xiàn)錯誤后,更是便于修改。系統(tǒng)軟件共分為四個模塊,分別為主程序模塊、尋跡模塊、避障模塊以及電機(jī)驅(qū)動模塊。尋跡模塊和避障模塊不斷采集周圍環(huán)境的信息發(fā)送至處理器,再由處理器處理后發(fā)送至電機(jī)驅(qū)動模塊,以便于小車可以隨環(huán)境變化而做出改變。本設(shè)計的源程序見附錄B。
4.1 ICCAVR簡介
該設(shè)計使用的開發(fā)環(huán)境為ICCAVR開發(fā)環(huán)境。 ICCAVR是ATMEL公司專門為AT90系列單片機(jī)開發(fā)的編譯工具。ICCAVR是一個集成的工作環(huán)境,簡稱IDE,它綜合了編輯器和工程管理器等功能,并且可以根據(jù)開發(fā)的單片機(jī)的不同,選擇不同的初始值,以及是否使用定時器等功能,十分強(qiáng)大,是一個被眾多單片機(jī)開發(fā)人員廣泛使用的開發(fā)環(huán)境。

圖4-1 ICCAVR 界面

4.2 主控制模塊主程序設(shè)計
主控制模塊主程序流程圖如圖4-2,它的作用是整合小車的各個模塊,使其正常、協(xié)調(diào)的運(yùn)行。當(dāng)小車開始運(yùn)行后,初始化各個變量,并負(fù)責(zé)接收各個子模塊的信息,綜合處理后再按照預(yù)先的設(shè)定不斷的做出反應(yīng),從而實現(xiàn)本課題的設(shè)計要求[15]。


圖4-2主程序流程圖

4.3 紅外循跡模塊子程序設(shè)計
循跡模塊的功能主要是不斷的采集周圍環(huán)境中的信息,并將其發(fā)送至控制核心單元,以便于小車進(jìn)行下一步操作。流程圖如圖4-3所示。
紅外跟蹤模塊子程序接收外圍紅外檢測電路信號并對接收到的信號進(jìn)行編碼,紅外檢測外圍電路紅外對管位置如圖3-4。當(dāng)紅外對管檢測到白色背景時輸出高電平,檢測到黑色軌跡時輸出低電平。外圍電路紅外對管狀態(tài)進(jìn)行信號編碼后對應(yīng)表格如表4-1,將信號進(jìn)行處理編碼之后,判斷信號類型,當(dāng)信號為:1000,1100,1110,0100時,單片機(jī)送出左轉(zhuǎn)信號;當(dāng)信號為:0001,0011,0111,0010時,單片機(jī)送出右轉(zhuǎn)信號;當(dāng)信號為:0111,1111時,單片機(jī)送出直走信號;當(dāng)信號為:0000時,停止。信號0101,1010,1101,1011,1001為無效信號[16]。

圖4-3 紅外循跡模塊子程序流程圖


表4-1 外圍電路紅外對管狀態(tài)進(jìn)行信號編碼后對應(yīng)表

外圍紅外對管輸出狀態(tài)

信號編碼結(jié)果

外圍紅外對管輸出狀態(tài)

信號編碼結(jié)果

1號低2號低3號低4號低

0000

1號低2號低3號高4號低

0010

1號高2號高3號高4號高

1111

1號低2號高3號高4號低

0110

1號高2號低3號低4號低

1000

1號低2號低3號高4號高

0011

1號高2號高3號低4號低

1100

1號低2號低3號低4號高

0001

1號低2號高3號低4號低

0100

1號低2號高3號高4號高

0111

1號高2號高3號高4號低

1110


4.4 紅外避障模塊子程序設(shè)計
紅外避障模塊子程序流程圖如圖4-4所示。避障模塊采用E18-D80NK傳感器來探測前方的道路上15厘米的距離之內(nèi)有無障礙物,進(jìn)而將探測結(jié)果發(fā)送至核心控制單元,等待控制單元做出下一步的處理[17]。

圖4-4 紅外避障程序流程圖


避障模塊不斷的通過傳感器采集周圍環(huán)境中的信息,當(dāng)前方15厘米內(nèi)沒有障礙物時,小車保持前進(jìn)狀態(tài),若有障礙物則可通過小車前方及左右方的紅外避障傳感器,獲得障礙物的具體情況進(jìn)行信息處理編碼,編碼方式如下表4-2。
將外部信息進(jìn)行編碼后,通過對信號的判斷,控制小車的移動方向:探測結(jié)果111,表明前方15cm內(nèi)無障礙物單片機(jī)送出“前進(jìn)”指令,小車保持前進(jìn)狀態(tài);探測結(jié)果000,表明前方及左右兩邊15cm內(nèi)均有障礙物,單片機(jī)送出“停止”指令;探測結(jié)果101,表明前方15cm內(nèi)有障礙物左右兩邊均無障礙物,單片機(jī)送出“右轉(zhuǎn)”指令(左右均無障礙物默認(rèn)右轉(zhuǎn));探測結(jié)果001,表明前方及左邊15cm內(nèi)有障礙物,單片機(jī)送出“右轉(zhuǎn)”指令;探測結(jié)果100,表明前方及右邊15cm內(nèi)有障礙物,單片機(jī)送出“左轉(zhuǎn)”指令;探測結(jié)果110,表明右邊15cm內(nèi)有障礙物,單片機(jī)送出“左轉(zhuǎn)”指令;探測結(jié)果011,表明左邊15cm內(nèi)有障礙物,單片機(jī)送出“右轉(zhuǎn)”指令;探測結(jié)果010,表明左邊及右邊15cm內(nèi)有障礙物,單片機(jī)送出“停止”指令[18]。

表4-2 紅外避障模塊外圍電路信息處理編碼表

外圍電路障礙物探測結(jié)果

信息編碼結(jié)果

左邊無障礙物,前方無障礙物,右邊無障礙物

111

左邊有障礙物,前方有障礙物,右邊有障礙物

000

左邊無障礙物,前方有障礙物,右邊無障礙物

101

左邊有障礙物,前方有障礙物,右邊無障礙物

001

左邊無障礙物,前方有障礙物,右邊有障礙物

100

左邊無障礙物,前方無障礙物,右邊有障礙物

110

左邊有障礙物,前方無障礙物,右邊無障礙物

011

左邊有障礙物,前方無障礙物,右邊有障礙物

010



4.5 電機(jī)驅(qū)動模塊子程序設(shè)計
電機(jī)驅(qū)動模塊不斷的等待接受單片機(jī)發(fā)出的指令,并可以根據(jù)指令控制電機(jī)做出不同的反應(yīng),進(jìn)而控制小車的運(yùn)動[19]。流程圖如圖4-5所示。
當(dāng)接收指令0x00:無數(shù)據(jù),無PWM波,無方向信號。當(dāng)接收指令0x01:小車前進(jìn),兩個電機(jī)驅(qū)動器給予相同的PWM波,相同的方向信號。當(dāng)接收指令0x02:小車后退,在前進(jìn)的基礎(chǔ)上改變方向信號。當(dāng)接收指令0x03:小車停止,無PWM波,無方向信號。當(dāng)接收指令0x04:結(jié)合循跡模塊的信號向左微轉(zhuǎn)或左轉(zhuǎn)。當(dāng)接收指令0x05:結(jié)合循跡模塊的信號向右微轉(zhuǎn)或右轉(zhuǎn)。

圖4-5電機(jī)控制程序流程圖


第5章 結(jié)論
通過這個學(xué)期的不斷深入學(xué)習(xí),深入了解了AVR單片機(jī)的各個特性,以及ICCAVR的使用方法,設(shè)計并實現(xiàn)了可以自動循跡、避障的智能小車。大大提高了自己的動手能力以及獨(dú)立學(xué)習(xí)的能力。通過本課題的學(xué)習(xí)研究,我深刻地認(rèn)識到,只學(xué)習(xí)課本上的知識是遠(yuǎn)遠(yuǎn)不夠的,必須緊跟時代的發(fā)展趨勢,不斷地學(xué)習(xí)新的知識,努力地提高自己,才能達(dá)到自己預(yù)期的目標(biāo)。
在本課題中,以AVR單片機(jī)為控制核心,以RPR220型光電對管、E18-D80NK傳感器等作為輔助模塊,完成了可以自動循跡、避障的智能小車。小車實現(xiàn)了以下幾個功能:
  • 小車可以自動沿著白色背景上的黑色軌跡行駛,一旦行駛過程中有所偏離,還可以自動回到黑色軌跡上來。
  • 小車在行駛過程中,可以自動檢測前方的道路上有無障礙物。若有障礙物,可以實現(xiàn)自動躲避并繼續(xù)行駛。
通過本次課題的學(xué)習(xí),我不但掌握了很多以前學(xué)的不明白的知識,還學(xué)習(xí)了很多新知識,有了很大的收獲。

致   謝
本論文的設(shè)計是在關(guān)新老師的悉心指導(dǎo)下完成的。從課題的選擇、到具體的設(shè)計,無論在理論上還是在實踐中都給了我許多指導(dǎo)和幫助,使我得以改進(jìn)和提高。她嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,求真務(wù)實的學(xué)術(shù)作風(fēng),深厚的理論水平,豐富的項目經(jīng)驗,都深刻地影響著我,使我終身受益。值此論文完成之際,我謹(jǐn)向關(guān)新老師表示深深的感謝和崇高的敬意!
同時,在撰寫畢業(yè)論文過程中,得到了我的同學(xué)李佳城、吳濟(jì)等同學(xué)各方面的熱誠幫助,使我能夠順利完成畢業(yè)論文,在此致以深深的謝意!

附 錄A 總電路圖

附 錄B 源程序
  1. #include <iom16v.h>
  2. #include <macros.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar count=0;//小車行走步數(shù)尋左
  6. void forward2(void);
  7. void forward1(void);
  8. void init_devices(void)
  9. {
  10. CLI(); //禁止所有中斷
  11. MCUCR  = 0x00;
  12. MCUCSR = 0x80;//禁止JTAG
  13. GICR   = 0x00;
  14. SEI();//開全局中斷
  15. }
  16. //定時T1初始化
  17. void timer1_init(void)
  18. {
  19. TCCR1B = 0x00;//停止定時器
  20. TIMSK |= 0x00;//中斷允許
  21. TCNT1H = 0x00;
  22. TCNT1L = 0x00;//初始值
  23. OCR1AH = 0x00;
  24. OCR1AL = 0xF0;//匹配A值
  25. OCR1BH = 0x00;
  26. OCR1BL = 0xF0;//匹配B值
  27. ICR1H  = 0xFF;
  28. ICR1L  = 0xFF;//輸入捕捉匹配值
  29. TCCR1A = 0xA1;
  30. TCCR1B = 0x01;//啟動定時器
  31. }
  32. //*****************PWM 調(diào)速***************************//
  33. void leftspeed(uchar tempocra)
  34. {
  35. OCR1AH = 0x00;
  36. OCR1AL = tempocra;
  37. }
  38. void rightspeed(uchar tempocrb)
  39. {
  40. OCR1BH = 0x00;
  41. OCR1BL = tempocrb;
  42. }
  43. //*****************延時函數(shù)ms級***************************//
  44. void delayms(uint MS)   
  45. {
  46. uint i,j;
  47. for( i=0;i<MS;i++)
  48. for(j=0;j<1141;j++); //1141是在8MHz晶振下
  49. }

  50. /******************延時函數(shù)us級**************************/
  51. void delayus(uint US)   
  52. {
  53. uint i;
  54. US=US*5/4;      //5/4是在8MHz晶振下
  55. for( i=0;i<US;i++);
  56. }

  57. //****************校偏函數(shù)HEAD1前進(jìn)******************************//
  58. void reviseL1(uchar discrepancy)//=0為直線 =1為左偏 =2右偏 =3嚴(yán)重左偏 =4嚴(yán)重右偏
  59. {
  60. if (discrepancy==0)
  61. {
  62.   PORTB=0X06;
  63.   return;
  64. }
  65.   if (discrepancy==1)
  66. {
  67.   PORTB=0X02;
  68.    delayms(20);
  69.   return;
  70. }
  71.   if (discrepancy==2)
  72. {
  73.   PORTB=0X04;
  74.    delayms(20);
  75.   return;
  76. }
  77.    if (discrepancy==3)
  78. {
  79.   PORTB=0X02;
  80.    delayms(40);
  81.   return;
  82. }
  83.    if (discrepancy==4)
  84. {
  85.   PORTB=0X04;
  86.    delayms(40);
  87.   return;
  88. }
  89. }
  90. //****************校偏函數(shù)HEAD2前進(jìn)******************************//
  91. void reviseL2(uchar discrepancy)//=0為直線 =1為左偏 =2右偏 =3嚴(yán)重左偏 =4嚴(yán)重右偏
  92. {
  93. if (discrepancy==0)
  94. {
  95.   PORTB=0X09;
  96.   return;
  97. }
  98.   if (discrepancy==1)
  99. {
  100.   PORTB=0X08;
  101.   delayms(20);
  102.   return;
  103. }
  104.   if (discrepancy==2)
  105. {
  106.   PORTB=0X01;
  107.   delayms(20);
  108.   return;
  109. }
  110.    if (discrepancy==3)
  111. {
  112.   PORTB=0X08;
  113.   delayms(40);
  114.   return;
  115. }
  116.    if (discrepancy==4)
  117. {
  118.   PORTB=0X01;
  119.   delayms(40);
  120.   return;
  121. }
  122. }
  123. //***********************HEAD1向左拐*********************//
  124. void head1turnleft()
  125. {
  126. uchar time;
  127. leftspeed(200);
  128. rightspeed(200);
  129. PORTB=0x05;
  130. delayms(500);
  131. while(1)
  132. {
  133.   time=0x08&PINA;
  134.   if(time==0x08)
  135.   break;
  136.   else
  137.        continue;
  138.   }
  139. count=count+1;
  140. leftspeed(255);
  141. rightspeed(255);
  142. PORTB=0X06;
  143. return;
  144. }
  145. //***********************HEAD1向右拐*********************//
  146. void head1turnright()
  147. {
  148. uchar time1;
  149. leftspeed(200);
  150. rightspeed(200);
  151. PORTB=0x0a;
  152. delayms(500);
  153. while(1)

  154. {
  155.   time1=0x08&PINA;
  156.   if(time1==0x08)
  157.     break;
  158.   else
  159.        continue;
  160. }
  161. count=count+1;
  162. leftspeed(255);
  163. rightspeed(255);
  164. PORTB=0X06;
  165. return;
  166. }

  167. //***********************HEAD2向左拐*********************//
  168. void head2turnleft()
  169. {
  170. uchar time;
  171. leftspeed(200);
  172. rightspeed(200);
  173. PORTB=0x05;
  174. delayms(500);
  175. while(1)
  176. {
  177.   time=0x08&PINC;
  178.   if(time==0x08)
  179.   {
  180.   break;
  181.   }
  182.   else
  183.        continue;
  184. }
  185. count=count+1;
  186. leftspeed(255);
  187. rightspeed(255);
  188. return;
  189. }
  190. //***********************HEAD2向右拐*********************//
  191. void head2turnright()
  192. {
  193. uchar time;
  194. leftspeed(200);
  195. rightspeed(200);
  196. PORTB=0x0A;
  197. delayms(500);
  198. while(1)
  199. {
  200.   time=0x08&PINC;
  201.   if(time==0x08)
  202.     break;
  203.   else      continue;
  204.   }

  205. count=count+1;
  206. leftspeed(255);
  207. rightspeed(255);
  208. return;
  209. }

  210. //****************循跡函數(shù)HEAD1尋左**************************//
  211. void inlinel1()
  212. {
  213.   uchar state1;
  214.   state1=0x7e&PINA;
  215.   switch(state1)
  216.    {
  217.     case 0x08:reviseL1(0);break;//正在走直線
  218.     case 0x04:reviseL1(1);break;//略微左偏
  219.     case 0x10:reviseL1(2);break;//略微右偏
  220. case 0x02:reviseL1(3);break;//嚴(yán)重左偏
  221. case 0x20:reviseL1(4);break;//嚴(yán)重右偏
  222.    }
  223.    state1=0x40&PINA;
  224.    if (state1==0x40)
  225.    {
  226.      delayms(20);
  227.   if(state1==0x40);
  228. head1turnleft();
  229.    }
  230. }

  231. //****************循跡函數(shù)HEAD1尋右**************************//

  232. void inliner1()
  233. {
  234.   uchar state1;
  235.   switch(state1)
  236.    {
  237.     case 0x08:reviseL1(0);break;//正在走直線
  238.     case 0x04:reviseL1(1);break;//略微左偏
  239.     case 0x10:reviseL1(2);break;//略微右偏
  240.     case 0x02:reviseL1(3);break;//嚴(yán)重左偏
  241. case 0x20:reviseL1(4);break;//嚴(yán)重右偏
  242.    }
  243.    state1=0x01&PINA;
  244.   if (state1==0x01)
  245.    {
  246.     delayms(20);
  247. if(state1==0x01)
  248. head1turnright();
  249.    }
  250. }

  251. //****************循跡函數(shù)HEAD2尋左**************************//

  252. void inlinel2()
  253. {
  254.   uchar state1;
  255.   state1=0X7e&PINC;
  256.   switch(state1)
  257.    {
  258.     case 0x08:reviseL2(0);break;//正在走直
  259.     case 0x10:reviseL2(1);break;//略微左偏
  260.     case 0x04:reviseL2(2);break;//略微右偏
  261. case 0x20:reviseL2(3);break;//嚴(yán)重左偏
  262. case 0x02:reviseL2(4);break;//嚴(yán)重右偏
  263.    }
  264.    state1=0x01&PINC;
  265.    if (state1==0x01)
  266.    {
  267.     delayms(20);
  268. if(state1==0x01)
  269. head2turnleft();
  270.   }
  271. }

  272. //****************循跡函數(shù)HEAD2尋右**************************//

  273. void inliner2()
  274. {
  275.   uchar state1;
  276.   state1=0X7e&PINC;
  277.   switch(state1)
  278.    {
  279.     case 0x08:reviseL2(0);break;//正在走直線
  280.     case 0x10:reviseL2(1);break;//略微左偏
  281.     case 0x04:reviseL2(2);break;//略微右偏
  282. case 0x20:reviseL2(3);break;//嚴(yán)重左偏
  283. case 0x02:reviseL2(4);break;//嚴(yán)重右偏
  284.    }
  285.    state1=0x40&PINC;
  286.    if (state1==0x40)
  287.    {
  288.     delayms(20);
  289. if(state1==0x40)
  290. head1turnright();
  291.    }
  292. }

  293. //*********************HEAD2前進(jìn)函數(shù)**********************//

  294. void forward2()
  295. {
  296. while(1)
  297. {
  298.   PORTB=0x09;
  299.      if((PIND&0X08)==0)
  300.     {
  301.     delayms(50);
  302. if((PIND&0X08)==0)
  303.     forward1();
  304.    }
  305.   switch (count)
  306.   {
  307.     case 12:inliner2();break;
  308.     case 23:inliner2();break;
  309.     case 24:inliner2();break;
  310.     case 25:inliner2();break;
  311.     case 26:inliner2();break;
  312.     case 33:inliner2();break;
  313. default:inlinel2();
  314.   }
  315. }
  316. }

  317. //*********************HEAD1前進(jìn)函數(shù)**********************//

  318. void forward1()
  319. {
  320.   while(1)
  321. {
  322.    PORTB=0x06;
  323.    if((PIND&0X04)==0)
  324.    {
  325.     delayms(50);
  326. if((PIND&0X04)==0)
  327. forward2();
  328.    }
  329.    switch (count)
  330.   {
  331.    case 5:inliner1();break;
  332.    case 10:inliner1();break;
  333.    case 11:inliner1();break;
  334.    case 12:inliner1();break;
  335.    case 22:inliner1();break;
  336.    case 27:inliner1();break;
  337.    case 31:inliner1();break;
  338.    case 32:inliner1();break;
  339.    default:inlinel1();
  340.   }
  341. }
  342. }  

  343. //**********************主函數(shù)**************************//

  344. void main()
  345. {
  346. delayms(50);
  347. DDRA  = 0x00;
  348. DDRB  = 0x0F;
  349. DDRC  = 0x00;
  350. DDRD  = 0x30;
  351. PORTA = 0x00;
  352. PORTB = 0x06;
  353. PORTC = 0x00;
  354. PORTD = 0x3c;
  355. init_devices();
  356. timer1_init();
  357. while(1)
  358. {
  359.   forward1();
  360. }
  361. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
基于 AVR 單片機(jī)的多功能智能小車系統(tǒng)設(shè)計.docx (1.48 MB, 下載次數(shù): 33)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表