遙控智能小車課程設(shè)計(jì)
《遙控智能小車課程設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《遙控智能小車課程設(shè)計(jì)(24頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 《 嵌入式系統(tǒng)原理 》 課程設(shè)計(jì)說(shuō)明書 題 目: 遙控智能小車 院 (系): 計(jì)算機(jī)與電子系 專業(yè)班級(jí): 電子科學(xué)與技術(shù)0902班 學(xué)生姓名: 嵌入式系統(tǒng)原理 課程設(shè)計(jì)任務(wù)書 一、設(shè)計(jì)題目 遙控智能小車 二、設(shè)計(jì)主要內(nèi)容 (1) 廣泛查找文獻(xiàn)資料,認(rèn)真研究,反復(fù)論證,精心設(shè)計(jì)技術(shù)方案。 (2) 嚴(yán)格遵守各項(xiàng)紀(jì)律,勤奮學(xué)習(xí),認(rèn)真思考,敢于挑戰(zhàn)困難并勇于創(chuàng)新。 (3) 較為深入的掌握A
2、RM處理器的體系結(jié)構(gòu)、指令系統(tǒng)、編程方法,初步了解ARM應(yīng)用系統(tǒng)的軟硬件開(kāi)發(fā)方法及手段,較熟練地掌握ARM處理器幾種重要的片內(nèi)外設(shè)(定時(shí)器、PLL、I2C、RTC等)的基本原理及編程方法,初步掌握ARM處理器外圍電路的擴(kuò)展方法。 (4) 在現(xiàn)有車模的基礎(chǔ)上,以嵌入式ARM微處理器構(gòu)成小車控制核心,同時(shí)加裝聲光電、紅外線、超聲波傳感器、LED顯示等外圍設(shè)備,實(shí)現(xiàn)對(duì)小車的速度、位置、運(yùn)行狀況的實(shí)時(shí)測(cè)量,并將測(cè)量數(shù)據(jù)傳送至處理器進(jìn)行處理,然后由處理器根據(jù)所檢測(cè)的各種數(shù)據(jù)實(shí)現(xiàn)對(duì)電動(dòng)車的智能控制; (5) 設(shè)計(jì)的智能小車應(yīng)該能夠?qū)崟r(shí)顯示時(shí)間、速度、里程,具有自動(dòng)尋跡、尋光、避障功能,可程控行駛速度、
3、準(zhǔn)確定位停車。并有相應(yīng)的聲光電設(shè)備發(fā)出相關(guān)的提示或警示信息。 (6) 遙控方式可自選,系統(tǒng)通過(guò)遙控器可以控制小車的行駛方向、速度、起停等運(yùn)行狀態(tài),要求要達(dá)到一定的控制精度、距離及范圍,小車行駛速度應(yīng)達(dá)到3m/s以上。 (7) 分析結(jié)果,獨(dú)立撰寫設(shè)計(jì)總結(jié)報(bào)告陳述自己的觀點(diǎn),格式應(yīng)嚴(yán)格遵守學(xué)校規(guī)范。內(nèi)容盡量翔實(shí),其中必須要有自己獨(dú)立的見(jiàn)解和認(rèn)識(shí)。 三、原始資料 硬件資源:四驅(qū)小車車模、STM32系統(tǒng)板、用于ARM處理器的JTAG仿真器、PC機(jī)Pentium100以上。 設(shè)計(jì)指導(dǎo)書:STM32系統(tǒng)板配套光盤 四、要求的設(shè)計(jì)成果 (1)在現(xiàn)有車模的基礎(chǔ)上,以嵌入式ARM微處理器構(gòu)
4、成小車控制核心,同時(shí)加裝聲光電、紅外線、超聲波傳感器、LED顯示等外圍設(shè)備,實(shí)現(xiàn)對(duì)小車的速度、位置、運(yùn)行狀況的實(shí)時(shí)測(cè)量,并將測(cè)量數(shù)據(jù)傳送至處理器進(jìn)行處理,然后由處理器根據(jù)所檢測(cè)的各種數(shù)據(jù)實(shí)現(xiàn)對(duì)電動(dòng)車的智能控制。 (2)撰寫課程設(shè)計(jì)說(shuō)明書,要求簡(jiǎn)潔、通順,格式規(guī)范,設(shè)計(jì)方案正確,實(shí)現(xiàn)技術(shù)路線明確,論述內(nèi)容完整、清楚、規(guī)范,數(shù)據(jù)、資料真實(shí)可靠,軟件程序運(yùn)行良好。 (3)要求有完整的電路設(shè)計(jì)原理圖及軟件源代碼。 五、進(jìn)程安排 (1)第 1 天:任務(wù)布置及相關(guān)知識(shí)講解 (2)第2-3天:資料查閱與方案制定 (3)第4-8天:硬件設(shè)計(jì)、程序編制與調(diào)試階段 (4)第 9 天:撰
5、寫設(shè)計(jì)報(bào)告 (5)第 10 天:答辯與考核階段 六、主要參考資料 [1] 田澤. 嵌入式系統(tǒng)開(kāi)發(fā)與應(yīng)用實(shí)驗(yàn)教程. 北京航空航天工業(yè)大學(xué)出版社,2005. [2] 郭榮佐,王霖. 《嵌入式系統(tǒng)原理》.北京航空航天大學(xué)出版社,.2008. [3] 周根林.嵌入式系統(tǒng)原理與應(yīng)用.南京大學(xué)出版社, 2006. [4] 譚浩強(qiáng). C語(yǔ)言程序設(shè)計(jì)(第2版).清華大學(xué)出版社,2008 [5] 丁峰. ARM系統(tǒng)開(kāi)發(fā)——從實(shí)踐到提高. 中國(guó)電力出版社,2007. [6] 游雨云. 單片機(jī)PWM信號(hào)控制智能小車的實(shí)現(xiàn)方法.技術(shù)與市場(chǎng), 2009,(12) [7] 袁新娜,余紅英,超聲波傳感
6、器在智能小車避障系統(tǒng)中的應(yīng)用. 大眾商務(wù)教育版(民辦教育研究),2009,(8) 指導(dǎo)教師(簽名): 20 年 月 日 目 錄 1. 總體思想 1 2. 電機(jī)驅(qū)動(dòng) 2 2.1 簡(jiǎn)介 2 2.2 具體實(shí)現(xiàn) 2 2.3 功能函數(shù)設(shè)計(jì) 2 3. 遙控系統(tǒng) 7 3.1 遙控器簡(jiǎn)介 7 3.2 接收探頭與解碼 7 3.3 紅外控制 8 4. 超聲波 12 4.1 簡(jiǎn)介 12 4.2 超聲波測(cè)距具體實(shí)現(xiàn) 12 4.3 超聲波程序設(shè)計(jì) 12 5. 紅外尋跡 14 5.1 反射式紅外
7、傳感器 14 5.2 具體實(shí)現(xiàn)方法 14 5.3 尋跡程序設(shè)計(jì) 15 6. 總結(jié) 17 1.總體思想 圖 1.1 設(shè)計(jì)全局圖 本次課程設(shè)計(jì),我們小組采用stm32作為主控芯片,L298N模塊作為電機(jī)驅(qū)動(dòng)芯片。在小車車頭放置三個(gè)反射式紅外傳感器,由于紅外光易于被黑線吸收,利用這個(gè)原理,來(lái)檢測(cè)黑線,當(dāng)檢測(cè)到黑線時(shí),發(fā)射出去的紅外光被吸收,紅外傳感器接受不到反射信號(hào),通過(guò)輸出信號(hào)反饋給STM32,產(chǎn)生中斷,作出相應(yīng)的調(diào)整,詳細(xì)介紹見(jiàn)下文第12頁(yè)。 車頭部分采用一個(gè)US-100超聲波模塊,用于檢測(cè)前方障礙物,我們小組設(shè)置的安全距
8、離為25cm,當(dāng)小車與前方障礙之間的距離小于25cm時(shí),小車蜂鳴器報(bào)警,stm32控制電機(jī),作出相應(yīng)的調(diào)整。關(guān)于超聲波工作詳情,請(qǐng)見(jiàn)下文第11頁(yè)。 小車尾部安裝一枚HS0038紅外接收探頭,配合一塊遙控器,實(shí)現(xiàn)遙控小車的功能。 我們小組選用的遙控器編碼為NEC協(xié)議。紅外遙控功能詳情,請(qǐng)見(jiàn)下文第7頁(yè)。 我們?cè)谛≤嚨能嚿砩戏胖靡粔K3.2寸TFT液晶顯示器。用于顯示時(shí)間,車速。車速通過(guò)霍爾元件測(cè)得。 2.電機(jī)驅(qū)動(dòng) 2.1簡(jiǎn)介 電機(jī)運(yùn)轉(zhuǎn)需要大電流,而stm32驅(qū)動(dòng)能力達(dá)不到電機(jī)正常運(yùn)轉(zhuǎn)的要求,故我們小組采用L298N模塊驅(qū)動(dòng)電機(jī),L298N擁有4個(gè)輸入端口,
9、由stm32直接輸入,4個(gè)輸出端,可以驅(qū)動(dòng)兩個(gè)直流電機(jī)。 stm32輸出端口的電平變換,可以控制電機(jī)的方向。PWM脈寬調(diào)制信號(hào),可以控制電機(jī)的轉(zhuǎn)速。實(shí)現(xiàn)加速減速的功能。 2.2 具體實(shí)現(xiàn) 通過(guò)stm32的PA0,PA1,根據(jù)TIM2產(chǎn)生的不同占空比的PWM波,控制電機(jī)的速度,以及正反轉(zhuǎn)。PA3,PA4控制小車前輪,前輪采用舵機(jī)控制,在轉(zhuǎn)向方面,不能大幅度轉(zhuǎn)彎,所以,在小車轉(zhuǎn)彎上,我們采用轉(zhuǎn)一段時(shí)間,然后倒退一段距離,然后再轉(zhuǎn),如此反復(fù)幾次。通過(guò)這種方式實(shí)現(xiàn)小車的900C轉(zhuǎn)彎。 2.3 功能函數(shù)設(shè)計(jì) 1.void Front() { GPIOD->BRR = 0X03; G
10、PIOA_Conf(); //配置A端口 GPIOA->BRR = 0x0f; GPIOA->BSRR = 0X01; } 調(diào)用這個(gè)函數(shù),實(shí)現(xiàn)小車全速向前形式。PD端口的D0,D1位,是控制小車后面兩個(gè)尾燈。當(dāng)小車前進(jìn)時(shí),尾燈關(guān)閉。 2.void Back() { GPIOD->BSRR = 0x03; GPIOA_Conf(); GPIOA->BRR = 0x0f; GPIOA->BSRR = 0X02; } 調(diào)用這個(gè)函數(shù),實(shí)現(xiàn)小車全速后退。同時(shí)開(kāi)啟車身后面的尾燈。 3 . void LeftSlideFront() {
11、 GPIOD->BSRR = 0X01; GPIOD->BRR = 0X02; GPIOA->BRR = 0X04; GPIOA->BSRR = 0X08; Time_Configuration(350,0,500,7199); } 調(diào)用此函數(shù),實(shí)現(xiàn)小車前進(jìn),左轉(zhuǎn)彎。同時(shí)開(kāi)啟尾部左邊的尾燈,關(guān)閉右邊的尾燈。 Time_Configuration(350,0,500,7199)為占空比調(diào)制函數(shù)。通過(guò)輸入不同的值,改變電機(jī)的轉(zhuǎn)速。 4.void Time_Configuration(uint16_t CCR1_Val,uint16_t CCR2_
12、Val,uint16_t periodValue,uint16_t PrescalerValue) { /*開(kāi)啟TM2定時(shí)器時(shí)鐘*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /*TIM2定時(shí)器復(fù)用管腳PA0,PA1,PA2,PA3*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_
13、Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*配置定時(shí)器時(shí)基*/ TIM_TimeBaseStructure.TIM_Period = periodValue; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
14、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /*配置定時(shí)器各通道情況*/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
15、 TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2, TIM_OCP
16、reload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_Cmd(TIM2, ENABLE); } PWM脈寬調(diào)制波形輸出,是stm32定時(shí)器功能的一大亮點(diǎn),以往8位單片機(jī)輸出PWM波形,均為模擬,或者借助外圍芯片,而stm32內(nèi)部定時(shí)器,實(shí)現(xiàn)了精確的PWM波形直接輸出。上面功能函數(shù),為TIM2定時(shí)器的配置情況。我在使用時(shí),開(kāi)啟了TIM2定時(shí)器的通道1和通道2。分別為PA0,PA1,這兩個(gè)端口控制小車的后輪電機(jī)。由于前輪為舵機(jī)。所以,沒(méi)有采用PWM波形。而是直接給高低電平調(diào)整小車的方向。stm32定時(shí)器采用預(yù)
17、分頻處理,即將系統(tǒng)時(shí)鐘分頻后給定時(shí)器,這個(gè)預(yù)分頻值,由傳入的參數(shù)PrescalerValue決定。系統(tǒng)時(shí)鐘為72MHz,設(shè)分頻后的頻率為F,則: F = 72MHz/(PrescalerValue+1) 定時(shí)器的計(jì)數(shù)周期為傳入?yún)?shù)periodValue的值決定。PWM占空比值由傳入?yún)?shù)CCR1_Val和CCR2_Val決定,分別控制PA0,PA1的占空比值。 占空比 = CCR1_Val/periodValue。 4. void LeftSlideBehind() { GPIOD->BSRR = 0X01; GPIOD->BRR = 0X02; GPIOA->B
18、RR = 0X04; GPIOA->BSRR = 0X08; Time_Configuration(0,350,500,7199); } 調(diào)用此函數(shù),控制小車后退并左轉(zhuǎn)彎。同時(shí)開(kāi)啟左邊尾燈,關(guān)閉右邊尾燈。 5.void RightSlideFront() { GPIOD->BSRR = 0X02; GPIOD->BRR = 0X01; GPIOA->BRR = 0X08; GPIOA->BSRR = 0x04; Time_Configuration(350,0,500,7199); } 調(diào)用此函數(shù),控制小車前進(jìn)并右轉(zhuǎn)彎。同時(shí)關(guān)閉左邊尾燈
19、,開(kāi)啟右邊尾燈。 6. void RightSlideBehind() //后退,右轉(zhuǎn)彎 { GPIOD->BSRR = 0X02; GPIOD->BRR = 0X01; GPIOA->BRR = 0X08; GPIOA->BSRR = 0X04; Time_Configuration(0,350,500,7199); } 調(diào)用此函數(shù),控制小車后退并右轉(zhuǎn)彎。同時(shí)關(guān)閉左邊尾燈,開(kāi)啟右邊尾燈。 7. void Upshift() { uint16_t i; GPIOD->BRR = 0x03; for(i = 100;i <= 180;
20、i = i + 10) { Delay(200); Time_Configuration(i,0,500,7199); } while(i <= 500) { i = i + 50; Time_Configuration(i,0,500,7199); Delay(100); } } 調(diào)用此函數(shù),實(shí)現(xiàn)小車的加速,我們小組將加速過(guò)程分為2級(jí),第一級(jí)為慢加速,讓速度慢慢起來(lái),第二級(jí)加速為快加速,當(dāng)速度達(dá)到一定值后,占空比增大的幅度加強(qiáng)。 8. void SlowDown() { uint16_t i = 400; G
21、PIOD->BSRR = 0X03; while(i > 200) { Time_Configuration(i,0,500,7199); i = i-50; Delay(70); } for(;i > 170; i = i - 5) { Time_Configuration(i,0,500,7199); Delay(80); } } 調(diào)用此函數(shù),實(shí)現(xiàn)小車的減速,減速過(guò)程,我們也分為兩級(jí)。第一級(jí)為快速減速,第二級(jí)為慢速減速。使小車平穩(wěn)減速。 9.void Brake() { GPIOD->BSRR = 0x03;
22、 GPIOA_Conf(); GPIOA->BSRR = 0x0f; } 調(diào)用該函數(shù),小車將停止。同時(shí)后面尾燈開(kāi)啟。 3.遙控系統(tǒng) 3.1 遙控器簡(jiǎn)介 我們小組使用的遙控器發(fā)射編碼為NEC協(xié)議, NEC編碼協(xié)議中,遙控器每發(fā)送一個(gè)8位數(shù)據(jù),可以分為5個(gè)部分: 圖 3.1 NEC協(xié)議編碼規(guī)則 當(dāng)按下遙控器上的任意一個(gè)鍵時(shí),遙控器將發(fā)送一個(gè)38KHz的載波信號(hào),根據(jù)NEC編碼協(xié)議,如果發(fā)送數(shù)據(jù)位為1,則向外發(fā)送38KHz的載波信號(hào),持續(xù)發(fā)送0.56ms.然后停止發(fā)送1.685ms后
23、繼續(xù)發(fā)送下一位。如果發(fā)送數(shù)據(jù)位為0,則紅外遙控向外發(fā)送38KHz的載波信號(hào),持續(xù)發(fā)送0.56ms,然后停止發(fā)送0.565ms后繼續(xù)發(fā)送下一位。 3.2 接收探頭與解碼 接受紅外信號(hào)部分,我們采用HS0038接收探頭,HS0038共三個(gè)引腳,分別為,OUT、VCC、GND。通電后,當(dāng)沒(méi)有收到紅外信號(hào)時(shí),OUT端口默認(rèn)為高電平。接受端口信號(hào)與紅外遙控發(fā)送信號(hào)電平相反。 在解碼方面,接收探頭接受到38KHz的載波后,輸出端OUT電平拉低。由于NEC發(fā)射編碼中,采用的是38KHz載波表示高,無(wú)發(fā)射表示低。所以在接受探頭部分的電平高低,與發(fā)射部分剛好相反。解碼部分,數(shù)據(jù)1,0的電平寬度為別是:
24、 圖 3.2 NEC協(xié)議1、0電平寬度 由于每個(gè)數(shù)據(jù)位開(kāi)始低電平均為0.56ms,所以,我們使用TIM3定時(shí)器,準(zhǔn)確捕獲到每位數(shù)據(jù)高電平持續(xù)時(shí)間。通過(guò)捕獲到的值,來(lái)確認(rèn)1和0. 通過(guò)軟件解碼時(shí),首先接受到引導(dǎo)碼,9ms的低電平和4.5ms的高電平,然后是地址碼和地址反碼,最后是數(shù)據(jù)碼和數(shù)據(jù)反碼。在程序設(shè)計(jì)上,我們定義個(gè)unsigned char型數(shù)組,分別記錄下地址碼、地址反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼。取出數(shù)組下標(biāo)為2和3的值,將下標(biāo)為3的數(shù)組數(shù)據(jù)取反,判斷是否相等,如果不相等,表示解碼數(shù)據(jù)有誤;如果相等,表示解碼正確。 3.3 紅外控制 將stm32的外部中斷3端口與紅外探頭的輸出端相連
25、,捕捉紅外遙控發(fā)射來(lái)的信號(hào)。外部中斷端口程序配置如下: 1.void EXTI3_Configration() { /***************配置PC3端口,作為外部中斷觸發(fā)端口***********/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure
26、); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3); /****************外部中斷線配置,設(shè)置為上升沿觸發(fā)****************/ EXTI_InitStructure.EXTI_Line = EXTI_Line3; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Tri
27、gger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /********************中斷向量表配置*****************/ NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChann
28、elSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 配置好外部中斷后,當(dāng)stm32上電后,便會(huì)實(shí)時(shí)監(jiān)控PC3端口,當(dāng)接受到紅外信號(hào)后,便產(chǎn)生一個(gè)中斷信號(hào),調(diào)用中斷處理函數(shù),處理該事件,下面為中斷處理函數(shù),主要是解碼紅外信號(hào): 2.void EXTI3_IRQHandler(void) { int i,j,Counter = 0; char IR[4] = {0}; char ch1=0,ch2=0; if(EXTI_Ge
29、tITStatus(EXTI_Line3) != RESET) { TIM3->CNT = 0; TIM_Cmd(TIM3,ENABLE); while(TIM_GetCounter(TIM3) < 7000); TIM_Cmd(TIM3,DISABLE); TIM3->CNT = 0; if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) == 0) { while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)); TIM3->CNT = 0; TIM_Cmd(TIM3,EN
30、ABLE); while(TIM_GetCounter(TIM3) < 3500); TIM_Cmd(TIM3,DISABLE); if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) == 1) { while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)); for(i = 0; i< 4; i++) { for(j = 0; j < 8; j++) { while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
31、); TIM3->CNT = 0; TIM_Cmd(TIM3,ENABLE); while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)); Counter = TIM_GetCounter(TIM3); TIM_Cmd(TIM3,DISABLE); ch1 = ch1>>1; if(Counter > 840) { ch1 = ch1|0x80; } else { ch1 = ch1|0;
32、 } Counter = 0; } IR[i] = ch1; } ch1 = IR[2]; ch2 = IR[3]; ch2 = ~ch2; if(ch1 == ch2) { switch(ch1) { case 0x07:LeftSlideFront();break; case 0x09:RightSlideFront();break; case 0x40:Front();break; case 0x19:Back();break;
33、 case 0x16:LeftSlideBehind();break; case 0x0d:RightSlideBehind();break; case 0x0c:Upshift();break; case 0x5e:SlowDown();break; case 0x15:Brake();break; default :Brake();break; } } } } Delay(500); EXTI_ClearITPendingBit(EXTI_Line3); } } 這個(gè)函數(shù)為
34、中斷處理函數(shù),在中斷處理函數(shù)中,我們又用到了一個(gè)TIM3定時(shí)器,該定時(shí)器主要是解碼紅外信號(hào),根據(jù)上文所述的0,1編碼規(guī)則,用TIM3定時(shí)器,所捕獲到的值,來(lái)判斷信號(hào)0,1,實(shí)現(xiàn)軟件解碼紅外信號(hào)。下面為TIM3定時(shí)器的配置: 3. void TIM3_Configuration() { TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_TimeBaseStructure.TIM_Period = 50000; TIM_TimeBaseStructure.TIM_Prescal
35、er = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_PrescalerConfig(TIM3,71,TIM_PSCReloadMode_Immediate); TIM_ARRPreloadConfig(TIM3,DISABLE); TIM_Cmd(TIM3,
36、DISABLE); } 設(shè)置預(yù)分頻值為71,經(jīng)過(guò)分頻后,計(jì)數(shù)器的頻率為1MHz。周期為50000.計(jì)數(shù)方式為向上計(jì)數(shù)。雖然stm32普通定時(shí)器的時(shí)鐘為36MHz,如果將TIM_ClockDivision的值設(shè)置為0,則采用預(yù)分頻時(shí),時(shí)鐘值應(yīng)選72MHz進(jìn)行分頻。 4.超聲波 4.1 簡(jiǎn)介 通過(guò)超聲波發(fā)射裝置發(fā)出超聲波,根據(jù)接收器接到超聲波時(shí)的時(shí)間差就可以知道距離了。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開(kāi)始計(jì)時(shí),超聲波在空氣中傳播,途中碰到障礙物就立即返回來(lái),超聲波接收器收到反射波就
37、立即停止計(jì)時(shí)。(超聲波在空氣中的傳播速度為340m/s,根據(jù)計(jì)數(shù)器記錄的時(shí)間t,就可以計(jì)算出發(fā)射點(diǎn)距障礙物的距離(s),即:s=340t/2) 4.2 超聲波測(cè)距具體實(shí)現(xiàn) 我們?cè)谛≤嚨那岸朔胖靡粋€(gè)超聲波模塊,采用查詢法,每隔1s,發(fā)射一個(gè)10us以上的脈沖信號(hào),超聲波模塊便自動(dòng)發(fā)送8個(gè)40Khz的信號(hào)。當(dāng)模塊接收到返回信號(hào)時(shí),輸出端會(huì)輸出一個(gè)高電平,這個(gè)高電平的持續(xù)時(shí)間,就是超聲波模塊到達(dá)障礙物,聲速的來(lái)回時(shí)間。如果測(cè)得前方障礙物距離小于設(shè)置距離,則小車后退,并發(fā)出報(bào)警蜂鳴聲。 4.3 超聲波程序設(shè)計(jì) 1. float Distance() { float distance;
38、 int time; TIM3->CNT = 0; //非常重要,不清零,沒(méi)結(jié)果 GPIOB->BSRR = 0X01; while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);//等待接收到反回信號(hào) GPIOB->BRR = 0X01; TIM_Cmd(TIM3,ENABLE); //開(kāi)啟定時(shí)器,記下電平持續(xù)時(shí)間 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 1); TIM_Cmd(TIM3,DISABLE);
39、time = TIM_GetCounter(TIM3); distance = (float)time*0.017; //cm數(shù)量級(jí) return distance; } 程序中的TIM3定時(shí)器,在上文3.3.3已經(jīng)詳細(xì)的描述。我們將stm32的PB0作為發(fā)送10us以上高電平的端口,將PB1作為接受超聲波模塊饋送的時(shí)間信號(hào)電平端口。該高電平的時(shí)間,為超聲波來(lái)回障礙物的時(shí)間。該函數(shù)返回值,即為小車到障礙物的距離。 2. void KeepDistance() //超聲波測(cè)距,距離控制函數(shù) { GPIOB->BRR = 0x100; if(Distance(
40、) < 25.0) { GPIOB->BSRR = 0x100; RightSlideBehind(); Delay(200); GPIOB->BRR = 0x100; Delay(700); GPIOA->BSRR = 0x0c; Time_Configuration(70,0,100,71); } }
41、調(diào)用這個(gè)函數(shù),當(dāng)小車查詢到前方距離小于25cm時(shí),便進(jìn)行一些列的調(diào)整,如蜂鳴器想起,小車向右后轉(zhuǎn)。 5.紅外尋跡 5.1 反射式紅外傳感器 圖5.1 反射式紅外傳感器 如圖5.1所示,當(dāng)紅外發(fā)射管發(fā)射信號(hào),經(jīng)地面反射到接收管時(shí),接收管部位電阻值很?。划?dāng)紅外傳感器與地面距離拉大,接收管接收不到反射信號(hào)時(shí),接收管部位電阻值很大。采用一個(gè)電壓比較器LM393,LM393為兩端輸入,一端輸出,比較兩個(gè)輸入信號(hào)的大小。我們將紅外傳感器接收管在接收到信號(hào)和沒(méi)有接收到信號(hào)時(shí),電阻兩端的電壓與一個(gè)固定的值相比,接收到信
42、號(hào)時(shí),LM393輸出低電平;沒(méi)有接受到信號(hào)時(shí),LM393輸出高電平。通過(guò)高低電平,判斷紅外管發(fā)出的信號(hào)是否被黑線吸收。 5.2 具體實(shí)現(xiàn)方法 小車上的黑線檢測(cè)設(shè)備,采用的中斷觸發(fā)方式是,下降沿。由于電機(jī)在轉(zhuǎn)動(dòng)過(guò)程中,不可避免的會(huì)發(fā)生突然變向,減速等。這樣會(huì)干擾電源電壓,由于我我們組采用的stm32為3.3V供電,該電壓有6個(gè)電池串聯(lián),經(jīng)過(guò)穩(wěn)壓芯片穩(wěn)壓后,輸出3.3V給stm32,當(dāng)點(diǎn)擊由于突然變向,加速減速才生大電流,對(duì)電池電壓產(chǎn)生較大的沖擊,穩(wěn)壓芯片輸出截止。黑線檢測(cè)的模塊與stm32并聯(lián),當(dāng)穩(wěn)壓芯片輸出的3.3V電壓突然截止時(shí),尋跡模塊輸出電壓為0.如果采用下降沿觸發(fā),這時(shí),由于電壓的
43、不穩(wěn)定而導(dǎo)致了一個(gè)有害的觸發(fā)中斷。 通過(guò)修改硬件電路,采用上升沿觸發(fā),當(dāng)紅外對(duì)管檢測(cè)到黑線時(shí),輸出信號(hào)為0,當(dāng)小車沒(méi)有檢測(cè)到黑線時(shí),輸出信號(hào)為1。當(dāng)穩(wěn)壓芯片突然截止時(shí),輸出也0,這樣可以有效的解決電機(jī)對(duì)尋跡模塊的干擾。 我們小組采用3個(gè)尋跡模塊,stm32采用3個(gè)外部觸發(fā)端口分別與3個(gè)尋跡模塊相連。左右兩邊尋跡模塊用于檢測(cè)跑到邊沿,防止小車沖出跑到。中間尋跡模塊用于檢測(cè)小車轉(zhuǎn)彎線。stm32分槍占式優(yōu)先級(jí)和響應(yīng)式優(yōu)先級(jí)。如果搶占式優(yōu)先級(jí)相同,則不能發(fā)生中斷嵌套。小車經(jīng)過(guò)轉(zhuǎn)彎線時(shí),三個(gè)尋跡模塊均會(huì)檢測(cè)到黑線。所以,我們?cè)O(shè)置中間尋跡模塊的搶占式優(yōu)先級(jí)最高,兩邊搶占式等級(jí)低于中間,當(dāng)小車經(jīng)過(guò)轉(zhuǎn)
44、彎線時(shí),三個(gè)中斷同時(shí),或一次來(lái)臨。中間中斷等級(jí)打斷兩邊,保證中間的中斷執(zhí)行程序能順利執(zhí)行。 5.3 尋跡程序設(shè)計(jì) 我們采用三個(gè)外部中斷,分別為PC0,PC1,PC3三個(gè)端口,分別監(jiān)控三個(gè)尋跡模塊。下面以外部中斷0為例: 1.void EXTI0_Configration() { /************配置PC0端口,作為外部中斷觸發(fā)端口*******/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Ini
45、tStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0); /****************外部中斷線配置,設(shè)置為下降沿觸發(fā)****************/ EXTI_InitStructure.EXTI_Line = E
46、XTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /********************中斷向量表配置*****************/ NVIC_InitStructure.NVIC_IRQChannel = EXTI
47、0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 將外部中斷設(shè)置為上升沿觸發(fā),出現(xiàn)中斷后,按照中斷處理函數(shù)進(jìn)行,下面為中斷處理函數(shù): 2.void EXTI0_IRQHandler(void) { i
48、f(EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); Back(); Delay(5); RightSlideBehind(); Delay(1000); GPIOA->BSRR = 0X0C; Time_Configuration(350,0,500,7199); EXTI_ClearITPendingBit(EXTI_Line0); } } 其余兩個(gè)中斷按照類似的方法配置。端口號(hào)改為PC1,PC2。
49、 6.總結(jié) 由于超聲波模塊使用的頻率是40KHz,紅外遙控使用的是38KHz頻率。在小車運(yùn)行過(guò)程中,會(huì)產(chǎn)生沖突。即遙控器發(fā)送的信號(hào)會(huì)干擾超聲波對(duì)距離的判斷,考慮到黑色的紙可以較好的吸收紅外信號(hào),為了減小干擾。我們?cè)谛≤嚨能嚿?,靠近超聲波模塊的地方,貼上了黑色紙張。減小紅外信號(hào)對(duì)超聲波模塊的干擾。測(cè)試證明,效果很明顯。基本解決了遙控器發(fā)射的紅外信號(hào)對(duì)超聲波的干擾。 小車與TFT模塊,霍爾測(cè)速上的通信。通過(guò)SPI接口,實(shí)現(xiàn)STM32與STC89C52的通信。把霍爾元件測(cè)得的車速,超聲波模塊測(cè)得的距離實(shí)時(shí)傳送到STC89C52
50、控制的TFT顯示器上。實(shí)現(xiàn)測(cè)量數(shù)據(jù)的可視化,直觀化。 主函數(shù)為: int main() { RCC_Config(); GPIO_Configuration(); GPIOB->BRR = 0x100; //初始化蜂鳴器--關(guān)閉 GPIOD->BRR = 0X03; //關(guān)掉尾燈 Delay_ms(1000); //消除上電時(shí),脈沖導(dǎo)致的莫名其妙的中斷操作。 /***4個(gè)外部中斷*****/ EXTI0_Configration(); //左邊黑線檢測(cè) EXTI1_Configration(); //中間黑線檢測(cè)
51、 EXTI2_Configration(); //右邊黑線檢測(cè) EXTI3_Configration(); //紅外控制端口 TIM3_Configuration(); //定時(shí)器配置,用于超聲波測(cè)距 while(1) { KeepDistance(); Delay(100); //控制采樣時(shí)間。 } } 課程設(shè)計(jì)成績(jī)?cè)u(píng)定表 成 績(jī) 評(píng) 定 項(xiàng) 目 比例 得 分 平時(shí)成績(jī)(百分制記分) 30% 業(yè)務(wù)考核成績(jī)(百分制記分) 70% 總評(píng)成績(jī)(百分制記分) 100% 評(píng)定等級(jí) 優(yōu) 良 中 及格 不及格 指導(dǎo)教師(簽名): 20 年 月 日 18
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)2圖形與幾何第7課時(shí)圖形的位置練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)2圖形與幾何第1課時(shí)圖形的認(rèn)識(shí)與測(cè)量1平面圖形的認(rèn)識(shí)練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時(shí)比和比例2作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)4比例1比例的意義和基本性質(zhì)第3課時(shí)解比例練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)3圓柱與圓錐1圓柱第7課時(shí)圓柱的體積3作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識(shí)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)1負(fù)數(shù)第1課時(shí)負(fù)數(shù)的初步認(rèn)識(shí)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)期末豐收?qǐng)@作業(yè)課件蘇教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)易錯(cuò)清單十二課件新人教版
- 標(biāo)準(zhǔn)工時(shí)講義
- 2021年一年級(jí)語(yǔ)文上冊(cè)第六單元知識(shí)要點(diǎn)習(xí)題課件新人教版
- 2022春一年級(jí)語(yǔ)文下冊(cè)課文5識(shí)字測(cè)評(píng)習(xí)題課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時(shí)數(shù)學(xué)思考1練習(xí)課件新人教版