畢業設計-基于stm32的智能小車設計_第1頁
畢業設計-基于stm32的智能小車設計_第2頁
畢業設計-基于stm32的智能小車設計_第3頁
畢業設計-基于stm32的智能小車設計_第4頁
畢業設計-基于stm32的智能小車設計_第5頁
已閱讀5頁,還剩59頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

畢業設計-基于stm32的智能小車設計基于stm32的智能小車設計-1-摘要本次試驗主要分析了基于STM32F103微處理器的智能小車控制系統的系統設計過程。此智能系統的組成主要包括STM32F103控制器、電機驅動電路、紅外探測電路、超聲波避障電路。本次試驗采用STM32F103微處理器為核心芯片,利用PWM技術對速度以及舵機轉向進行控制,循跡模塊進行黑白檢測,避障模塊進行障礙物檢測并避障功能,其他外圍擴展電路實現系統整體功能。小車在運動時,避障程序優先于循跡程序,用超聲波避障電路進行測距并避障,在超聲波模塊下我們使用舵機來控制超聲波的發射方向,用紅外探測電路實現小車循跡功能。在硬件設計的基礎上提出了實現電機控制功能、智能小車簡單循跡和避障功能的軟件設計方案,并在STM32集成開發環境Keil下編寫了相應的控制程序,并使用mcuisp軟件進行程序下載。關鍵詞:stm32;紅外探測;超聲波避障;PWM;電機控制

