畢業(yè)設計-基于stm32的智能小車設計
《畢業(yè)設計-基于stm32的智能小車設計》由會員分享,可在線閱讀,更多相關《畢業(yè)設計-基于stm32的智能小車設計(47頁珍藏版)》請在裝配圖網(wǎng)上搜索。
基于stm32的智能小車設計 摘要 本次試驗主要分析了基于STM32F103微處理器的智能小車控制系統(tǒng)的系統(tǒng)設計過程。此智能系統(tǒng)的組成主要包括STM32F103控制器、電機驅(qū)動電路、紅外探測電路、超聲波避障電路。本次試驗采用STM32F103微處理器為核心芯片,利用PWM技術對速度以及舵機轉(zhuǎn)向進行控制,循跡模塊進行黑白檢測,避障模塊進行障礙物檢測并避障功能,其他外圍擴展電路實現(xiàn)系統(tǒng)整體功能。小車在運動時,避障程序優(yōu)先于循跡程序,用超聲波避障電路進行測距并避障,在超聲波模塊下我們使用舵機來控制超聲波的發(fā)射方向,用紅外探測電路實現(xiàn)小車循跡功能。在硬件設計的基礎上提出了實現(xiàn)電機控制功能、智能小車簡單循跡和避障功能的軟件設計方案,并在STM32集成開發(fā)環(huán)境Keil下編寫了相應的控制程序,并使用mcuisp軟件進行程序下載。 關鍵詞:stm32;紅外探測;超聲波避障;PWM;電機控制 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.軟硬件設計 - 5 - 2.1中央處理模塊 - 5 - 2.1.1 stm32f103內(nèi)部結構 - 6 - 2.1.2 stm32最小系統(tǒng)電路設計 - 7 - 2.1.3 stm32軟件設計的基本思路 - 9 - 2.1.4 stm32中斷介紹 - 9 - 2.1.5 stm32定時/計數(shù)器介紹 - 11 - 2.1.6 主程序設計流程圖 - 12 - 2.2 電機驅(qū)動模塊 - 13 - 2.2.1 驅(qū)動模塊結構及其原理 - 13 - 2.2.2 驅(qū)動模塊電路設計 - 13 - 2.2.3驅(qū)動軟件程序設計 - 14 - 2.3 避障模塊設計 - 18 - 2.3.1 避障模塊器件結構及其原理 - 19 - 2.3.2 HC-SR04模塊硬件電路設計 - 21 - 2.3.3 HC-SR04模塊程序設計 - 21 - 2.4循跡模塊設計 - 28 - 2.4.1 循跡模塊結構及其原理 - 28 - 2.4.2 循跡模塊電路設計 - 30 - 2.4.3 紅外循跡模塊程序設計 - 30 - 3.軟件調(diào)試 - 33 - 3.1 程序仿真 - 33 - 3.2 程序下載 - 34 - 4.系統(tǒng)測試 - 35 - 5.總結 - 37 - 致謝 - 39 - 參考文獻 - 40 - 附錄 - 41 - 1.緒論 智能小車通過各種感應器獲得外部環(huán)境信息和內(nèi)部運動狀態(tài),實現(xiàn)在復雜環(huán)境背景下的自主運動,從而完成具有特定功能的機器人系統(tǒng)。而隨著智能化電器時代的到來,它們在為人們提供的舒適的生活環(huán)境的同時,也提高了制造智能化電器對于人才要求的門檻。智能小車是集成了多種高新技術,它不僅融合了電子、傳感器、計算機硬件、軟件等許多學科的知識,而且還涉及到當今許多前沿領域的技術,它是一個國家高科技技術水平的重要體現(xiàn)。通過建立起簡易智能小車的設計,引導學生從理論走向?qū)嵺`,培養(yǎng)同學們的動手能力,使同學們在了解智能化電器的工作原理的基礎上,還使同學們獲得完成整體項目的能力,并掌握了Stm32開發(fā)板的編程原理,為同學們進入ARM領域提供了基礎。另外,本次課程設計,使同學們了解自己的不足之處,從而使同學們有目標的提升自己的能力。 1.1研究概況 國外研究概況:上世紀50年代初,國外就有智能車輛的研究,從90年代開始,智能車輛的研究就進入了系統(tǒng)化、大規(guī)模的研究階段。尤其突出的是美國卡內(nèi)基-梅隴大學機器人研究所已經(jīng)完成了Navlab系列的自主車輛的研究,這一研究成果代表了國外智能車輛的主要研究方向。國內(nèi)研究概況:我國對于智能車輛的研究較晚,始于上世紀80年代,而且現(xiàn)在大部分還是使用入門級別的51單片機進行設計與研究的,為了彌補與國外研究的差距,開設了全國大學生電子設計競賽。 1.2研究思路 系統(tǒng)將采集的傳感器信號送入stm32微控制器中,stm32微控制器根據(jù)采集的信號做出不同的判斷,從而控制電機運動方向和運動速度。系統(tǒng)以stm32微控制器為核心,通過傳感器采集不同的信號做出判斷,繼而改變電機的運動方向和運動速度。實驗系統(tǒng)結構如圖1.1所示: 圖1.1 實驗系統(tǒng)結構圖 2.軟硬件設計 智能小車控制系統(tǒng)具備了障礙物檢測、自主避障、自主循跡等功能。相應的控制系統(tǒng)主要由以下四個模塊組成:避障模塊、循跡模塊、電機驅(qū)動模塊、中央處理模塊四個模塊組成,系統(tǒng)總體框架如圖2.1所示: 這個圖調(diào)整下,和下面的編號看起來位置不協(xié)調(diào) 圖2.1 系統(tǒng)框架圖 我們本節(jié)主要任務是了解各個模塊的功能,掌握各個模塊所使用的器件的使用方法,并能夠編寫相應的程序代碼。掌握各個模塊的功能。 2.1中央處理模塊 在人類身體結構中,大腦可以根據(jù)各個器官所傳輸?shù)男畔⒆龀鱿鄳男袨閯幼饔靡员WC人體所必須的生理原料,而stm32處理器之于智能小車就相當于大腦之于人類,它可以從各個模塊之間獲得數(shù)據(jù),并對所傳輸?shù)臄?shù)據(jù)進行實時處理,來驅(qū)使電機模塊做出相應的行為動作。 由ARM公司設計的基于ARMv7架構的Cortex系列的標準體系結構在2006年推出,此結構是用來滿足日漸復雜的不同性能要求的軟件設計,根據(jù)所面向的領域,Cortex系列可以分為A、R、M三個分工明確的系列[1]。Stm32處理器的出現(xiàn)為微控制系統(tǒng)、工業(yè)控制系統(tǒng)、汽車車身系統(tǒng)和無線網(wǎng)絡等對功耗和成本敏感的嵌入式應用領域?qū)崿F(xiàn)高系統(tǒng)性能系統(tǒng)提供了基礎,使編程的復雜性,集高性能、低功耗、低成本大大簡化,并使它們?nèi)跒橛谝惑w[2]。意法半導體ST公司作為一個半導體制造廠商,是ARM公司Cortex-M3內(nèi)核開發(fā)項目一個主要合作方。2007年6月11日由ST公司率先推出的基于Cortex-M3內(nèi)核的STM32系列微控處理器研發(fā)而出。此中,A系列是面向復雜的尖端應用程序,用于運行開放式的復雜操作系統(tǒng);R是Real的首字母縮寫,是面向?qū)崟r系統(tǒng)開發(fā)的;M是Mirco的首字母縮寫,專門面向低成本的微控制領域開發(fā)研究。因此,Cortex-M3處理器是由ARM公司設計的首款基于ARMv7-M體系結構的32位標準處理器,它不僅具有低功耗、少門數(shù)等優(yōu)點,而且還具有短中斷延遲、低調(diào)試成本等眾多優(yōu)點,使它在眾多的處理器中脫穎而出。目前為止,STM32系列處理器暫分為2個系列。其中,STM32F101系列是標準型系列,工作頻率設定在36MHZ;STM32F103系列是增強型系列,工作頻率設定在72MHZ,其帶有更多片內(nèi)RAM和更豐富的外設資源。這兩個系列的產(chǎn)品在軟件和引腳封裝方面具有兼容性,并且擁有相同的片內(nèi)Flash資源,使軟件的開發(fā)和升級更加方便。本次試驗,我們使用的是stm32f103處理器。 2.1.1 stm32f103內(nèi)部結構 STM32F103系列微處理器是首款基于ARMv7-M體系結構的32位標準RISC (精簡指令集)處理器,具有執(zhí)行代碼效率高,外設資源豐富等眾多優(yōu)點。該系列微處理器工作頻率設定在72MHz,高達128K 字節(jié)的內(nèi)置Flash存儲器存儲器 存儲器是用來存儲程序和數(shù)據(jù)的部件,有了存儲器,計算機才有記憶功能,才能保證正常工作。它根據(jù)控制器指定的位置存進和取出信息。 [全文]和20K 字節(jié)的SRAM,方便程序編寫,而且具有豐富的通用I/O 端口。其內(nèi)部結構圖如圖2.2所示: 圖2.2 內(nèi)部結構圖 Stm32處理器主系統(tǒng)主要由4個被動單元和4個驅(qū)動單元構成。4個驅(qū)動單元是:通用DMA1,通用DMA2,內(nèi)核DCode總線和系統(tǒng)總線。4個被動單元由APB橋,APB設備,內(nèi)部Flash閃存,內(nèi)部SRAM、FSMC。我們實驗所采用的芯片具有64KBSRAM、512KBFLASH、2個基本定時器,4個通用定時器,2個高級定時器,3個SPI,2個IIC,5個串口,1個USB,1個CAN,3個12位的ADC,1個12位DAC、1個SDIO接口,1個FSMC接口以及112個通用I/O口。 2.1.2 stm32最小系統(tǒng)電路設計 Stm32的最小系統(tǒng)電路主要由系統(tǒng)時鐘電路、實時時鐘電路、JTAG調(diào)試接口電路,復位電路和啟動模式選擇電路組成。最小系統(tǒng)電路原理圖如圖2-1-3所示: 圖2.3 最小系統(tǒng)電路原理圖 主要電路原理圖的設計及功能如下所示: 1.系統(tǒng)時鐘電路 系統(tǒng)時鐘電路主要作用是提供節(jié)拍,就相當于人類的心臟跳動,隨著心臟的跳動,血液就會到達全身部位,所以系統(tǒng)時鐘的重要性就不言而喻啦。系統(tǒng)時鐘的電路設計如圖2.4所示: 圖2.4 系統(tǒng)時鐘電路圖 在時鐘電路中,我們選用8M的晶振。 2.復位電路 復位電路的設計如圖2.5所示: 圖2.5 復位電路圖 本次試驗所采用的開發(fā)板為低電平復位。如圖所示,當按鍵懸空時RST輸入為高電平,當按鍵按下時,RST腳輸入為低電平,從而電路復位。 3.JTAG電路 JTAG電路原理圖如圖2.6所示: 圖2.6 JAG電路原理圖 JTAG的主要功能是使目標文件燒到核處理器中。 4.啟動模式電路 啟動模式電路原理圖如圖2.7所示: 圖2.7 啟動模式電路原理圖 通過設置BOOT[1:0]引腳可以選擇三種不同啟動模式,啟動模式如表2-1所示: 表2-1 啟動模式表 啟動模式選擇引腳 啟動模式 說明 BOOT1 BOOT0 X 0 主閃存存儲器 主閃存存儲器被選為啟動區(qū)域 0 1 系統(tǒng)存儲器 系統(tǒng)存儲器被選為啟動區(qū)域 1 1 內(nèi)置SRAM 內(nèi)置SRAM被選為啟動區(qū)域 2.1.3 stm32軟件設計的基本思路 在對其他模塊設計之前,我們必須了解stm32的編程規(guī)則。任何處理器,包括stm32處理器,想要處理器完成某項相應的動作,就必須對處理器的寄存器進行操作。比如,我們在單片機C51中,同樣,我們在stmM32的開發(fā)中過程中,我們同樣可以對寄存器直接操作: GPIOx->BRR=0x0011。 (x可以是A,B,C,D,E…比如GPIOA就是端口A) 但是,對于stm32這種級別的處理器,幾百個寄存器記起來談何容易。所以,ST(意法半導體)提出了固件庫的概念,利用固件庫進行編程。固件庫的本質(zhì)就是函數(shù)的集合,固件庫將那些寄存器的底層操作都封裝起來,提供一整套API供開發(fā)者使用。比如,上面通過控制BRR寄存器來控制電平的變化,官方庫封裝了一個函數(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ù)就可以直接對寄存器進行操作啦。 2.1.4 stm32中斷介紹 本方案中,我們要使用stm32的中斷,在程序設計中,我們要開啟各個管道的中斷,打開各個中斷通道,配置中斷方式,我們先來講述下stm32單片機的中斷機制。結構圖如下所示: 圖2.32 stm32外部中斷/事件控制器結構圖 圖中的實線箭頭,為外部中斷信號的傳輸路徑。 首先外部信號從編號為1的輸入線進入。 其次這個外部信號通過編號2的邊沿檢測電路,這個邊沿檢測電路受到“上升沿選擇寄存器”、“下降沿選擇寄存器”的控制,我們可以控制這兩個寄存器來選擇中斷的觸發(fā)方式。我們可以在程序中進行設置,比如所有段落設置為首行縮進2個字符 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;設置為上升沿觸發(fā)中斷 然后該外部信號進入編號為3或門,或門另一端是軟件中斷寄存器,如果,軟件中斷/事件寄存器的對應位置1,編號3的輸出總是為有效信號1。之后進入“中斷掛起請求寄存器”,該寄存器記錄了外部信號的電平變化。 最后經(jīng)過編號為4的與門進入NVIC中斷控制器,如果 “中斷屏蔽寄存器”的對應位置0,外部的中斷請求信號不能傳輸?shù)絅VIC中斷控制器,從而實現(xiàn)中斷的屏蔽。由于我們采用的是外部信號觸發(fā)中斷,所以我們只需了解外部中斷的請求機制,對于事件的中斷請求機制,我們在這里不做介紹。 我們以PE1為例,介紹下外部中斷的一般步驟。步驟如下: 開啟I/O的復用時鐘 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); 初始化線上中斷,設置觸發(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); 編寫中斷服務函數(shù) void EXTI1_IRQHandler(void){}主要代碼詳見附錄2. 2.1.5 stm32定時/計數(shù)器介紹 Stm32系列的單片機一般包含8個計數(shù)/定時器,TIM1、TIM8分別為高級控制定時器,TIM2~TIM5為通用定時器,TIM6以及TIM7為基本定時器。對于定時器的詳細內(nèi)容,我們不在這里一一介紹。 然后我們介紹一下本實驗采用了那些定時器,以及這些定時器所要完成的功能有哪些。本實驗所采用的定時器以及功能如下表所示: 表2-2定時器介紹表 定時器名稱 定時器配置模式 主要功能 TIM2 定時器中斷模式 通過定時器中斷,控制超聲波的掃描周期 TIM3 PWM復用輸出模式 控制小車速度及舵機轉(zhuǎn)向 TIM5 輸入捕獲模式 采集超聲波發(fā)射到接受的高電平持續(xù)時間t 2.1.6 主程序設計流程圖 在本節(jié)實驗中,循跡模塊以及避障模塊都是采用中斷方式進行工作的,因此其主程序流程圖如下圖所示: 圖1.2 主程序流程圖 根據(jù)程序設計圖,主程序設計如下: int main(void) { u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài) u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值 delay_init(); //延時函數(shù)初始化 NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級 LED_Init(); GPIO_Configuration(); //端口初始化 EXTIX_Init(); //掃描軌跡 TIM2_Int_Init(4999,7199); //控制超聲波掃描周期 TIM3_PWM_Init(1999,719); //控制舵機方向 TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計數(shù) while(1) { farward_Low();delay_ms(10);} } 2.2 電機驅(qū)動模塊 Stm32對小車的控制,就是對電機的控制,通過控制電機的轉(zhuǎn)向,小車的運動狀態(tài)就會發(fā)生改變。電機驅(qū)動模塊的主要器件為LM293N,我們下面就詳細講解下電機驅(qū)動模塊。 2.2.1 驅(qū)動模塊結構及其原理 電機驅(qū)動模塊的實物圖如圖2.8所示: 圖2.8 驅(qū)動電路實物圖 電機驅(qū)動模塊的主要器件是芯片LM293D,內(nèi)部原理圖如圖2.9所示: K4 K2 K1 K3 S4 圖2.9 電機驅(qū)動內(nèi)部原理圖 全橋式驅(qū)動電路的4只開關管都工作在斬波狀態(tài),如圖1.2所示,K1、K2為一組,K3、K4 為另一組,兩組的狀態(tài)互補,一組導通則另一組必定關斷。當K1、K2導通時,K3、K4關斷,電機兩端加正向電壓,電機實現(xiàn)正轉(zhuǎn)或反轉(zhuǎn)制動;當K3、K4導通時,K1、K2關斷,電機兩端為反向電壓,電機實現(xiàn)反轉(zhuǎn)或正轉(zhuǎn)制動。 2.2.2 驅(qū)動模塊電路設計 電機驅(qū)動模塊的電路原理如圖2.10所示: 圖2.10 驅(qū)動模塊電路原理圖 表2-2是各個端口狀態(tài)與運動方向的關系,其關系如下表所示: 表2-2 端口與運動方向關系表 電機M1 IN1 IN2 電機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ū)動軟件程序設計 車輪電機的動作由GPIO口的輸出實現(xiàn),本節(jié)主要配置運動方向和運動速度,對于運動速度的控制,我們必須使用PWM,通過改變PWM的占空比來調(diào)節(jié)速度的大小,其主要代碼設計如下所示: void TIM3_PWM_Init(u16 arr,u16 psc){ ….} 要想使stm32的通用定時器TIMx產(chǎn)生PWM輸出,需要用到的寄存器有:預分頻寄存器(TIMx_PSC)、自動重裝載寄存器(TIMx_ARR)、捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。我們先介紹這幾個寄存器,然后介紹如何使用庫函數(shù)產(chǎn)生PWM輸出。下面我們就簡單介紹下這些寄存器: 首先是預分頻寄存器(TIMx_PSC),該寄存器可以用設置對時鐘進行分頻,然后在提供給計數(shù)器作為計數(shù)器的時鐘。該寄存器的各位功能如圖所示: 圖2.11 TIMx_PSC寄存器各位描述 接下來介紹自動重裝載寄存器(TIMx_ARR),該寄存器的各位描述如下圖所示: 圖2.12 TIMx_ARR寄存器各位描述 通過設置這兩個寄存器,我們就可以算出PWM的輸出周期,計算公式為: Tout=((arr+1)*(psc+1))/Tclk。其中Tclk為系統(tǒng)時鐘周期。 其次我們介紹捕獲/比較模式寄存器(TIMx_CCMR1/2),總共有兩個,TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1控制通道CH1和CH2,TIMx_CCMR2控制CH3和CH4。因為這2個寄存器差不多,我們僅以通道CH1為例,介紹其中的TIMx_CCMR1為例,該寄存器的各位描述如下圖所示: 圖2.13 TIMx_CCMR1/2寄存器各位描述 這里我們只介紹該寄存器的OCxM位,我們就以TIMx_CCMR1中的OC1M(控制通道CH1)為例,該位功能如下圖所示: 圖2.14 OC1M功能描述 我們使用的是PWM輸出模式,所以OC1M必須設置為110/111。OC2M(控制通道CH2)各位描述與OC1M相同,我們這要不在敘述。 然后我們介紹捕獲/比較使能寄存器(TIMx_CCER),該寄存器控制著各個輸入/輸出通道的開關,對于該寄存器,各位描述如下圖所示: 圖2.15 TIMx_CCER寄存器描述 該寄存器比較簡單,因為我們只介紹通道1,所以我們只講CC1E位。如果我們想使能輸入/捕獲1,我們只需使用CC1E位。要想使PWM從I/O口輸出,此位必須設置為1。 最后介紹捕獲/比較寄存器(TIMx_CCR1~4),總共有4個,分別對應CH1~4,因為這4個寄存器相似,我們僅以TIMx_CCR1為例,該寄存器的給位介紹如下圖所示: 圖2.16 TIMx_CCR1寄存器各位描述 在輸出模式下,該寄存器的值與CNT中的值進行比較,根據(jù)結果,實現(xiàn)電平的翻轉(zhuǎn)。至此,我們把用到的幾個寄存器都介紹完畢,下面我們就介紹如何通過庫函數(shù)來配置實現(xiàn)PWM三路輸出。 開啟TIM3時鐘以及復用功能輸出。使能GPIO和端口復用功能時鐘。庫函數(shù)使能TIM3、GPIO以及復用功能時鐘的方法是: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); 初始化TIM3,設置TIM3的PSC和ARR。在開啟了TIM3的時鐘之后,我們要設置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); 設置TIM3_CH1、CH2、CH3的PWM模式,使能TIM3的CH1、CH2、CH3輸出。在庫函數(shù)中PWM通道設置是通過TIM_OC1Init~TIM_OC4Init來設置的,這里我們需要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。完成以上配置后,我們要使能定時器TIM3。庫函數(shù)調(diào)用格式如下: TIM_Cmd(TIM3, ENABLE); 通過修改TIM3_CCRx(x為1,2,3)來控制占空比。庫函數(shù)格式如下: Void TIM_SetComparex(TIM3,uint16_t Compare2); 我們可以知道,通過定時器3控制PWM波的占空比,從而實現(xiàn)速度方面的控制。其中arr和psc可以控制PWM波的周期,TIM3_CCRx可以控制PWM波的占空比。我們只需要調(diào)用此函數(shù)就可以實現(xiàn)不同的速度控制。 對于運動方向控制的代碼我們就以后退為例,由于端口寄存器過于簡單,我們不在此介紹端口的寄存器。我們僅介紹如何通過庫函數(shù)進行端口配置。對各個I/O端口配置的過程相似,我們僅以PD8為例:主要過程如下所示: 使能I/O口時鐘,調(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 我們知道了如何對端口進行操作之后就可以隨意的控制小車的運動啦,運動方向的程序設計,其基本函數(shù)單元如下所示: void Left_Low(void);… 我們調(diào)用這些函數(shù),就可以實現(xiàn)不同運動方向的控制。主要代碼詳見附錄3. 2.3 避障模塊設計 在人類身體構造系統(tǒng)中,眼睛可以使我們非常方便的采集到外界環(huán)境的信息,然后把信息及時的傳輸?shù)酱竽X,并對外界環(huán)境信息的變化做出相應的處理。而對智能小車來說,避障模塊之于小車就相當于眼睛之于人類。避障模塊可以采集外部地形數(shù)據(jù),然后把所采集的地形數(shù)據(jù)傳輸?shù)街醒胩幚砟K,從而實現(xiàn)躲避障礙的功能。避障模塊所采用的器件在市場中有許多類型,比如紅外檢測,光位移檢測,超聲波檢測等。本次試驗我們使用的是HC-SR04超聲波檢測,超聲波由于具有檢測能力強,傳播路徑寬,因此我們決定使用HC-SR04器件。 在使用HC-SR04模塊進行超聲波測距的同時,我們可以使用舵機進行輔助。舵機的主要作用是改變HC-SR04模塊的照射方向,從而控制超聲波的發(fā)射方向。在程序編寫過程中,如果小車前方遇見障礙時,我們可以直接控制舵機的轉(zhuǎn)向,而小車的車身可以保持不變,在測量結束后,小車再做相應的動作。 2.3.1 避障模塊器件結構及其原理 HC-SR04超聲波測距模塊測量范圍在2cm-400cm之間,可以實現(xiàn)無接觸式測距功能。HC-SR04超聲波測距模塊由一個超聲波發(fā)射器、一個超聲波接收器和控制電路組成,避障模塊的實物結構圖如圖2.17所示: 圖2.17 實物正反面結構圖 如結構圖所示VCC提供5v電源,GND為接地線,TRIG為觸發(fā)信號線,ECHO為回向信號輸出線。基本原理如下:采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號,在TRIG觸發(fā)沿到來后,超聲波發(fā)射器會自動發(fā)出8個40KHz的方波,并且檢測是否有信號返回,當超聲波接收器接收到超聲波時,表明有信號返回,通過IO口ECHO輸出一高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。因此測量距離=(高電平持續(xù)時間*340m/s)/2。測量時序圖如圖2.18所示: 圖2.18 超聲波時序圖 我們根據(jù)時序圖,可以編寫相應的程序代碼。為了防止發(fā)射信號對回向信號的影響,我們的測量周期不易過小。并且由于HC-SR04的感應角度不大于15,所以測距時,為了防止發(fā)射信號丟失,我們要求被測物體的面積不應小于0.5平方米,否則可能導致測量結果不準確。 舵機在避障模塊的主要作用前面已經(jīng)提到,本節(jié)主要講解舵機的工作特性。舵機的實物圖如圖2.19所示: 圖2.19 舵機實物圖 舵機的工作工作原理是stm32微處理器發(fā)出數(shù)據(jù)給舵機,舵機內(nèi)部有一個基準電路,它會產(chǎn)生周期為20ms,寬度為1.5ms的基準信號,它將微處理器傳輸?shù)闹绷髌秒妷号c電位器的電壓數(shù)據(jù)進行比較,獲得電壓差輸出。經(jīng)由電路板上的IC判斷轉(zhuǎn)動方向,再驅(qū)動無核心馬達開始轉(zhuǎn)動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回反饋信號。舵機的轉(zhuǎn)動角度與stm32所提供的PWM信號相關。標準信號PWM周期為20ms,理論上來講脈寬為1~2ms,實際我們的脈寬為0.5~2.5ms,脈寬與所轉(zhuǎn)的角度一一對應。角度與脈寬的對應圖如圖2.20所示: 圖2.20 舵機角度與脈寬對應圖 2.3.2 HC-SR04模塊硬件電路設計 超聲波模塊硬件原理圖如下圖所示: 圖2.21 超聲波硬件原理圖 HC-SR04模塊主要由發(fā)射器、接收器和部分電路組成。在此試驗中,我們只需簡單了解電路的設計,對于其基本原理可以不用過多涉獵,我們只需明白它們的工作原理,并且能夠簡單運用即可。 2.3.3 HC-SR04模塊程序設計 根據(jù)硬件電路的設計,我們對避障子程序進行設計,程序流程圖如圖2.22所示: 圖2.22 避障程序流程圖 避障模塊在程序設計中,我們的工作主要是: 1、控制超聲波的掃描周期 2、采集超聲波發(fā)射到接受的高電平持續(xù)時間t 3、對采集的高電平持續(xù)時間t進行處理,判斷前方是否有障礙 下面我們就詳細介紹我們是怎么通過軟件設計來完成這幾個步驟的: 1、控制超聲波的掃描周期 根據(jù)表2-2,我們采用的是TIM2來控制超聲波的掃描周期。首先我們把TIM2設置為定時器中斷模式,代碼格式為void TIM2_Int_Init(u16 arr,u16 psc); 由于配置定時器中斷模式十分簡單,我們就不在詳細介紹,其詳細代碼見附錄4.定時器TIM2的中斷周期計算公式為T=((arr+1)*(psc+1))/Tclk。Tclk為系統(tǒng)周期,一般為72Mhz.我們在中斷服務程序中控制超聲波的發(fā)射,我們采用PC7作為觸發(fā)信號,根據(jù)超聲波時序圖,我們需要在中斷程序中給PC7一個持續(xù)10ms的高電平,中斷服務程序如下: 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ù)時間t 在本節(jié)試驗中,我們使用了通用定時器TIM5的輸入捕獲功能,輸入捕獲模式具有測量頻率或者測量脈沖的寬度的功能。我們開啟TIM5通道CH1(定時器5)的輸入捕獲模式,采集ECHO端口的高電平持續(xù)時間。配置定時器5代碼格式為: void TIM5_Cap_Init(u16 arr,u16 psc){…} 下面我們就詳細講解一下,如何開啟并使用通用定時器的輸入捕獲功能。 輸入捕獲的原理,簡單的講就是通過檢測TIM5(定時器)通道CH1的邊沿信號,當邊沿信號發(fā)生變化時,當前寄存器的值TIM1_CNT存放到通道的捕獲/比較寄存器(TIM5_CCR1)里面。我們的實驗就是采集捕獲/比較寄存器(TIM5_CCR1)中的值并進行處理,完成相應的動作。為了使TIM5通道CH1具有捕獲功能,我們需要用到TIM5_PSC、TIM5_ARR、捕獲/比較模式寄存器(TIM5_CCMR1)、捕獲/比較使能寄存器(TIM5_CCER)、捕獲/比較寄存器(TIM5_CCR1)、DMA/中斷使能寄存器(TIM5_DIER)、控制寄存器(TIM5_CR1)。我們下面就簡單介紹下下這幾個寄存器。 TIM5_PSC、TIM5_ARR、TIM5_CCR1這3個寄存器用法與前節(jié)中相同,我們就不在贅述,而在本實驗中,捕獲/比較寄存器TIM5_CCMR1非常重要,該寄存器的各位描述如下圖所示: 圖2.23 TIMx_CCMR1各位描述 我們使用的是TIM5捕獲/比較通道CH1,所以圖中只介紹[7:0]位。本次試驗我們設置CC1S[1:0]=01,IC1PSC[1:0]=00,IC1F[3:0]=0000。 接著我們再來看看捕獲/比較使能寄存器TIMx_CCER,本節(jié)用到了CC1E和CC1P兩位,描述如下圖所示: 圖2.24 TIMx_CCER最低兩位描述 所以要使能通道CH1輸入捕獲,CC1E必須設置為1,而CC1P則可以根據(jù)實際情況設置。 其次,我們再看看DMA/中斷使能寄存器(TIM5_DIER),因為我們使用的是通道CH1,所以我們僅介紹控制通道CH1的位,如下圖所示: 圖2.25 TIMx_DIER各位描述 通過此圖我們知道,我們需要設置CC1IE為1即可。 然后,我們再看看控制寄存器TIMx_CR1,我們只用到了最低位,所以我們僅介紹位0的功能,TIMx_CR1寄存器各位描述及位0功能描述如下如所示: 圖2.26 TIMx_CR1寄存器各位描述及位0功能描述 我們要使能計數(shù)器,所以位0設置為1。至此,我們所使用的寄存器一一介紹完畢,下面介紹怎么配置輸入/捕獲步驟: 開啟TIM5時鐘以及GPIOA時鐘。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 初始化TIM5,設置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); 設置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); 設置TIM5的DIER寄存器,使能捕獲和更新中斷功能。 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); 設置中斷分組并編寫中斷服務函數(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); 使能定時器 TIM_Cmd(TIM5,ENABLE ); 我們知道了如何設置TIM5的CH1為輸入捕獲模式,我們是在TIM5的中斷服務函數(shù)中采集持續(xù)時間t的,TIM5CH1_CAPTURE_STA為輸入捕獲狀態(tài),TIM5CH1_CAPTURE_VAL為輸入捕獲值,中斷服務函數(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)//高電平太長了 { TIM5CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++;}} if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件 { if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次上升沿 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 設置為上升沿捕獲 }else //還未開始,第一次捕獲上升沿 { TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設置為下降沿捕獲}}} 3、對采集的時間t進行處理,判斷前方是否有障礙 我們對采集時間t的處理也是在TIM5的中斷服務函數(shù)中的,我們根據(jù)因測量距離=(高電平持續(xù)時間t*340m/s)/2,得出只要高電平持續(xù)時間t<1500us,距離就小于25cm,就會判定前方有障礙,其詳細代碼如下: if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿 { temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=65536;//溢出時間總和 temp+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間 TIM_Cmd(TIM2, DISABLE); if(temp<1500) { stopward();t++;flag++; if(t==1) { Midstate=temp; TIM_SetCompare2(TIM3,60);//舵機右轉(zhuǎn)} if(t==2){ Leftstate=temp; TIM_SetCompare2(TIM3,250); //舵機左轉(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循跡模塊設計 這節(jié)要完成的任務是使小車沿著黑帶運動。要想使小車沿著黑帶運動,必須使小車感應到黑跡在什么地方,然后讓小車的中央處理單元驅(qū)動硬件電路完成相應的行為動作。循跡模塊的設計就是使小車能準確的識別黑帶的軌跡。小車的中央處理模塊從循跡模塊獲得數(shù)據(jù),然后中央處理模塊根據(jù)采集的數(shù)據(jù)驅(qū)動電機模塊完成相應的動作??紤]到成本和操作,本實驗使用的紅外探測器。 2.4.1 循跡模塊結構及其原理 紅外探測器(IR)是由紅外發(fā)射管、紅外接收管和部分電路組成。要做到4路循跡,需要使用4個獨立的紅外探測器器件。我們使用的IR5是一個集成模塊,這個集成模塊由5個紅外探測器組成。其中中間的1個IR探測器在本實驗中并未使用。紅外循跡模塊實物圖如圖2.27所示: 圖2.27 紅外模塊正反面 本實驗使用的IR5集成模塊是由5個相同的IR探測器電路組成的,所以我們只需要了解一個IR探測器的工作原理即可。我們知道IR探測器是由紅外發(fā)射管、紅外接收管和部分電路組成?;驹硎羌t外發(fā)射管發(fā)射紅外光經(jīng)地面反射,在黑色區(qū)域紅外光被吸收,在非黑色區(qū)域紅外光被反射,紅外接收管根據(jù)反射光的強度為比較器提供模擬量,從而輸出相應的電平量。其單個IR探測器電路原理圖如圖2.28所示: 圖2.28 IR探測器電路原理圖 根據(jù)原理圖詳解下IR探測器的工作原理:VCC為模塊提供電源,是IR探測器工作的前提條件,紅外發(fā)射管DF2發(fā)射紅外光到達“地面”,經(jīng)反射后紅外光會到達DS2紅外接收管,由于不同顏色的地面會對光的吸收有著不同的效果,所以發(fā)射后的光的強度也會不同,反射強度不同,LM339的5腳會輸入一個變化的電壓量,LM339是一個電壓較器,當LM339的“+”端輸入信號大于“-”端的比較信號后,LM339的輸出端截止,在外部的上拉電源的作用下,使IR探測器的輸出端輸出+5v的電壓。同理,在“+”端電壓小于“—”端電壓時,LM339輸出端電壓飽和使IR探測器輸出為低電壓。因此可以通過調(diào)節(jié)R2的電阻值,改變比較電壓的大小即“—”端電壓的大小,從而控制探測的距離。R4是整個正反饋電路的重要組成部分,由于“+”輸入端電壓會經(jīng)常發(fā)生在比較電壓附近擾動的現(xiàn)象,這些微小的擾動都會造成輸出端的巨大變化,因此,我們采用正反饋的方式避免這種現(xiàn)象的發(fā)生。加入R4電阻,就成為人們所說的“施密特觸發(fā)器”,其特性圖如圖2.29所示: 圖2.29 施密特觸發(fā)器特性圖 當輸入端的電壓發(fā)生轉(zhuǎn)化時,只要在比較電壓值附近的干擾不超過du之值,輸出的電壓就不會改變。R4正反饋的引入,不僅提高了電路的處理速度,而且可以免除由于寄生電路耦合而產(chǎn)生的自己震蕩。但是,在提升電路的處理速度的同時,帶來的缺點就是分辨率降低,因為只要在du附近輸出的電壓值就不會改變。 2.4.2 循跡模塊電路設計 IR5探測器的集成模塊的電路原理圖如圖2.30所示: 圖2.30 紅外循跡模塊電路圖 2.4.3 紅外循跡模塊程序設計 根據(jù)電路原理圖,我們對循跡子程序進行設計,循跡子程序流程圖如圖2.31所示: 圖2.31 循跡子程序流程圖 我們在循跡程序設計中,主要工作為: 1、配置管腳與紅外探測器的對應關系 當紅外探測器模塊在黑帶上方時,輸出為0。當紅外探測器模塊在白色上方時,輸出為1。因此我們采用中斷的方式進行循跡,因為采用的是4路循跡,所以我們需要4個管腳與其一一對應,對應關系如下表: 表2-3管腳與紅外探測器位置對應關系表 管腳名稱 紅外探測器位置 PE1 左 PE2 最左 PE3 右 PE4 最右 在配置好管腳與紅外位置關系之后,我們就需要進行中斷初始化,中斷程序上文2.1.4節(jié)中已經(jīng)講過,我們在這里就不做介紹。 2、編寫中斷服務函數(shù) 我們在中斷初始化之后,就需要寫中斷服務函數(shù)啦,我們就以PE1為例,當PE1的值發(fā)生變化時,我們就進入中斷服務函數(shù),在中斷服務函數(shù)中判斷紅外探測器是否在黑帶上方,如果在,此時我們需要使小車向左轉(zhuǎn),如果不在黑帶上方,小車就繼續(xù)前進。其- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 畢業(yè)設計 基于 stm32 智能 小車 設計
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.szxfmmzy.com/p-10664736.html