畢業(yè)設(shè)計(jì)-基于stm32的智能小車設(shè)計(jì)
《畢業(yè)設(shè)計(jì)-基于stm32的智能小車設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《畢業(yè)設(shè)計(jì)-基于stm32的智能小車設(shè)計(jì)(47頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
基于stm32的智能小車設(shè)計(jì) 摘要 本次試驗(yàn)主要分析了基于STM32F103微處理器的智能小車控制系統(tǒng)的系統(tǒng)設(shè)計(jì)過程。此智能系統(tǒng)的組成主要包括STM32F103控制器、電機(jī)驅(qū)動(dòng)電路、紅外探測(cè)電路、超聲波避障電路。本次試驗(yàn)采用STM32F103微處理器為核心芯片,利用PWM技術(shù)對(duì)速度以及舵機(jī)轉(zhuǎn)向進(jìn)行控制,循跡模塊進(jìn)行黑白檢測(cè),避障模塊進(jìn)行障礙物檢測(cè)并避障功能,其他外圍擴(kuò)展電路實(shí)現(xiàn)系統(tǒng)整體功能。小車在運(yùn)動(dòng)時(shí),避障程序優(yōu)先于循跡程序,用超聲波避障電路進(jìn)行測(cè)距并避障,在超聲波模塊下我們使用舵機(jī)來控制超聲波的發(fā)射方向,用紅外探測(cè)電路實(shí)現(xiàn)小車循跡功能。在硬件設(shè)計(jì)的基礎(chǔ)上提出了實(shí)現(xiàn)電機(jī)控制功能、智能小車簡(jiǎn)單循跡和避障功能的軟件設(shè)計(jì)方案,并在STM32集成開發(fā)環(huán)境Keil下編寫了相應(yīng)的控制程序,并使用mcuisp軟件進(jìn)行程序下載。 關(guān)鍵詞:stm32;紅外探測(cè);超聲波避障;PWM;電機(jī)控制 Abstract This experiment mainly analyzes the control system of smart car based on microprocessor STM32F103 system design process. The composition of the intelligent system mainly including STM32F103 controller, motor drive circuit, infrared detection circuit, circuit of ultrasonic obstacle avoidance. This experiment adopts STM32F103 microprocessor as the core chip, using PWM technique to control speed and steering gear steering, tracking module is used to detect the black and white, obstacle avoidance module for obstacle detection and obstacle avoidance function, other peripheral extended circuit to realize the whole system function. When the car is moving, obstacle avoidance program prior to tracking, using ultrasonic ranging and obstacle avoidance obstacle avoidance circuit, we use steering gear under ultrasonic module to control the emission direction of ultrasonic, infrared detection circuit is used to implement the car tracking function. On the basis of the hardware design is proposed for motor control function, simple intelligent car tracking and obstacle avoidance function of software design, and in the STM32 integrated development environment under the Keil. Write the corresponding control program, and use McUisp program download software. Keywords:STM32;Infrared detection;Ultrasonic obstacle avoidance;PWM;Motor control 目錄 1.緒論 - 4 - 1.1研究概況 - 4 - 1.2研究思路 - 4 - 2.軟硬件設(shè)計(jì) - 5 - 2.1中央處理模塊 - 5 - 2.1.1 stm32f103內(nèi)部結(jié)構(gòu) - 6 - 2.1.2 stm32最小系統(tǒng)電路設(shè)計(jì) - 7 - 2.1.3 stm32軟件設(shè)計(jì)的基本思路 - 9 - 2.1.4 stm32中斷介紹 - 9 - 2.1.5 stm32定時(shí)/計(jì)數(shù)器介紹 - 11 - 2.1.6 主程序設(shè)計(jì)流程圖 - 12 - 2.2 電機(jī)驅(qū)動(dòng)模塊 - 13 - 2.2.1 驅(qū)動(dòng)模塊結(jié)構(gòu)及其原理 - 13 - 2.2.2 驅(qū)動(dòng)模塊電路設(shè)計(jì) - 13 - 2.2.3驅(qū)動(dòng)軟件程序設(shè)計(jì) - 14 - 2.3 避障模塊設(shè)計(jì) - 18 - 2.3.1 避障模塊器件結(jié)構(gòu)及其原理 - 19 - 2.3.2 HC-SR04模塊硬件電路設(shè)計(jì) - 21 - 2.3.3 HC-SR04模塊程序設(shè)計(jì) - 21 - 2.4循跡模塊設(shè)計(jì) - 28 - 2.4.1 循跡模塊結(jié)構(gòu)及其原理 - 28 - 2.4.2 循跡模塊電路設(shè)計(jì) - 30 - 2.4.3 紅外循跡模塊程序設(shè)計(jì) - 30 - 3.軟件調(diào)試 - 33 - 3.1 程序仿真 - 33 - 3.2 程序下載 - 34 - 4.系統(tǒng)測(cè)試 - 35 - 5.總結(jié) - 37 - 致謝 - 39 - 參考文獻(xiàn) - 40 - 附錄 - 41 - 1.緒論 智能小車通過各種感應(yīng)器獲得外部環(huán)境信息和內(nèi)部運(yùn)動(dòng)狀態(tài),實(shí)現(xiàn)在復(fù)雜環(huán)境背景下的自主運(yùn)動(dòng),從而完成具有特定功能的機(jī)器人系統(tǒng)。而隨著智能化電器時(shí)代的到來,它們?cè)跒槿藗兲峁┑氖孢m的生活環(huán)境的同時(shí),也提高了制造智能化電器對(duì)于人才要求的門檻。智能小車是集成了多種高新技術(shù),它不僅融合了電子、傳感器、計(jì)算機(jī)硬件、軟件等許多學(xué)科的知識(shí),而且還涉及到當(dāng)今許多前沿領(lǐng)域的技術(shù),它是一個(gè)國家高科技技術(shù)水平的重要體現(xiàn)。通過建立起簡(jiǎn)易智能小車的設(shè)計(jì),引導(dǎo)學(xué)生從理論走向?qū)嵺`,培養(yǎng)同學(xué)們的動(dòng)手能力,使同學(xué)們?cè)诹私庵悄芑娖鞯墓ぷ髟淼幕A(chǔ)上,還使同學(xué)們獲得完成整體項(xiàng)目的能力,并掌握了Stm32開發(fā)板的編程原理,為同學(xué)們進(jìn)入ARM領(lǐng)域提供了基礎(chǔ)。另外,本次課程設(shè)計(jì),使同學(xué)們了解自己的不足之處,從而使同學(xué)們有目標(biāo)的提升自己的能力。 1.1研究概況 國外研究概況:上世紀(jì)50年代初,國外就有智能車輛的研究,從90年代開始,智能車輛的研究就進(jìn)入了系統(tǒng)化、大規(guī)模的研究階段。尤其突出的是美國卡內(nèi)基-梅隴大學(xué)機(jī)器人研究所已經(jīng)完成了Navlab系列的自主車輛的研究,這一研究成果代表了國外智能車輛的主要研究方向。國內(nèi)研究概況:我國對(duì)于智能車輛的研究較晚,始于上世紀(jì)80年代,而且現(xiàn)在大部分還是使用入門級(jí)別的51單片機(jī)進(jìn)行設(shè)計(jì)與研究的,為了彌補(bǔ)與國外研究的差距,開設(shè)了全國大學(xué)生電子設(shè)計(jì)競(jìng)賽。 1.2研究思路 系統(tǒng)將采集的傳感器信號(hào)送入stm32微控制器中,stm32微控制器根據(jù)采集的信號(hào)做出不同的判斷,從而控制電機(jī)運(yùn)動(dòng)方向和運(yùn)動(dòng)速度。系統(tǒng)以stm32微控制器為核心,通過傳感器采集不同的信號(hào)做出判斷,繼而改變電機(jī)的運(yùn)動(dòng)方向和運(yùn)動(dòng)速度。實(shí)驗(yàn)系統(tǒng)結(jié)構(gòu)如圖1.1所示: 圖1.1 實(shí)驗(yàn)系統(tǒng)結(jié)構(gòu)圖 2.軟硬件設(shè)計(jì) 智能小車控制系統(tǒng)具備了障礙物檢測(cè)、自主避障、自主循跡等功能。相應(yīng)的控制系統(tǒng)主要由以下四個(gè)模塊組成:避障模塊、循跡模塊、電機(jī)驅(qū)動(dòng)模塊、中央處理模塊四個(gè)模塊組成,系統(tǒng)總體框架如圖2.1所示: 這個(gè)圖調(diào)整下,和下面的編號(hào)看起來位置不協(xié)調(diào) 圖2.1 系統(tǒng)框架圖 我們本節(jié)主要任務(wù)是了解各個(gè)模塊的功能,掌握各個(gè)模塊所使用的器件的使用方法,并能夠編寫相應(yīng)的程序代碼。掌握各個(gè)模塊的功能。 2.1中央處理模塊 在人類身體結(jié)構(gòu)中,大腦可以根據(jù)各個(gè)器官所傳輸?shù)男畔⒆龀鱿鄳?yīng)的行為動(dòng)作用以保證人體所必須的生理原料,而stm32處理器之于智能小車就相當(dāng)于大腦之于人類,它可以從各個(gè)模塊之間獲得數(shù)據(jù),并對(duì)所傳輸?shù)臄?shù)據(jù)進(jìn)行實(shí)時(shí)處理,來驅(qū)使電機(jī)模塊做出相應(yīng)的行為動(dòng)作。 由ARM公司設(shè)計(jì)的基于ARMv7架構(gòu)的Cortex系列的標(biāo)準(zhǔn)體系結(jié)構(gòu)在2006年推出,此結(jié)構(gòu)是用來滿足日漸復(fù)雜的不同性能要求的軟件設(shè)計(jì),根據(jù)所面向的領(lǐng)域,Cortex系列可以分為A、R、M三個(gè)分工明確的系列[1]。Stm32處理器的出現(xiàn)為微控制系統(tǒng)、工業(yè)控制系統(tǒng)、汽車車身系統(tǒng)和無線網(wǎng)絡(luò)等對(duì)功耗和成本敏感的嵌入式應(yīng)用領(lǐng)域?qū)崿F(xiàn)高系統(tǒng)性能系統(tǒng)提供了基礎(chǔ),使編程的復(fù)雜性,集高性能、低功耗、低成本大大簡(jiǎn)化,并使它們?nèi)跒橛谝惑w[2]。意法半導(dǎo)體ST公司作為一個(gè)半導(dǎo)體制造廠商,是ARM公司Cortex-M3內(nèi)核開發(fā)項(xiàng)目一個(gè)主要合作方。2007年6月11日由ST公司率先推出的基于Cortex-M3內(nèi)核的STM32系列微控處理器研發(fā)而出。此中,A系列是面向復(fù)雜的尖端應(yīng)用程序,用于運(yùn)行開放式的復(fù)雜操作系統(tǒng);R是Real的首字母縮寫,是面向?qū)崟r(shí)系統(tǒng)開發(fā)的;M是Mirco的首字母縮寫,專門面向低成本的微控制領(lǐng)域開發(fā)研究。因此,Cortex-M3處理器是由ARM公司設(shè)計(jì)的首款基于ARMv7-M體系結(jié)構(gòu)的32位標(biāo)準(zhǔn)處理器,它不僅具有低功耗、少門數(shù)等優(yōu)點(diǎn),而且還具有短中斷延遲、低調(diào)試成本等眾多優(yōu)點(diǎn),使它在眾多的處理器中脫穎而出。目前為止,STM32系列處理器暫分為2個(gè)系列。其中,STM32F101系列是標(biāo)準(zhǔn)型系列,工作頻率設(shè)定在36MHZ;STM32F103系列是增強(qiáng)型系列,工作頻率設(shè)定在72MHZ,其帶有更多片內(nèi)RAM和更豐富的外設(shè)資源。這兩個(gè)系列的產(chǎn)品在軟件和引腳封裝方面具有兼容性,并且擁有相同的片內(nèi)Flash資源,使軟件的開發(fā)和升級(jí)更加方便。本次試驗(yàn),我們使用的是stm32f103處理器。 2.1.1 stm32f103內(nèi)部結(jié)構(gòu) STM32F103系列微處理器是首款基于ARMv7-M體系結(jié)構(gòu)的32位標(biāo)準(zhǔn)RISC (精簡(jiǎn)指令集)處理器,具有執(zhí)行代碼效率高,外設(shè)資源豐富等眾多優(yōu)點(diǎn)。該系列微處理器工作頻率設(shè)定在72MHz,高達(dá)128K 字節(jié)的內(nèi)置Flash存儲(chǔ)器存儲(chǔ)器 存儲(chǔ)器是用來存儲(chǔ)程序和數(shù)據(jù)的部件,有了存儲(chǔ)器,計(jì)算機(jī)才有記憶功能,才能保證正常工作。它根據(jù)控制器指定的位置存進(jìn)和取出信息。 [全文]和20K 字節(jié)的SRAM,方便程序編寫,而且具有豐富的通用I/O 端口。其內(nèi)部結(jié)構(gòu)圖如圖2.2所示: 圖2.2 內(nèi)部結(jié)構(gòu)圖 Stm32處理器主系統(tǒng)主要由4個(gè)被動(dòng)單元和4個(gè)驅(qū)動(dòng)單元構(gòu)成。4個(gè)驅(qū)動(dòng)單元是:通用DMA1,通用DMA2,內(nèi)核DCode總線和系統(tǒng)總線。4個(gè)被動(dòng)單元由APB橋,APB設(shè)備,內(nèi)部Flash閃存,內(nèi)部SRAM、FSMC。我們實(shí)驗(yàn)所采用的芯片具有64KBSRAM、512KBFLASH、2個(gè)基本定時(shí)器,4個(gè)通用定時(shí)器,2個(gè)高級(jí)定時(shí)器,3個(gè)SPI,2個(gè)IIC,5個(gè)串口,1個(gè)USB,1個(gè)CAN,3個(gè)12位的ADC,1個(gè)12位DAC、1個(gè)SDIO接口,1個(gè)FSMC接口以及112個(gè)通用I/O口。 2.1.2 stm32最小系統(tǒng)電路設(shè)計(jì) Stm32的最小系統(tǒng)電路主要由系統(tǒng)時(shí)鐘電路、實(shí)時(shí)時(shí)鐘電路、JTAG調(diào)試接口電路,復(fù)位電路和啟動(dòng)模式選擇電路組成。最小系統(tǒng)電路原理圖如圖2-1-3所示: 圖2.3 最小系統(tǒng)電路原理圖 主要電路原理圖的設(shè)計(jì)及功能如下所示: 1.系統(tǒng)時(shí)鐘電路 系統(tǒng)時(shí)鐘電路主要作用是提供節(jié)拍,就相當(dāng)于人類的心臟跳動(dòng),隨著心臟的跳動(dòng),血液就會(huì)到達(dá)全身部位,所以系統(tǒng)時(shí)鐘的重要性就不言而喻啦。系統(tǒng)時(shí)鐘的電路設(shè)計(jì)如圖2.4所示: 圖2.4 系統(tǒng)時(shí)鐘電路圖 在時(shí)鐘電路中,我們選用8M的晶振。 2.復(fù)位電路 復(fù)位電路的設(shè)計(jì)如圖2.5所示: 圖2.5 復(fù)位電路圖 本次試驗(yàn)所采用的開發(fā)板為低電平復(fù)位。如圖所示,當(dāng)按鍵懸空時(shí)RST輸入為高電平,當(dāng)按鍵按下時(shí),RST腳輸入為低電平,從而電路復(fù)位。 3.JTAG電路 JTAG電路原理圖如圖2.6所示: 圖2.6 JAG電路原理圖 JTAG的主要功能是使目標(biāo)文件燒到核處理器中。 4.啟動(dòng)模式電路 啟動(dòng)模式電路原理圖如圖2.7所示: 圖2.7 啟動(dòng)模式電路原理圖 通過設(shè)置BOOT[1:0]引腳可以選擇三種不同啟動(dòng)模式,啟動(dòng)模式如表2-1所示: 表2-1 啟動(dòng)模式表 啟動(dòng)模式選擇引腳 啟動(dòng)模式 說明 BOOT1 BOOT0 X 0 主閃存存儲(chǔ)器 主閃存存儲(chǔ)器被選為啟動(dòng)區(qū)域 0 1 系統(tǒng)存儲(chǔ)器 系統(tǒng)存儲(chǔ)器被選為啟動(dòng)區(qū)域 1 1 內(nèi)置SRAM 內(nèi)置SRAM被選為啟動(dòng)區(qū)域 2.1.3 stm32軟件設(shè)計(jì)的基本思路 在對(duì)其他模塊設(shè)計(jì)之前,我們必須了解stm32的編程規(guī)則。任何處理器,包括stm32處理器,想要處理器完成某項(xiàng)相應(yīng)的動(dòng)作,就必須對(duì)處理器的寄存器進(jìn)行操作。比如,我們?cè)趩纹瑱C(jī)C51中,同樣,我們?cè)趕tmM32的開發(fā)中過程中,我們同樣可以對(duì)寄存器直接操作: GPIOx->BRR=0x0011。 (x可以是A,B,C,D,E…比如GPIOA就是端口A) 但是,對(duì)于stm32這種級(jí)別的處理器,幾百個(gè)寄存器記起來談何容易。所以,ST(意法半導(dǎo)體)提出了固件庫的概念,利用固件庫進(jìn)行編程。固件庫的本質(zhì)就是函數(shù)的集合,固件庫將那些寄存器的底層操作都封裝起來,提供一整套API供開發(fā)者使用。比如,上面通過控制BRR寄存器來控制電平的變化,官方庫封裝了一個(gè)函數(shù): Void GPIO_ResetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin) {GPIOx->BRR = GPIO_Pin;} (x可以是A,B,C,D,E…比如GPIO_A就是端口A) 通過使用GPIO_ResetBits()函數(shù)就可以直接對(duì)寄存器進(jìn)行操作啦。 2.1.4 stm32中斷介紹 本方案中,我們要使用stm32的中斷,在程序設(shè)計(jì)中,我們要開啟各個(gè)管道的中斷,打開各個(gè)中斷通道,配置中斷方式,我們先來講述下stm32單片機(jī)的中斷機(jī)制。結(jié)構(gòu)圖如下所示: 圖2.32 stm32外部中斷/事件控制器結(jié)構(gòu)圖 圖中的實(shí)線箭頭,為外部中斷信號(hào)的傳輸路徑。 首先外部信號(hào)從編號(hào)為1的輸入線進(jìn)入。 其次這個(gè)外部信號(hào)通過編號(hào)2的邊沿檢測(cè)電路,這個(gè)邊沿檢測(cè)電路受到“上升沿選擇寄存器”、“下降沿選擇寄存器”的控制,我們可以控制這兩個(gè)寄存器來選擇中斷的觸發(fā)方式。我們可以在程序中進(jìn)行設(shè)置,比如所有段落設(shè)置為首行縮進(jìn)2個(gè)字符 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;設(shè)置為上升沿觸發(fā)中斷 然后該外部信號(hào)進(jìn)入編號(hào)為3或門,或門另一端是軟件中斷寄存器,如果,軟件中斷/事件寄存器的對(duì)應(yīng)位置1,編號(hào)3的輸出總是為有效信號(hào)1。之后進(jìn)入“中斷掛起請(qǐng)求寄存器”,該寄存器記錄了外部信號(hào)的電平變化。 最后經(jīng)過編號(hào)為4的與門進(jìn)入NVIC中斷控制器,如果 “中斷屏蔽寄存器”的對(duì)應(yīng)位置0,外部的中斷請(qǐng)求信號(hào)不能傳輸?shù)絅VIC中斷控制器,從而實(shí)現(xiàn)中斷的屏蔽。由于我們采用的是外部信號(hào)觸發(fā)中斷,所以我們只需了解外部中斷的請(qǐng)求機(jī)制,對(duì)于事件的中斷請(qǐng)求機(jī)制,我們?cè)谶@里不做介紹。 我們以PE1為例,介紹下外部中斷的一般步驟。步驟如下: 開啟I/O的復(fù)用時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); 初始化I/O為輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOE, &GPIO_InitStructure); 初始化線上中斷,設(shè)置觸發(fā)條件 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 配置中斷分組NVIC,并使能中斷 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x06; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 編寫中斷服務(wù)函數(shù) void EXTI1_IRQHandler(void){}主要代碼詳見附錄2. 2.1.5 stm32定時(shí)/計(jì)數(shù)器介紹 Stm32系列的單片機(jī)一般包含8個(gè)計(jì)數(shù)/定時(shí)器,TIM1、TIM8分別為高級(jí)控制定時(shí)器,TIM2~TIM5為通用定時(shí)器,TIM6以及TIM7為基本定時(shí)器。對(duì)于定時(shí)器的詳細(xì)內(nèi)容,我們不在這里一一介紹。 然后我們介紹一下本實(shí)驗(yàn)采用了那些定時(shí)器,以及這些定時(shí)器所要完成的功能有哪些。本實(shí)驗(yàn)所采用的定時(shí)器以及功能如下表所示: 表2-2定時(shí)器介紹表 定時(shí)器名稱 定時(shí)器配置模式 主要功能 TIM2 定時(shí)器中斷模式 通過定時(shí)器中斷,控制超聲波的掃描周期 TIM3 PWM復(fù)用輸出模式 控制小車速度及舵機(jī)轉(zhuǎn)向 TIM5 輸入捕獲模式 采集超聲波發(fā)射到接受的高電平持續(xù)時(shí)間t 2.1.6 主程序設(shè)計(jì)流程圖 在本節(jié)實(shí)驗(yàn)中,循跡模塊以及避障模塊都是采用中斷方式進(jìn)行工作的,因此其主程序流程圖如下圖所示: 圖1.2 主程序流程圖 根據(jù)程序設(shè)計(jì)圖,主程序設(shè)計(jì)如下: int main(void) { u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài) u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值 delay_init(); //延時(shí)函數(shù)初始化 NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí) LED_Init(); GPIO_Configuration(); //端口初始化 EXTIX_Init(); //掃描軌跡 TIM2_Int_Init(4999,7199); //控制超聲波掃描周期 TIM3_PWM_Init(1999,719); //控制舵機(jī)方向 TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計(jì)數(shù) while(1) { farward_Low();delay_ms(10);} } 2.2 電機(jī)驅(qū)動(dòng)模塊 Stm32對(duì)小車的控制,就是對(duì)電機(jī)的控制,通過控制電機(jī)的轉(zhuǎn)向,小車的運(yùn)動(dòng)狀態(tài)就會(huì)發(fā)生改變。電機(jī)驅(qū)動(dòng)模塊的主要器件為L(zhǎng)M293N,我們下面就詳細(xì)講解下電機(jī)驅(qū)動(dòng)模塊。 2.2.1 驅(qū)動(dòng)模塊結(jié)構(gòu)及其原理 電機(jī)驅(qū)動(dòng)模塊的實(shí)物圖如圖2.8所示: 圖2.8 驅(qū)動(dòng)電路實(shí)物圖 電機(jī)驅(qū)動(dòng)模塊的主要器件是芯片LM293D,內(nèi)部原理圖如圖2.9所示: K4 K2 K1 K3 S4 圖2.9 電機(jī)驅(qū)動(dòng)內(nèi)部原理圖 全橋式驅(qū)動(dòng)電路的4只開關(guān)管都工作在斬波狀態(tài),如圖1.2所示,K1、K2為一組,K3、K4 為另一組,兩組的狀態(tài)互補(bǔ),一組導(dǎo)通則另一組必定關(guān)斷。當(dāng)K1、K2導(dǎo)通時(shí),K3、K4關(guān)斷,電機(jī)兩端加正向電壓,電機(jī)實(shí)現(xiàn)正轉(zhuǎn)或反轉(zhuǎn)制動(dòng);當(dāng)K3、K4導(dǎo)通時(shí),K1、K2關(guān)斷,電機(jī)兩端為反向電壓,電機(jī)實(shí)現(xiàn)反轉(zhuǎn)或正轉(zhuǎn)制動(dòng)。 2.2.2 驅(qū)動(dòng)模塊電路設(shè)計(jì) 電機(jī)驅(qū)動(dòng)模塊的電路原理如圖2.10所示: 圖2.10 驅(qū)動(dòng)模塊電路原理圖 表2-2是各個(gè)端口狀態(tài)與運(yùn)動(dòng)方向的關(guān)系,其關(guān)系如下表所示: 表2-2 端口與運(yùn)動(dòng)方向關(guān)系表 電機(jī)M1 IN1 IN2 電機(jī)M2 IN3 IN4 停止 0 0 停止 0 0 正轉(zhuǎn) 1 0 正轉(zhuǎn) 1 0 反轉(zhuǎn) 0 1 反轉(zhuǎn) 0 1 - 1 1 - 1 1 2.2.3驅(qū)動(dòng)軟件程序設(shè)計(jì) 車輪電機(jī)的動(dòng)作由GPIO口的輸出實(shí)現(xiàn),本節(jié)主要配置運(yùn)動(dòng)方向和運(yùn)動(dòng)速度,對(duì)于運(yùn)動(dòng)速度的控制,我們必須使用PWM,通過改變PWM的占空比來調(diào)節(jié)速度的大小,其主要代碼設(shè)計(jì)如下所示: void TIM3_PWM_Init(u16 arr,u16 psc){ ….} 要想使stm32的通用定時(shí)器TIMx產(chǎn)生PWM輸出,需要用到的寄存器有:預(yù)分頻寄存器(TIMx_PSC)、自動(dòng)重裝載寄存器(TIMx_ARR)、捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。我們先介紹這幾個(gè)寄存器,然后介紹如何使用庫函數(shù)產(chǎn)生PWM輸出。下面我們就簡(jiǎn)單介紹下這些寄存器: 首先是預(yù)分頻寄存器(TIMx_PSC),該寄存器可以用設(shè)置對(duì)時(shí)鐘進(jìn)行分頻,然后在提供給計(jì)數(shù)器作為計(jì)數(shù)器的時(shí)鐘。該寄存器的各位功能如圖所示: 圖2.11 TIMx_PSC寄存器各位描述 接下來介紹自動(dòng)重裝載寄存器(TIMx_ARR),該寄存器的各位描述如下圖所示: 圖2.12 TIMx_ARR寄存器各位描述 通過設(shè)置這兩個(gè)寄存器,我們就可以算出PWM的輸出周期,計(jì)算公式為: Tout=((arr+1)*(psc+1))/Tclk。其中Tclk為系統(tǒng)時(shí)鐘周期。 其次我們介紹捕獲/比較模式寄存器(TIMx_CCMR1/2),總共有兩個(gè),TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1控制通道CH1和CH2,TIMx_CCMR2控制CH3和CH4。因?yàn)檫@2個(gè)寄存器差不多,我們僅以通道CH1為例,介紹其中的TIMx_CCMR1為例,該寄存器的各位描述如下圖所示: 圖2.13 TIMx_CCMR1/2寄存器各位描述 這里我們只介紹該寄存器的OCxM位,我們就以TIMx_CCMR1中的OC1M(控制通道CH1)為例,該位功能如下圖所示: 圖2.14 OC1M功能描述 我們使用的是PWM輸出模式,所以O(shè)C1M必須設(shè)置為110/111。OC2M(控制通道CH2)各位描述與OC1M相同,我們這要不在敘述。 然后我們介紹捕獲/比較使能寄存器(TIMx_CCER),該寄存器控制著各個(gè)輸入/輸出通道的開關(guān),對(duì)于該寄存器,各位描述如下圖所示: 圖2.15 TIMx_CCER寄存器描述 該寄存器比較簡(jiǎn)單,因?yàn)槲覀冎唤榻B通道1,所以我們只講CC1E位。如果我們想使能輸入/捕獲1,我們只需使用CC1E位。要想使PWM從I/O口輸出,此位必須設(shè)置為1。 最后介紹捕獲/比較寄存器(TIMx_CCR1~4),總共有4個(gè),分別對(duì)應(yīng)CH1~4,因?yàn)檫@4個(gè)寄存器相似,我們僅以TIMx_CCR1為例,該寄存器的給位介紹如下圖所示: 圖2.16 TIMx_CCR1寄存器各位描述 在輸出模式下,該寄存器的值與CNT中的值進(jìn)行比較,根據(jù)結(jié)果,實(shí)現(xiàn)電平的翻轉(zhuǎn)。至此,我們把用到的幾個(gè)寄存器都介紹完畢,下面我們就介紹如何通過庫函數(shù)來配置實(shí)現(xiàn)PWM三路輸出。 開啟TIM3時(shí)鐘以及復(fù)用功能輸出。使能GPIO和端口復(fù)用功能時(shí)鐘。庫函數(shù)使能TIM3、GPIO以及復(fù)用功能時(shí)鐘的方法是: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); 初始化TIM3,設(shè)置TIM3的PSC和ARR。在開啟了TIM3的時(shí)鐘之后,我們要設(shè)置PSC和ARR寄存器的值來控制PWM的輸出周期。調(diào)用的格式如下: TIM_TimeBaseStructure.TIM_Period=arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 設(shè)置TIM3_CH1、CH2、CH3的PWM模式,使能TIM3的CH1、CH2、CH3輸出。在庫函數(shù)中PWM通道設(shè)置是通過TIM_OC1Init~TIM_OC4Init來設(shè)置的,這里我們需要3路PWM輸出,所以我們需要使用函數(shù)TIM_OC1Init、TIM_OC2Init、TIM_OC3Init。庫函數(shù)的調(diào)用格式如下: TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC3Init(TIM3, &TIM_OCInitStructure); 使能TIM3。完成以上配置后,我們要使能定時(shí)器TIM3。庫函數(shù)調(diào)用格式如下: TIM_Cmd(TIM3, ENABLE); 通過修改TIM3_CCRx(x為1,2,3)來控制占空比。庫函數(shù)格式如下: Void TIM_SetComparex(TIM3,uint16_t Compare2); 我們可以知道,通過定時(shí)器3控制PWM波的占空比,從而實(shí)現(xiàn)速度方面的控制。其中arr和psc可以控制PWM波的周期,TIM3_CCRx可以控制PWM波的占空比。我們只需要調(diào)用此函數(shù)就可以實(shí)現(xiàn)不同的速度控制。 對(duì)于運(yùn)動(dòng)方向控制的代碼我們就以后退為例,由于端口寄存器過于簡(jiǎn)單,我們不在此介紹端口的寄存器。我們僅介紹如何通過庫函數(shù)進(jìn)行端口配置。對(duì)各個(gè)I/O端口配置的過程相似,我們僅以PD8為例:主要過程如下所示: 使能I/O口時(shí)鐘,調(diào)用格式如下所示: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE); 初始化I/O參數(shù),調(diào)用格式如下所示: GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); 操作I/0口 GPIO_SetBits(GPIOD,GPIO_Pin_8);PD8置1 GPIO_ResetBits(GPIOD,GPIO_Pin_8);PD8置0 我們知道了如何對(duì)端口進(jìn)行操作之后就可以隨意的控制小車的運(yùn)動(dòng)啦,運(yùn)動(dòng)方向的程序設(shè)計(jì),其基本函數(shù)單元如下所示: void Left_Low(void);… 我們調(diào)用這些函數(shù),就可以實(shí)現(xiàn)不同運(yùn)動(dòng)方向的控制。主要代碼詳見附錄3. 2.3 避障模塊設(shè)計(jì) 在人類身體構(gòu)造系統(tǒng)中,眼睛可以使我們非常方便的采集到外界環(huán)境的信息,然后把信息及時(shí)的傳輸?shù)酱竽X,并對(duì)外界環(huán)境信息的變化做出相應(yīng)的處理。而對(duì)智能小車來說,避障模塊之于小車就相當(dāng)于眼睛之于人類。避障模塊可以采集外部地形數(shù)據(jù),然后把所采集的地形數(shù)據(jù)傳輸?shù)街醒胩幚砟K,從而實(shí)現(xiàn)躲避障礙的功能。避障模塊所采用的器件在市場(chǎng)中有許多類型,比如紅外檢測(cè),光位移檢測(cè),超聲波檢測(cè)等。本次試驗(yàn)我們使用的是HC-SR04超聲波檢測(cè),超聲波由于具有檢測(cè)能力強(qiáng),傳播路徑寬,因此我們決定使用HC-SR04器件。 在使用HC-SR04模塊進(jìn)行超聲波測(cè)距的同時(shí),我們可以使用舵機(jī)進(jìn)行輔助。舵機(jī)的主要作用是改變HC-SR04模塊的照射方向,從而控制超聲波的發(fā)射方向。在程序編寫過程中,如果小車前方遇見障礙時(shí),我們可以直接控制舵機(jī)的轉(zhuǎn)向,而小車的車身可以保持不變,在測(cè)量結(jié)束后,小車再做相應(yīng)的動(dòng)作。 2.3.1 避障模塊器件結(jié)構(gòu)及其原理 HC-SR04超聲波測(cè)距模塊測(cè)量范圍在2cm-400cm之間,可以實(shí)現(xiàn)無接觸式測(cè)距功能。HC-SR04超聲波測(cè)距模塊由一個(gè)超聲波發(fā)射器、一個(gè)超聲波接收器和控制電路組成,避障模塊的實(shí)物結(jié)構(gòu)圖如圖2.17所示: 圖2.17 實(shí)物正反面結(jié)構(gòu)圖 如結(jié)構(gòu)圖所示VCC提供5v電源,GND為接地線,TRIG為觸發(fā)信號(hào)線,ECHO為回向信號(hào)輸出線。基本原理如下:采用IO口TRIG觸發(fā)測(cè)距,給至少10us的高電平信號(hào),在TRIG觸發(fā)沿到來后,超聲波發(fā)射器會(huì)自動(dòng)發(fā)出8個(gè)40KHz的方波,并且檢測(cè)是否有信號(hào)返回,當(dāng)超聲波接收器接收到超聲波時(shí),表明有信號(hào)返回,通過IO口ECHO輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。因此測(cè)量距離=(高電平持續(xù)時(shí)間*340m/s)/2。測(cè)量時(shí)序圖如圖2.18所示: 圖2.18 超聲波時(shí)序圖 我們根據(jù)時(shí)序圖,可以編寫相應(yīng)的程序代碼。為了防止發(fā)射信號(hào)對(duì)回向信號(hào)的影響,我們的測(cè)量周期不易過小。并且由于HC-SR04的感應(yīng)角度不大于15,所以測(cè)距時(shí),為了防止發(fā)射信號(hào)丟失,我們要求被測(cè)物體的面積不應(yīng)小于0.5平方米,否則可能導(dǎo)致測(cè)量結(jié)果不準(zhǔn)確。 舵機(jī)在避障模塊的主要作用前面已經(jīng)提到,本節(jié)主要講解舵機(jī)的工作特性。舵機(jī)的實(shí)物圖如圖2.19所示: 圖2.19 舵機(jī)實(shí)物圖 舵機(jī)的工作工作原理是stm32微處理器發(fā)出數(shù)據(jù)給舵機(jī),舵機(jī)內(nèi)部有一個(gè)基準(zhǔn)電路,它會(huì)產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號(hào),它將微處理器傳輸?shù)闹绷髌秒妷号c電位器的電壓數(shù)據(jù)進(jìn)行比較,獲得電壓差輸出。經(jīng)由電路板上的IC判斷轉(zhuǎn)動(dòng)方向,再驅(qū)動(dòng)無核心馬達(dá)開始轉(zhuǎn)動(dòng),透過減速齒輪將動(dòng)力傳至擺臂,同時(shí)由位置檢測(cè)器送回反饋信號(hào)。舵機(jī)的轉(zhuǎn)動(dòng)角度與stm32所提供的PWM信號(hào)相關(guān)。標(biāo)準(zhǔn)信號(hào)PWM周期為20ms,理論上來講脈寬為1~2ms,實(shí)際我們的脈寬為0.5~2.5ms,脈寬與所轉(zhuǎn)的角度一一對(duì)應(yīng)。角度與脈寬的對(duì)應(yīng)圖如圖2.20所示: 圖2.20 舵機(jī)角度與脈寬對(duì)應(yīng)圖 2.3.2 HC-SR04模塊硬件電路設(shè)計(jì) 超聲波模塊硬件原理圖如下圖所示: 圖2.21 超聲波硬件原理圖 HC-SR04模塊主要由發(fā)射器、接收器和部分電路組成。在此試驗(yàn)中,我們只需簡(jiǎn)單了解電路的設(shè)計(jì),對(duì)于其基本原理可以不用過多涉獵,我們只需明白它們的工作原理,并且能夠簡(jiǎn)單運(yùn)用即可。 2.3.3 HC-SR04模塊程序設(shè)計(jì) 根據(jù)硬件電路的設(shè)計(jì),我們對(duì)避障子程序進(jìn)行設(shè)計(jì),程序流程圖如圖2.22所示: 圖2.22 避障程序流程圖 避障模塊在程序設(shè)計(jì)中,我們的工作主要是: 1、控制超聲波的掃描周期 2、采集超聲波發(fā)射到接受的高電平持續(xù)時(shí)間t 3、對(duì)采集的高電平持續(xù)時(shí)間t進(jìn)行處理,判斷前方是否有障礙 下面我們就詳細(xì)介紹我們是怎么通過軟件設(shè)計(jì)來完成這幾個(gè)步驟的: 1、控制超聲波的掃描周期 根據(jù)表2-2,我們采用的是TIM2來控制超聲波的掃描周期。首先我們把TIM2設(shè)置為定時(shí)器中斷模式,代碼格式為void TIM2_Int_Init(u16 arr,u16 psc); 由于配置定時(shí)器中斷模式十分簡(jiǎn)單,我們就不在詳細(xì)介紹,其詳細(xì)代碼見附錄4.定時(shí)器TIM2的中斷周期計(jì)算公式為T=((arr+1)*(psc+1))/Tclk。Tclk為系統(tǒng)周期,一般為72Mhz.我們?cè)谥袛喾?wù)程序中控制超聲波的發(fā)射,我們采用PC7作為觸發(fā)信號(hào),根據(jù)超聲波時(shí)序圖,我們需要在中斷程序中給PC7一個(gè)持續(xù)10ms的高電平,中斷服務(wù)程序如下: void TIM2_IRQHandler(void) //TIM2中斷 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); GPIO_SetBits(GPIOC,GPIO_Pin_7); delay_ms(10); GPIO_ResetBits(GPIOC,GPIO_Pin_7); } } 2、采集超聲波發(fā)射到接受的持續(xù)時(shí)間t 在本節(jié)試驗(yàn)中,我們使用了通用定時(shí)器TIM5的輸入捕獲功能,輸入捕獲模式具有測(cè)量頻率或者測(cè)量脈沖的寬度的功能。我們開啟TIM5通道CH1(定時(shí)器5)的輸入捕獲模式,采集ECHO端口的高電平持續(xù)時(shí)間。配置定時(shí)器5代碼格式為: void TIM5_Cap_Init(u16 arr,u16 psc){…} 下面我們就詳細(xì)講解一下,如何開啟并使用通用定時(shí)器的輸入捕獲功能。 輸入捕獲的原理,簡(jiǎn)單的講就是通過檢測(cè)TIM5(定時(shí)器)通道CH1的邊沿信號(hào),當(dāng)邊沿信號(hào)發(fā)生變化時(shí),當(dāng)前寄存器的值TIM1_CNT存放到通道的捕獲/比較寄存器(TIM5_CCR1)里面。我們的實(shí)驗(yàn)就是采集捕獲/比較寄存器(TIM5_CCR1)中的值并進(jìn)行處理,完成相應(yīng)的動(dòng)作。為了使TIM5通道CH1具有捕獲功能,我們需要用到TIM5_PSC、TIM5_ARR、捕獲/比較模式寄存器(TIM5_CCMR1)、捕獲/比較使能寄存器(TIM5_CCER)、捕獲/比較寄存器(TIM5_CCR1)、DMA/中斷使能寄存器(TIM5_DIER)、控制寄存器(TIM5_CR1)。我們下面就簡(jiǎn)單介紹下下這幾個(gè)寄存器。 TIM5_PSC、TIM5_ARR、TIM5_CCR1這3個(gè)寄存器用法與前節(jié)中相同,我們就不在贅述,而在本實(shí)驗(yàn)中,捕獲/比較寄存器TIM5_CCMR1非常重要,該寄存器的各位描述如下圖所示: 圖2.23 TIMx_CCMR1各位描述 我們使用的是TIM5捕獲/比較通道CH1,所以圖中只介紹[7:0]位。本次試驗(yàn)我們?cè)O(shè)置CC1S[1:0]=01,IC1PSC[1:0]=00,IC1F[3:0]=0000。 接著我們?cè)賮砜纯床东@/比較使能寄存器TIMx_CCER,本節(jié)用到了CC1E和CC1P兩位,描述如下圖所示: 圖2.24 TIMx_CCER最低兩位描述 所以要使能通道CH1輸入捕獲,CC1E必須設(shè)置為1,而CC1P則可以根據(jù)實(shí)際情況設(shè)置。 其次,我們?cè)倏纯碊MA/中斷使能寄存器(TIM5_DIER),因?yàn)槲覀兪褂玫氖峭ǖ繡H1,所以我們僅介紹控制通道CH1的位,如下圖所示: 圖2.25 TIMx_DIER各位描述 通過此圖我們知道,我們需要設(shè)置CC1IE為1即可。 然后,我們?cè)倏纯纯刂萍拇嫫鱐IMx_CR1,我們只用到了最低位,所以我們僅介紹位0的功能,TIMx_CR1寄存器各位描述及位0功能描述如下如所示: 圖2.26 TIMx_CR1寄存器各位描述及位0功能描述 我們要使能計(jì)數(shù)器,所以位0設(shè)置為1。至此,我們所使用的寄存器一一介紹完畢,下面介紹怎么配置輸入/捕獲步驟: 開啟TIM5時(shí)鐘以及GPIOA時(shí)鐘。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 初始化TIM5,設(shè)置TIM5的psc和arr。 TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); 設(shè)置TIM5的輸入比較參數(shù),開啟捕獲模式。 TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1; TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 TIM_ICInit(TIM5, &TIM5_ICInitStructure); 設(shè)置TIM5的DIER寄存器,使能捕獲和更新中斷功能。 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); 設(shè)置中斷分組并編寫中斷服務(wù)函數(shù) NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 使能定時(shí)器 TIM_Cmd(TIM5,ENABLE ); 我們知道了如何設(shè)置TIM5的CH1為輸入捕獲模式,我們是在TIM5的中斷服務(wù)函數(shù)中采集持續(xù)時(shí)間t的,TIM5CH1_CAPTURE_STA為輸入捕獲狀態(tài),TIM5CH1_CAPTURE_VAL為輸入捕獲值,中斷服務(wù)函數(shù)如下所示: if((TIM5CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲 { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) { if(TIM5CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了 { if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了 { TIM5CH1_CAPTURE_STA|=0X80;//標(biāo)記成功捕獲了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++;}} if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件 { if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個(gè)下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //標(biāo)記成功捕獲到一次上升沿 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設(shè)置為上升沿捕獲 }else //還未開始,第一次捕獲上升沿 { TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; //標(biāo)記捕獲到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設(shè)置為下降沿捕獲}}} 3、對(duì)采集的時(shí)間t進(jìn)行處理,判斷前方是否有障礙 我們對(duì)采集時(shí)間t的處理也是在TIM5的中斷服務(wù)函數(shù)中的,我們根據(jù)因測(cè)量距離=(高電平持續(xù)時(shí)間t*340m/s)/2,得出只要高電平持續(xù)時(shí)間t<1500us,距離就小于25cm,就會(huì)判定前方有障礙,其詳細(xì)代碼如下: if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿 { temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=65536;//溢出時(shí)間總和 temp+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時(shí)間 TIM_Cmd(TIM2, DISABLE); if(temp<1500) { stopward();t++;flag++; if(t==1) { Midstate=temp; TIM_SetCompare2(TIM3,60);//舵機(jī)右轉(zhuǎn)} if(t==2){ Leftstate=temp; TIM_SetCompare2(TIM3,250); //舵機(jī)左轉(zhuǎn) } if(t==3) {t=0; Rightstate=temp; TIM_SetCompare2(TIM3,150); rotate_Left();}} else { if(flag==0){farward_Low();} if(flag==1) {turn_Left();} if(flag==2) {turn_Right();} if(flag>=3) {flag=0; rotate_Left();} TIM_SetCompare2(TIM3,150); t=0; flag=0; } TIM_Cmd(TIM2, ENABLE); TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲}} 2.4循跡模塊設(shè)計(jì) 這節(jié)要完成的任務(wù)是使小車沿著黑帶運(yùn)動(dòng)。要想使小車沿著黑帶運(yùn)動(dòng),必須使小車感應(yīng)到黑跡在什么地方,然后讓小車的中央處理單元驅(qū)動(dòng)硬件電路完成相應(yīng)的行為動(dòng)作。循跡模塊的設(shè)計(jì)就是使小車能準(zhǔn)確的識(shí)別黑帶的軌跡。小車的中央處理模塊從循跡模塊獲得數(shù)據(jù),然后中央處理模塊根據(jù)采集的數(shù)據(jù)驅(qū)動(dòng)電機(jī)模塊完成相應(yīng)的動(dòng)作。考慮到成本和操作,本實(shí)驗(yàn)使用的紅外探測(cè)器。 2.4.1 循跡模塊結(jié)構(gòu)及其原理 紅外探測(cè)器(IR)是由紅外發(fā)射管、紅外接收管和部分電路組成。要做到4路循跡,需要使用4個(gè)獨(dú)立的紅外探測(cè)器器件。我們使用的IR5是一個(gè)集成模塊,這個(gè)集成模塊由5個(gè)紅外探測(cè)器組成。其中中間的1個(gè)IR探測(cè)器在本實(shí)驗(yàn)中并未使用。紅外循跡模塊實(shí)物圖如圖2.27所示: 圖2.27 紅外模塊正反面 本實(shí)驗(yàn)使用的IR5集成模塊是由5個(gè)相同的IR探測(cè)器電路組成的,所以我們只需要了解一個(gè)IR探測(cè)器的工作原理即可。我們知道IR探測(cè)器是由紅外發(fā)射管、紅外接收管和部分電路組成。基本原理是紅外發(fā)射管發(fā)射紅外光經(jīng)地面反射,在黑色區(qū)域紅外光被吸收,在非黑色區(qū)域紅外光被反射,紅外接收管根據(jù)反射光的強(qiáng)度為比較器提供模擬量,從而輸出相應(yīng)的電平量。其單個(gè)IR探測(cè)器電路原理圖如圖2.28所示: 圖2.28 IR探測(cè)器電路原理圖 根據(jù)原理圖詳解下IR探測(cè)器的工作原理:VCC為模塊提供電源,是IR探測(cè)器工作的前提條件,紅外發(fā)射管DF2發(fā)射紅外光到達(dá)“地面”,經(jīng)反射后紅外光會(huì)到達(dá)DS2紅外接收管,由于不同顏色的地面會(huì)對(duì)光的吸收有著不同的效果,所以發(fā)射后的光的強(qiáng)度也會(huì)不同,反射強(qiáng)度不同,LM339的5腳會(huì)輸入一個(gè)變化的電壓量,LM339是一個(gè)電壓較器,當(dāng)LM339的“+”端輸入信號(hào)大于“-”端的比較信號(hào)后,LM339的輸出端截止,在外部的上拉電源的作用下,使IR探測(cè)器的輸出端輸出+5v的電壓。同理,在“+”端電壓小于“—”端電壓時(shí),LM339輸出端電壓飽和使IR探測(cè)器輸出為低電壓。因此可以通過調(diào)節(jié)R2的電阻值,改變比較電壓的大小即“—”端電壓的大小,從而控制探測(cè)的距離。R4是整個(gè)正反饋電路的重要組成部分,由于“+”輸入端電壓會(huì)經(jīng)常發(fā)生在比較電壓附近擾動(dòng)的現(xiàn)象,這些微小的擾動(dòng)都會(huì)造成輸出端的巨大變化,因此,我們采用正反饋的方式避免這種現(xiàn)象的發(fā)生。加入R4電阻,就成為人們所說的“施密特觸發(fā)器”,其特性圖如圖2.29所示: 圖2.29 施密特觸發(fā)器特性圖 當(dāng)輸入端的電壓發(fā)生轉(zhuǎn)化時(shí),只要在比較電壓值附近的干擾不超過du之值,輸出的電壓就不會(huì)改變。R4正反饋的引入,不僅提高了電路的處理速度,而且可以免除由于寄生電路耦合而產(chǎn)生的自己震蕩。但是,在提升電路的處理速度的同時(shí),帶來的缺點(diǎn)就是分辨率降低,因?yàn)橹灰赿u附近輸出的電壓值就不會(huì)改變。 2.4.2 循跡模塊電路設(shè)計(jì) IR5探測(cè)器的集成模塊的電路原理圖如圖2.30所示: 圖2.30 紅外循跡模塊電路圖 2.4.3 紅外循跡模塊程序設(shè)計(jì) 根據(jù)電路原理圖,我們對(duì)循跡子程序進(jìn)行設(shè)計(jì),循跡子程序流程圖如圖2.31所示: 圖2.31 循跡子程序流程圖 我們?cè)谘E程序設(shè)計(jì)中,主要工作為: 1、配置管腳與紅外探測(cè)器的對(duì)應(yīng)關(guān)系 當(dāng)紅外探測(cè)器模塊在黑帶上方時(shí),輸出為0。當(dāng)紅外探測(cè)器模塊在白色上方時(shí),輸出為1。因此我們采用中斷的方式進(jìn)行循跡,因?yàn)椴捎玫氖?路循跡,所以我們需要4個(gè)管腳與其一一對(duì)應(yīng),對(duì)應(yīng)關(guān)系如下表: 表2-3管腳與紅外探測(cè)器位置對(duì)應(yīng)關(guān)系表 管腳名稱 紅外探測(cè)器位置 PE1 左 PE2 最左 PE3 右 PE4 最右 在配置好管腳與紅外位置關(guān)系之后,我們就需要進(jìn)行中斷初始化,中斷程序上文2.1.4節(jié)中已經(jīng)講過,我們?cè)谶@里就不做介紹。 2、編寫中斷服務(wù)函數(shù) 我們?cè)谥袛喑跏蓟螅托枰獙懼袛喾?wù)函數(shù)啦,我們就以PE1為例,當(dāng)PE1的值發(fā)生變化時(shí),我們就進(jìn)入中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)中判斷紅外探測(cè)器是否在黑帶上方,如果在,此時(shí)我們需要使小車向左轉(zhuǎn),如果不在黑帶上方,小車就繼續(xù)前進(jìn)。其- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 畢業(yè)設(shè)計(jì) 基于 stm32 智能 小車 設(shè)計(jì)
鏈接地址:http://www.820124.com/p-10664736.html