AbstractThisexperimentmainlyanalyzesthecontrolsystemofsmartcarbasedonmicroprocessorSTM32F103systemdesignprocess.ThecompositionoftheintelligentsystemmainlyincludingSTM32F103controller,motordrivecircuit,infrareddetectioncircuit,circuitofultrasonicobstacleavoidance.ThisexperimentadoptsSTM32F103microprocessorasthecorechip,usingPWMtechniquetocontrolspeedandsteeringgearsteering,trackingmoduleisusedtodetecttheblackandwhite,obstacleavoidancemoduleforobstacledetectionandobstacleavoidancefunction,otherperipheralextendedcircuittorealizethewholesystemfunction.Whenthecarismoving,obstacleavoidanceprogrampriortotracking,usingultrasonicrangingandobstacleavoidanceobstacleavoidancecircuit,weusesteeringgearunderultrasonicmoduletocontroltheemissiondirectionofultrasonic,infrareddetectioncircuitisusedtoimplementthecartrackingfunction.Onthebasisofthehardwaredesignisproposedformotorcontrolfunction,simpleintelligentcartrackingandobstacleavoidancefunctionofsoftwaredesign,andintheSTM32integrateddevelopmentenvironmentundertheKeil.Writethecorrespondingcontrolprogram,anduseMcUispprogramdownloadsoftware.Keywords:STM32;Infrareddetection;Ultrasonicobstacleavoidance;PWM;Motorcontrol圖2.1系統框架圖我們本節主要任務是了解各個模塊的功能,掌握各個模塊所使用的器件的使用方法,并能夠編寫相應的程序代碼。掌握各個模塊的功能。2.1中央處理模塊在人類身體結構中,大腦可以根據各個器官所傳輸的信息做出相應的行為動作用以保證人體所必須的生理原料,而stm32處理器之于智能小車就相當于大腦之于人類,它可以從各個模塊之間獲得數據,并對所傳輸的數據進行實時處理,來驅使電機模塊做出相應的行為動作。由ARM公司設計的基于ARMv7架構的Cortex系列的標準體系結構在2006年推出,此結構是用來滿足日漸復雜的不同性能要求的軟件設計,根據所面向的領域,Cortex系列可以分為A、R、M三個分工明確的系列[1]。Stm32處理器的出現為微控制系統、工業控制系統、汽車車身系統和無線網絡等對功耗和成本敏感的嵌入式應用領域實現高系統性能系統提供了基礎,使編程的復雜性,集高性能、低功耗、低成本大大簡化,并使它們融為于一體[2]。意法半導體ST公司作為一個半導體制造廠商,是ARM公司Cortex-M3內核開發項目一個主要合作方。2007年6月11日由ST公司率先推出的基于Cortex-M3內核的STM32系列微控處理器研發而出。此中,A系列是面向復雜的尖端應用程序,用于運行開放式的復雜操作系統;R是Real的首字母縮寫,是面向實時系統開發的;M是Mirco的首字母縮寫,專門面向低成本的微控制領域開發研究。因此,Cortex-M3處理器是由ARM公司設計的首款基于ARMv7-M體系結構的32位標準處理器,它不僅具有低功耗、少門數等優點,而且還具有短中斷延遲、低調試成本等眾多優點,使它在眾多的處理器中脫穎而出。目前為止,STM32系列處理器暫分為2個系列。其中,STM32F101系列是標準型系列,工作頻率設定在36MHZ;STM32F103系列是增強型系列,工作頻率設定在72MHZ,其帶有更多片內RAM和更豐富的外設資源。這兩個系列的產品在軟件和引腳封裝方面具有兼容性,并且擁有相同的片內Flash資源,使軟件的開發和升級更加方便。本次試驗,我們使用的是stm32f103處理器。2.1.1stm32f103內部結構STM32F103系列微處理器是首款基于ARMv7-M體系結構的32位標準RISC(精簡指令集)處理器,具有執行代碼效率高,外設資源豐富等眾多優點。該系列微處理器工作頻率設定在72MHz,高達128K字節的內置Flash存儲器和20K字節的SRAM,方便程序編寫,而且具有豐富的通用I/O端口。其內部結構圖如圖2.2所示:圖2.2內部結構圖Stm32處理器主系統主要由4個被動單元和4個驅動單元構成。4個驅動單元是:通用DMA1,通用DMA2,內核DCode總線和系統總線。4個被動單元由APB橋,APB設備,內部Flash閃存,內部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.2stm32最小系統電路設計Stm32的最小系統電路主要由系統時鐘電路、實時時鐘電路、JTAG調試接口電路,復位電路和啟動模式選擇電路組成。最小系統電路原理圖如圖2-1-3所示:圖2.3最小系統電路原理圖主要電路原理圖的設計及功能如下所示:1.系統時鐘電路系統時鐘電路主要作用是提供節拍,就相當于人類的心臟跳動,隨著心臟的跳動,血液就會到達全身部位,所以系統時鐘的重要性就不言而喻啦。系統時鐘的電路設計如圖2.4所示:圖2.4系統時鐘電路圖在時鐘電路中,我們選用8M的晶振。2.復位電路復位電路的設計如圖2.5所示:圖2.5復位電路圖本次試驗所采用的開發板為低電平復位。如圖所示,當按鍵懸空時RST輸入為高電平,當按鍵按下時,RST腳輸入為低電平,從而電路復位。3.JTAG電路JTAG電路原理圖如圖2.6所示:圖2.6JAG電路原理圖JTAG的主要功能是使目標文件燒到核處理器中。4.啟動模式電路啟動模式電路原理圖如圖2.7所示:圖2.7啟動模式電路原理圖通過設置BOOT[1:0]引腳可以選擇三種不同啟動模式,啟動模式如表2-1所示:表2-1啟動模式表啟動模式選擇引腳啟動模式說明BOOT1BOOT0X0主閃存存儲器主閃存存儲器被選為啟動區域01系統存儲器系統存儲器被選為啟動區域11內置SRAM內置SRAM被選為啟動區域2.1.3stm32軟件設計的基本思路在對其他模塊設計之前,我們必須了解stm32的編程規則。任何處理器,包括stm32處理器,想要處理器完成某項相應的動作,就必須對處理器的寄存器進行操作。比如,我們在單片機C51中,同樣,我們在stmM32的開發中過程中,我們同樣可以對寄存器直接操作:GPIOx->BRR=0x0011。(x可以是A,B,C,D,E…比如GPIOA就是端口A)但是,對于stm32這種級別的處理器,幾百個寄存器記起來談何容易。所以,ST(意法半導體)提出了固件庫的概念,利用固件庫進行編程。固件庫的本質就是函數的集合,固件庫將那些寄存器的底層操作都封裝起來,提供一整套API供開發者使用。比如,上面通過控制BRR寄存器來控制電平的變化,官方庫封裝了一個函數:VoidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){GPIOx->BRR=GPIO_Pin;}(x可以是A,B,C,D,E…比如GPIO_A就是端口A)通過使用GPIO_ResetBits()函數就可以直接對寄存器進行操作啦。2.1.4stm32中斷介紹本方案中,我們要使用stm32的中斷,在程序設計中,我們要開啟各個管道的中斷,打開各個中斷通道,配置中斷方式,我們先來講述下stm32單片機的中斷機制。結構圖如下所示:圖2.32stm32外部中斷/事件控制器結構圖圖中的實線箭頭,為外部中斷信號的傳輸路徑。首先外部信號從編號為1的輸入線進入。其次這個外部信號通過編號2的邊沿檢測電路,這個邊沿檢測電路受到“上升沿選擇寄存器”、“下降沿選擇寄存器”的控制,我們可以控制這兩個寄存器來選擇中斷的觸發方式。我們可以在程序中進行設置,比如所有段落設置為首行縮進2個字符EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;設置為上升沿觸發中斷所有段落設置為首行縮進2個字符然后該外部信號進入編號為3或門,或門另一端是軟件中斷寄存器,如果,軟件中斷/事件寄存器的對應位置1,編號3的輸出總是為有效信號1。之后進入“中斷掛起請求寄存器”,該寄存器記錄了外部信號的電平變化。最后經過編號為4的與門進入NVIC中斷控制器,如果“中斷屏蔽寄存器”的對應位置0,外部的中斷請求信號不能傳輸到NVIC中斷控制器,從而實現中斷的屏蔽。由于我們采用的是外部信號觸發中斷,所以我們只需了解外部中斷的請求機制,對于事件的中斷請求機制,我們在這里不做介紹。我們以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);初始化線上中斷,設置觸發條件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);編寫中斷服務函數voidEXTI1_IRQHandler(void){}主要代碼詳見附錄stm32定時/計數器介紹Stm32系列的單片機一般包含8個計數/定時器,TIM1、TIM8分別為高級控制定時器,TIM2~TIM5為通用定時器,TIM6以及TIM7為基本定時器。對于定時器的詳細內容,我們不在這里一一介紹。然后我們介紹一下本實驗采用了那些定時器,以及這些定時器所要完成的功能有哪些。本實驗所采用的定時器以及功能如下表所示:表2-2定時器介紹表定時器名稱定時器配置模式主要功能TIM2定時器中斷模式通過定時器中斷,控制超聲波的掃描周期TIM3PWM復用輸出模式控制小車速度及舵機轉向TIM5輸入捕獲模式采集超聲波發射到接受的高電平持續時間t2.1.6主程序設計流程圖在本節實驗中,循跡模塊以及避障模塊都是采用中斷方式進行工作的,因此其主程序流程圖如下圖所示:圖1.2主程序流程圖根據程序設計圖,主程序設計如下:intmain(void){ u8TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態 u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值delay_init(); //延時函數初始化 NVIC_Configuration();//設置NVIC中斷分組2:2位搶占優先級,2位響應優先級 LED_Init(); GPIO_Configuration();//端口初始化 EXTIX_Init(); //掃描軌跡 TIM2_Int_Init(4999,7199);//控制超聲波掃描周期TIM3_PWM_Init(1999,719);//控制舵機方向 TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計數 while(1) {farward_Low();delay_ms(10);}}2.2電機驅動模塊Stm32對小車的控制,就是對電機的控制,通過控制電機的轉向,小車的運動狀態就會發生改變。電機驅動模塊的主要器件為LM293N,我們下面就詳細講解下電機驅動模塊。2.2.1驅動模塊結構及其原理電機驅動模塊的實物圖如圖2.8所示:圖2.8驅動電路實物圖電機驅動模塊的主要器件是芯片LM293D,內部原理圖如圖2.9所示:K4K2K1K3S4K4K2K1K3S4圖2.9電機驅動內部原理圖全橋式驅動電路的4只開關管都工作在斬波狀態,如圖1.2所示,K1、K2為一組,K3、K4為另一組,兩組的狀態互補,一組導通則另一組必定關斷。當K1、K2導通時,K3、K4關斷,電機兩端加正向電壓,電機實現正轉或反轉制動;當K3、K4導通時,K1、K2關斷,電機兩端為反向電壓,電機實現反轉或正轉制動。2.2.2驅動模塊電路設計電機驅動模塊的電路原理如圖2.10所示:圖2.10驅動模塊電路原理圖表2-2是各個端口狀態與運動方向的關系,其關系如下表所示:表2-2端口與運動方向關系表電機M1IN1IN2電機M2IN3IN4停止00停止00正轉10正轉10反轉01反轉01-11-112.2.3驅動軟件程序設計車輪電機的動作由GPIO口的輸出實現,本節主要配置運動方向和運動速度,對于運動速度的控制,我們必須使用PWM,通過改變PWM的占空比來調節速度的大小,其主要代碼設計如下所示:voidTIM3_PWM_Init(u16arr,u16psc){….}要想使stm32的通用定時器TIMx產生PWM輸出,需要用到的寄存器有:預分頻寄存器(TIMx_PSC)、自動重裝載寄存器(TIMx_ARR)、捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。我們先介紹這幾個寄存器,然后介紹如何使用庫函數產生PWM輸出。下面我們就簡單介紹下這些寄存器:首先是預分頻寄存器(TIMx_PSC),該寄存器可以用設置對時鐘進行分頻,然后在提供給計數器作為計數器的時鐘。該寄存器的各位功能如圖所示:圖2.11TIMx_PSC寄存器各位描述接下來介紹自動重裝載寄存器(TIMx_ARR),該寄存器的各位描述如下圖所示:圖2.12TIMx_ARR寄存器各位描述通過設置這兩個寄存器,我們就可以算出PWM的輸出周期,計算公式為:Tout=((arr+1)*(psc+1))/Tclk。其中Tclk為系統時鐘周期。其次我們介紹捕獲/比較模式寄存器(TIMx_CCMR1/2),總共有兩個,TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1控制通道CH1和CH2,TIMx_CCMR2控制CH3和CH4。因為這2個寄存器差不多,我們僅以通道CH1為例,介紹其中的TIMx_CCMR1為例,該寄存器的各位描述如下圖所示:圖2.13TIMx_CCMR1/2寄存器各位描述這里我們只介紹該寄存器的OCxM位,我們就以TIMx_CCMR1中的OC1M(控制通道CH1)為例,該位功能如下圖所示:圖2.14OC1M功能描述我們使用的是PWM輸出模式,所以OC1M必須設置為110/111。OC2M(控制通道CH2)各位描述與OC1M相同,我們這要不在敘述。然后我們介紹捕獲/比較使能寄存器(TIMx_CCER),該寄存器控制著各個輸入/輸出通道的開關,對于該寄存器,各位描述如下圖所示:圖2.15TIMx_CCER寄存器描述該寄存器比較簡單,因為我們只介紹通道1,所以我們只講CC1E位。如果我們想使能輸入/捕獲1,我們只需使用CC1E位。要想使PWM從I/O口輸出,此位必須設置為1。最后介紹捕獲/比較寄存器(TIMx_CCR1~4),總共有4個,分別對應CH1~4,因為這4個寄存器相似,我們僅以TIMx_CCR1為例,該寄存器的給位介紹如下圖所示:圖2.16TIMx_CCR1寄存器各位描述在輸出模式下,該寄存器的值與CNT中的值進行比較,根據結果,實現電平的翻轉。至此,我們把用到的幾個寄存器都介紹完畢,下面我們就介紹如何通過庫函數來配置實現PWM三路輸出。開啟TIM3時鐘以及復用功能輸出。使能GPIO和端口復用功能時鐘。庫函數使能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的輸出周期。調用的格式如下: 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輸出。在庫函數中PWM通道設置是通過TIM_OC1Init~TIM_OC4Init來設置的,這里我們需要3路PWM輸出,所以我們需要使用函數TIM_OC1Init、TIM_OC2Init、TIM_OC3Init。庫函數的調用格式如下: 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。庫函數調用格式如下: TIM_Cmd(TIM3,ENABLE);通過修改TIM3_CCRx(x為1,2,3)來控制占空比。庫函數格式如下:VoidTIM_SetComparex(TIM3,uint16_tCompare2);我們可以知道,通過定時器3控制PWM波的占空比,從而實現速度方面的控制。其中arr和psc可以控制PWM波的周期,TIM3_CCRx可以控制PWM波的占空比。我們只需要調用此函數就可以實現不同的速度控制。對于運動方向控制的代碼我們就以后退為例,由于端口寄存器過于簡單,我們不在此介紹端口的寄存器。我們僅介紹如何通過庫函數進行端口配置。對各個I/O端口配置的過程相似,我們僅以PD8為例:主要過程如下所示:使能I/O口時鐘,調用格式如下所示:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);初始化I/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置1GPIO_ResetBits(GPIOD,GPIO_Pin_8);PD8置0我們知道了如何對端口進行操作之后就可以隨意的控制小車的運動啦,運動方向的程序設計,其基本函數單元如下所示:voidLeft_Low(void);…我們調用這些函數,就可以實現不同運動方向的控制。主要代碼詳見附錄3.2.3避障模塊設計在人類身體構造系統中,眼睛可以使我們非常方便的采集到外界環境的信息,然后把信息及時的傳輸到大腦,并對外界環境信息的變化做出相應的處理。而對智能小車來說,避障模塊之于小車就相當于眼睛之于人類。避障模塊可以采集外部地形數據,然后把所采集的地形數據傳輸到中央處理模塊,從而實現躲避障礙的功能。避障模塊所采用的器件在市場中有許多類型,比如紅外檢測,光位移檢測,超聲波檢測等。本次試驗我們使用的是HC-SR04超聲波檢測,超聲波由于具有檢測能力強,傳播路徑寬,因此我們決定使用HC-SR04器件。在使用HC-SR04模塊進行超聲波測距的同時,我們可以使用舵機進行輔助。舵機的主要作用是改變HC-SR04模塊的照射方向,從而控制超聲波的發射方向。在程序編寫過程中,如果小車前方遇見障礙時,我們可以直接控制舵機的轉向,而小車的車身可以保持不變,在測量結束后,小車再做相應的動作。2.3.1避障模塊器件結構及其原理HC-SR04超聲波測距模塊測量范圍在2cm-400cm之間,可以實現無接觸式測距功能。HC-SR04超聲波測距模塊由一個超聲波發射器、一個超聲波接收器和控制電路組成,避障模塊的實物結構圖如圖2.17所示:圖2.17實物正反面結構圖如結構圖所示VCC提供5v電源,GND為接地線,TRIG為觸發信號線,ECHO為回向信號輸出線。基本原理如下:采用IO口TRIG觸發測距,給至少10us的高電平信號,在TRIG觸發沿到來后,超聲波發射器會自動發出8個40KHz的方波,并且檢測是否有信號返回,當超聲波接收器接收到超聲波時,表明有信號返回,通過IO口ECHO輸出一高電平,高電平持續的時間就是超聲波從發射到返回的時間。因此測量距離=(高電平持續時間*340m/s)/2。測量時序圖如圖2.18所示:圖2.18超聲波時序圖我們根據時序圖,可以編寫相應的程序代碼。為了防止發射信號對回向信號的影響,我們的測量周期不易過小。并且由于HC-SR04的感應角度不大于15°,所以測距時,為了防止發射信號丟失,我們要求被測物體的面積不應小于0.5平方米,否則可能導致測量結果不準確。舵機在避障模塊的主要作用前面已經提到,本節主要講解舵機的工作特性。舵機的實物圖如圖2.19所示:圖2.19舵機實物圖舵機的工作工作原理是stm32微處理器發出數據給舵機,舵機內部有一個基準電路,它會產生周期為20ms,寬度為1.5ms的基準信號,它將微處理器傳輸的直流偏置電壓與電位器的電壓數據進行比較,獲得電壓差輸出。經由電路板上的IC

判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回反饋信號。舵機的轉動角度與stm32所提供的PWM信號相關。標準信號PWM周期為20ms,理論上來講脈寬為1~2ms,實際我們的脈寬為0.5~2.5ms,脈寬與所轉的角度一一對應。角度與脈寬的對應圖如圖2.20所示:圖2.20舵機角度與脈寬對應圖2.3.2HC-SR04模塊硬件電路設計超聲波模塊硬件原理圖如下圖所示:圖2.21超聲波硬件原理圖HC-SR04模塊主要由發射器、接收器和部分電路組成。在此試驗中,我們只需簡單了解電路的設計,對于其基本原理可以不用過多涉獵,我們只需明白它們的工作原理,并且能夠簡單運用即可。2.3.3HC-SR04模塊程序設計根據硬件電路的設計,我們對避障子程序進行設計,程序流程圖如圖2.22所示:圖2.22避障程序流程圖避障模塊在程序設計中,我們的工作主要是:1、控制超聲波的掃描周期2、采集超聲波發射到接受的高電平持續時間t3、對采集的高電平持續時間t進行處理,判斷前方是否有障礙下面我們就詳細介紹我們是怎么通過軟件設計來完成這幾個步驟的:1、控制超聲波的掃描周期根據表2-2,我們采用的是TIM2來控制超聲波的掃描周期。首先我們把TIM2設置為定時器中斷模式,代碼格式為voidTIM2_Int_Init(u16arr,u16psc);由于配置定時器中斷模式十分簡單,我們就不在詳細介紹,其詳細代碼見附錄4.定時器TIM2的中斷周期計算公式為T=((arr+1)*(psc+1))/Tclk。Tclk為系統周期,一般為72Mhz.我們在中斷服務程序中控制超聲波的發射,我們采用PC7作為觸發信號,根據超聲波時序圖,我們需要在中斷程序中給PC7一個持續10ms的高電平,中斷服務程序如下:voidTIM2_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、采集超聲波發射到接受的持續時間t在本節試驗中,我們使用了通用定時器TIM5的輸入捕獲功能,輸入捕獲模式具有測量頻率或者測量脈沖的寬度的功能。我們開啟TIM5通道CH1(定時器5)的輸入捕獲模式,采集ECHO端口的高電平持續時間。配置定時器5代碼格式為:voidTIM5_Cap_Init(u16arr,u16psc){…}下面我們就詳細講解一下,如何開啟并使用通用定時器的輸入捕獲功能。輸入捕獲的原理,簡單的講就是通過檢測TIM5(定時器)通道CH1的邊沿信號,當邊沿信號發生變化時,當前寄存器的值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個寄存器用法與前節中相同,我們就不在贅述,而在本實驗中,捕獲/比較寄存器TIM5_CCMR1非常重要,該寄存器的各位描述如下圖所示:圖2.23TIMx_CCMR1各位描述我們使用的是TIM5捕獲/比較通道CH1,所以圖中只介紹[7:0]位。本次試驗我們設置CC1S[1:0]=01,IC1PSC[1:0]=00,IC1F[3:0]=0000。接著我們再來看看捕獲/比較使能寄存器TIMx_CCER,本節用到了CC1E和CC1P兩位,描述如下圖所示:圖2.24TIMx_CCER最低兩位描述所以要使能通道CH1輸入捕獲,CC1E必須設置為1,而CC1P則可以根據實際情況設置。其次,我們再看看DMA/中斷使能寄存器(TIM5_DIER),因為我們使用的是通道CH1,所以我們僅介紹控制通道CH1的位,如下圖所示:圖2.25TIMx_DIER各位描述通過此圖我們知道,我們需要設置CC1IE為1即可。然后,我們再看看控制寄存器TIMx_CR1,我們只用到了最低位,所以我們僅介紹位0的功能,TIMx_CR1寄存器各位描述及位0功能描述如下如所示:圖2.26TIMx_CR1寄存器各位描述及位0功能描述我們要使能計數器,所以位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的輸入比較參數,開啟捕獲模式。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=0000TIM_ICInit(TIM5,&TIM5_ICInitStructure);設置TIM5的DIER寄存器,使能捕獲和更新中斷功能。TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);設置中斷分組并編寫中斷服務函數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的中斷服務函數中采集持續時間t的,TIM5CH1_CAPTURE_STA為輸入捕獲狀態,TIM5CH1_CAPTURE_VAL為輸入捕獲值,中斷服務函數如下所示:if((TIM5CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲 { if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET) { if(TIM5CH1_CAPTURE_STA&0X40)//已經捕獲到高電平了 {if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了 {TIM5CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }elseTIM5CH1_CAPTURE_STA++;}} if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)//捕獲1發生捕獲事件 {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的中斷服務函數中的,我們根據因測量距離=(高電平持續時間t*340m/s)/2,得出只要高電平持續時間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);//舵機右轉} if(t==2){Leftstate=temp; TIM_SetCompare2(TIM3,250); //舵機左轉 } 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循跡模塊設計這節要完成的任務是使小車沿著黑帶運動。要想使小車沿著黑帶運動,必須使小車感應到黑跡在什么地方,然后讓小車的中央處理單元驅動硬件電路完成相應的行為動作。循跡模塊的設計就是使小車能準確的識別黑帶的軌跡。小車的中央處理模塊從循跡模塊獲得數據,然后中央處理模塊根據采集的數據驅動電機模塊完成相應的動作。考慮到成本和操作,本實驗使用的紅外探測器。2.4.1循跡模塊結構及其原理紅外探測器(IR)是由紅外發射管、紅外接收管和部分電路組成。要做到4路循跡,需要使用4個獨立的紅外探測器器件。我們使用的IR5是一個集成模塊,這個集成模塊由5個紅外探測器組成。其中中間的1個IR探測器在本實驗中并未使用。紅外循跡模塊實物圖如圖2.27所示:圖2.27紅外模塊正反面本實驗使用的IR5集成模塊是由5個相同的IR探測器電路組成的,所以我們只需要了解一個IR探測器的工作原理即可。我們知道IR探測器是由紅外發射管、紅外接收管和部分電路組成。基本原理是紅外發射管發射紅外光經地面反射,在黑色區域紅外光被吸收,在非黑色區域紅外光被反射,紅外接收管根據反射光的強度為比較器提供模擬量,從而輸出相應的電平量。其單個IR探測器電路原理圖如圖2.28所示:圖2.28IR探測器電路原理圖根據原理圖詳解下IR探測器的工作原理:VCC為模塊提供電源,是IR探測器工作的前提條件,紅外發射管DF2發射紅外光到達“地面”,經反射后紅外光會到達DS2紅外接收管,由于不同顏色的地面會對光的吸收有著不同的效果,所以發射后的光的強度也會不同,反射強度不同,LM339的5腳會輸入一個變化的電壓量,LM339是一個電壓較器,當LM339的“+”端輸入信號大于“-”端的比較信號后,LM339的輸出端截止,在外部的上拉電源的作用下,使IR探測器的輸出端輸出+5v的電壓。同理,在“+”端電壓小于“—”端電壓時,LM339輸出端電壓飽和使IR探測器輸出為低電壓。因此可以通過調節R2的電阻值,改變比較電壓的大小即“—”端電壓的大小,從而控制探測的距離。R4是整個正反饋電路的重要組成部分,由于“+”輸入端電壓會經常發生在比較電壓附近擾動的現象,這些微小的擾動都會造成輸出端的巨大變化,因此,我們采用正反饋的方式避免這種現象的發生。加入R4電阻,就成為人們所說的“施密特觸發器”,其特性圖如圖2.29所示:圖2.29施密特觸發器特性圖當輸入端的電壓發生轉化時,只要在比較電壓值附近的干擾不超過du之值,輸出的電壓就不會改變。R4正反饋的引入,不僅提高了電路的處理速度,而且可以免除由于寄生電路耦合而產生的自己震蕩。但是,在提升電路的處理速度的同時,帶來的缺點就是分辨率降低,因為只要在du附近輸出的電壓值就不會改變。2.4.2循跡模塊電路設計IR5探測器的集成模塊的電路原理圖如圖2.30所示:圖2.30紅外循跡模塊電路圖2.4.3紅外循跡模塊程序設計根據電路原理圖,我們對循跡子程序進行設計,循跡子程序流程圖如圖2.31所示:圖2.31循跡子程序流程圖我們在循跡程序設計中,主要工作為:1、配置管腳與紅外探測器的對應關系當紅外探測器模塊在黑帶上方時,輸出為0。當紅外探測器模塊在白色上方時,輸出為1。因此我們采用中斷的方式進行循跡,因為采用的是4路循跡,所以我們需要4個管腳與其一一對應,對應關系如下表:表2-3管腳與紅外探測器位置對應關系表管腳名稱紅外探測器位置PE1左PE2最左PE3右PE4最右在配置好管腳與紅外位置關系之后,我們就需要進行中斷初始化,中斷程序上文2.1.4節中已經講過,我們在這里就不做介紹。2、編寫中斷服務函數我們在中斷初始化之后,就需要寫中斷服務函數啦,我們就以PE1為例,當PE1的值發生變化時,我們就進入中斷服務函數,在中斷服務函數中判斷紅外探測器是否在黑帶上方,如果在,此時我們需要使小車向左轉,如果不在黑帶上方,小車就繼續前進。其中斷服務函數代碼如下:#defineKEY3GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)voidEXTI1_IRQHandler(void){if(KEY3==0) {Right_Low();} EXTI_ClearITPendingBit(EXTI_Line1);}//清除LINE2上的中斷標志位3.軟件調試每一章單獨分頁每一章單獨分頁上文提到了各個模塊的電路設計及其程序設計,本章就根據各個模塊的電路設計進行相應的編程。我們使用keil3軟件進行程序仿真,然后使用mcuscip軟件把我們得到的目標文件燒到處理器中,即程序下載。3.1程序仿真RVMDK源自德國的KEIL公司,是RealViewMDK的簡稱。支持ARM7,ARM9,和最新的Cortrx-M3核處理器,自動配置啟動代碼,具有強大的軟件仿真功能,而且具有啟動代碼小,性能高的優點,軟件keil3的操作主界面如圖3.1所示:圖3.1Keil主界面在程序仿真中,我們只能觀察PC7腳位的電平變化,來判斷是否滿足超聲波的發射條件,而對于超聲波發射到接受的高電平持續時間t,我們在程序仿真中是無法觀測到的。因此我們只能通過對硬件進行測試,來完成對整個產品設計的考核。PC7的軟件仿真結果如下圖所示:圖3.2PC7腳電平仿真圖3.2程序下載串口下載軟件使用mcuisp,該軟件屬于第三方軟件,由單片機在線編程網提供,該軟件啟動界面如圖3.2所示:圖3.2mcuisp啟動界面我們使用mcuisp軟件進行程序下載,程序下載圖如下所示:圖3.3mcuisp程序下載圖4.系統測試在程序調試中,我們知道PC7的電平變化已經滿足了超聲波的發射條件,我們本節就是對硬件進行測試,驗證本次方案是否成功。小車實物圖如下所示圖4.1智能小車實物圖當小車前方遇到障礙時,小車舵機左轉,觀測左側是否有障礙物,測試圖如下:圖4.2智能小車檢測障礙圖小車檢測到前方有障礙時,舵機左轉,檢測小車左方是否有障礙,如果無,則小車左轉,測試圖如下圖所示:圖4.3智能小車避障圖循跡模塊采用的是中斷的方式工作的,stm32微處理器通過采集紅外探測器的數據,對電機發出不同的命令,下圖為智能小車在循跡過程中所拍攝的畫面:5.總結本文根據畢業設計開題報告書所布置的任務,制定了詳細的設計方案,并按照此方案逐步完成了電路原理圖的設計以及軟件程序的設計。本文的重點是基于stm32微處理器為核心,添加其他外圍電路為輔助,并且加載必要的程序設計,使小車智能化行動。整個智能小車系統以stm32微處理器為核心,外圍電路包括避障電路、循跡電路、電機驅動電路等,這些外圍電路通過stm32微處理器結合起來,使得各個模塊在保證工作準確性的同時,提高了小車的智能化。論文首先分析了研究智能小車的研究意義,對于此次研究的必要性進行了可行性分析。然后分析了國內外的研究概況,最后再此基礎上提出了設計思路與程序流程,對于設計思路進行了可行性的分析。接著分別介紹了各個模塊的硬件設計方案以及軟件設計方案。在硬件設計方案中包括對各個硬件電路所采用的器件進行分析和對硬件電路的設計分析,從而決定器件的使用方案,以及硬件電路圖的設計。而在軟件設計方案中,我們只分析軟流程件設計,以確定對應的程序編碼。最后我們對軟件、硬件進行測試,對于軟件測試,我們使用keil軟件進行程序仿真,而對于硬件測試,我們使用mcuisp硬件調試工具進行程序下載,驗證了系統的穩定性和實用性。在本方案中,由于受到所采購的硬件模塊尺寸的影響,循跡模塊在進行工作的時候,受到外部影響的因素很大。在本次試驗設計中,由于循跡探頭的安裝距離小車車輪很近,當循跡探頭采集數據傳輸到CPU時,小車已經向前行駛了一段時間。假設小車的轉彎時間為T,小車的轉彎時的速度為V,我們要保證小車轉彎的路程不超過額定值S,那么就有公式VT<=S。要解決此問題,有兩種方案可供選擇。減小轉彎時間T小車的轉彎時間T與小車的轉彎靈敏度成反比。在保證小車速度適當的情況下,我們只有減少小車的轉彎時間來完成相應的行為動作,即提高小車的轉彎靈敏度。小車的轉彎靈敏度與小車的車輪直徑有關,具體來講就是:在車輪角速度一定的情況下,車輪直徑越大,有公式V=ωR,車輪的線速度就越大,那么在單位時間內有,小車的行駛距離就會變大。所以,小車的車輪直徑與轉彎靈敏度成反比,車輪直徑越大,靈敏度就越小,相反車輪直徑越小,靈敏度就越高。在本次試驗中我們采用的車輪直徑稍大,從而導致小車轉彎的靈敏度大大下降。因此,我們可以通過減少小車車輪的直徑大小來解決此問題。增加轉彎額定值S在本次試驗中,循跡探頭距小車的車輪距離太近,導致小車的額定值S過小,進而導致小車在循跡工作時誤差較大。解決此問題,我們可以拉大車輪與循跡探頭的距離。上文提到的兩種方法,又受到所采購的器件的物理尺寸的影響。在本次試驗中,器件的物理尺寸限制了小車轉彎靈敏度的最大值,所以本實驗的循跡模塊不是很理想,但是只要我們采用上述的兩種方法,一定可以提高循跡模塊的執行效率。總的來說,設計方案是完善的,基本上達到了設計所要求的目標。致謝一個學期的學習和鍛煉,使我的畢業論文設計基本完成。在這期間,我在所學的基礎知識之上,去接觸stm32,在接觸之初,我不斷的遇到問題,而我也知道不經一番寒徹骨,哪的梅香撲鼻來的道理,最終我克服了種種困難,不僅使自己的知識更加牢固,而且也鍛煉了自己的心性。當然以上所有成績的取得都離不開老師和同學的幫助。我首先要感謝的是我的母校,它為我提供了一個良好的學習環境,非常感謝學院領導對我們畢業設計相關工作精心合理的安排。當然,我的指導老師張健,我非常感謝他在我畢業設計的整個過程中始終予以的熱情指導和督促,對我提出的疑惑耐心地指點,他的指點是我克服困難、完成設計的重要因素,對我一個月的實習也產生了鼓勵和支持的作用。同時我還要感謝湯飛同學、柳曉峰同學的真誠指點,以及其他各位老師和同學的不吝指教,使我度過了緊張而又充實的三個月。畢業設計的這三個月,我不僅收獲了知識、能力,也深刻的體會到了師情和友情的珍貴,這段時光將成為我人生中少有的美好回憶,路漫漫其修遠兮,吾將上下而求索,我會以此激勵自己繼續努力,爭取使自己的人生對社會產生些許積極的價值!參考文獻[1]杜春雷.ARM體系結構與編程[M].北京:清華大學出版社,2003-02-01[2]姚文詳,宋巖.ARMCortex-M3權威指南[M].北京:北京航空航天大學出版社,2009-07[3]范書瑞.Cortex-M3嵌入式處理器原理與應用[M].北京:電子工業出版社,2011-01-01[4]李寧.基于MDK的STM32處理器開發應用[M].北京:北京航空航天大學出版社,2008:1-260.[5]劉軍,張洋.原子教你玩STM32[M].北京:北京航空航天大學出版社,2013-05-01[6]彭剛,秦志強.基于ARMCortex-M3的STM32系列[M].北京:電子工業出版社,2011-01[7]張自強,晏英俊.基于stm32的步進電機轉速控制實驗設計[J].實驗室科學,2010-12,13(6):59-61[8]周柱,孟文,田環宇.基于stm32智能小車設計[J].技術與市場,2011-06,18(6):1-2[9]李亞巨,樊東.基于stm32f103zet6的智能小車的制作[J].電子制作,2013-11,(19):52-53[10]趙志昊.智能小車的制作[J].科技傳播,2011-11,(21):202-203[11]李婕.基于STM32的智能小車的制無線視頻監控智能小車設計[D].蘭州:蘭州理工大學出版社,2014-4:1-56附錄附錄1voidTIM5_Cap_Init(u16arr,u16psc){ GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //使能TIM5時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA時鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA0清除之前設置 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0輸入 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0下拉 //初始化定時器5TIM5 TIM_TimeBaseStructure.TIM_Period=arr;//設定計數器自動重裝值 TIM_TimeBaseStructure.TIM_Prescaler=psc; //預分頻器 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上計數模式 TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位 //初始化TIM5輸入捕獲參數 TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1;//CC1S=01 選擇輸入端IC1映射到TI1上 TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿捕獲 TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上 TIM5_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配置輸入分頻,不分頻 TIM5_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置輸入濾波器不濾波 TIM_ICInit(TIM5,&TIM5_ICInitStructure); //中斷分組初始化 NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//TIM5中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占優先級2級 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//從優先級0級 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能 NVIC_Init(&NVIC_InitStructure);//根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器 TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷,允許CC1IE捕獲中斷 TIM_Cmd(TIM5,ENABLE); //使能定時器5}附錄2voidEXTIX_Init(void){ EXTI_InitTypeDefEXTI_InitStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); //使能復用功能時鐘//GPIOD.2中斷線以及中斷初始化配置下降沿觸發 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line1; //左1 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); EXTI_InitStructure.EXTI_Line=EXTI_Line2; //最左 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器//GPIOD.3 中斷線以及中斷初始化配置下降沿觸發//右 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); EXTI_InitStructure.EXTI_Line=EXTI_Line3; EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器//GPIOD.4 中斷線以及中斷初始化配置下降沿觸發 //最右 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4); EXTI_InitStructure.EXTI_Line=EXTI_Line4; EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; //使能左1所在的外部中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //搶占優先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x06; //子優先級3 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; //使能最左所在的外部中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //搶占優先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x04; //子優先級2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; //使能右1所在的外部中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //搶占優先級2 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x07; //子優先級1 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器 NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn; //使能最右所在的外部中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //搶占優先級2 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x05; //子優先級0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器 EXTI_ClearITPendingBit(EXTI_Line1);//清除LINE1上的中斷標志位 EXTI_ClearITPendingB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論