版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《 嵌入式系統(tǒng)原理 》</p><p><b> 課程設(shè)計說明書</b></p><p> 題 目: 遙控智能小車 </p><p> 院 (系): 計算機(jī)與電子系 </p><p> 專業(yè)班級: 電子科學(xué)與技術(shù)0902班
2、 </p><p> 學(xué)生姓名: </p><p> 嵌入式系統(tǒng)原理 課程設(shè)計任務(wù)書</p><p><b> 目 錄</b></p><p> 1. 總體思想1</p><p> 2. 電機(jī)驅(qū)動2</p
3、><p><b> 2.1 簡介2</b></p><p> 2.2 具體實現(xiàn)2</p><p> 2.3 功能函數(shù)設(shè)計2</p><p><b> 3. 遙控系統(tǒng)7</b></p><p> 3.1 遙控器簡介7</p><p>
4、3.2 接收探頭與解碼7</p><p> 3.3 紅外控制 8</p><p> 4. 超聲波 12</p><p><b> 4.1 簡介12</b></p><p> 4.2 超聲波測距具體實現(xiàn)12</p><p> 4.3 超聲波程序設(shè)計12</p>
5、<p> 5. 紅外尋跡14</p><p> 5.1 反射式紅外傳感器14</p><p> 5.2 具體實現(xiàn)方法14</p><p> 5.3 尋跡程序設(shè)計15</p><p><b> 6. 總結(jié)17</b></p><p><b> 1.總
6、體思想</b></p><p> 圖 1.1 設(shè)計全局圖</p><p> 本次課程設(shè)計,我們小組采用stm32作為主控芯片,L298N模塊作為電機(jī)驅(qū)動芯片。在小車車頭放置三個反射式紅外傳感器,由于紅外光易于被黑線吸收,利用這個原理,來檢測黑線,當(dāng)檢測到黑線時,發(fā)射出去的紅外光被吸收,紅外傳感器接受不到反射信號,通過輸出信號反饋給STM32,產(chǎn)生中斷,作出相應(yīng)的調(diào)整,詳細(xì)介
7、紹見下文第12頁。</p><p> 車頭部分采用一個US-100超聲波模塊,用于檢測前方障礙物,我們小組設(shè)置的安全距離為25cm,當(dāng)小車與前方障礙之間的距離小于25cm時,小車蜂鳴器報警,stm32控制電機(jī),作出相應(yīng)的調(diào)整。關(guān)于超聲波工作詳情,請見下文第11頁。</p><p> 小車尾部安裝一枚HS0038紅外接收探頭,配合一塊遙控器,實現(xiàn)遙控小車的功能。</p>&
8、lt;p> 我們小組選用的遙控器編碼為NEC協(xié)議。紅外遙控功能詳情,請見下文第7頁。</p><p> 我們在小車的車身上放置一塊3.2寸TFT液晶顯示器。用于顯示時間,車速。車速通過霍爾元件測得。</p><p><b> 2.電機(jī)驅(qū)動</b></p><p><b> 2.1簡介</b></p>
9、;<p> 電機(jī)運轉(zhuǎn)需要大電流,而stm32驅(qū)動能力達(dá)不到電機(jī)正常運轉(zhuǎn)的要求,故我們小組采用L298N模塊驅(qū)動電機(jī),L298N擁有4個輸入端口,由stm32直接輸入,4個輸出端,可以驅(qū)動兩個直流電機(jī)。stm32輸出端口的電平變換,可以控制電機(jī)的方向。PWM脈寬調(diào)制信號,可以控制電機(jī)的轉(zhuǎn)速。實現(xiàn)加速減速的功能。</p><p><b> 2.2 具體實現(xiàn)</b></p
10、><p> 通過stm32的PA0,PA1,根據(jù)TIM2產(chǎn)生的不同占空比的PWM波,控制電機(jī)的速度,以及正反轉(zhuǎn)。PA3,PA4控制小車前輪,前輪采用舵機(jī)控制,在轉(zhuǎn)向方面,不能大幅度轉(zhuǎn)彎,所以,在小車轉(zhuǎn)彎上,我們采用轉(zhuǎn)一段時間,然后倒退一段距離,然后再轉(zhuǎn),如此反復(fù)幾次。通過這種方式實現(xiàn)小車的900C轉(zhuǎn)彎。</p><p> 2.3 功能函數(shù)設(shè)計</p><p> 1
11、.void Front() </p><p><b> {</b></p><p> GPIOD->BRR = 0X03; </p><p> GPIOA_Conf(); //配置A端口 </p><p> GPIOA->BRR = 0x0f;</p><p&g
12、t; GPIOA->BSRR = 0X01;</p><p><b> }</b></p><p> 調(diào)用這個函數(shù),實現(xiàn)小車全速向前形式。PD端口的D0,D1位,是控制小車后面兩個尾燈。當(dāng)小車前進(jìn)時,尾燈關(guān)閉。</p><p> 2.void Back() </p><p><b>
13、 {</b></p><p> GPIOD->BSRR = 0x03;</p><p> GPIOA_Conf();</p><p> GPIOA->BRR = 0x0f;</p><p> GPIOA->BSRR = 0X02;</p><p><b> }</
14、b></p><p> 調(diào)用這個函數(shù),實現(xiàn)小車全速后退。同時開啟車身后面的尾燈。 </p><p> 3 . void LeftSlideFront() </p><p><b> {</b></p><p> GPIOD->BSRR = 0X01;</p><p>
15、GPIOD->BRR = 0X02;</p><p> GPIOA->BRR = 0X04;</p><p> GPIOA->BSRR = 0X08;</p><p> Time_Configuration(350,0,500,7199);</p><p><b> }</b></p&
16、gt;<p> 調(diào)用此函數(shù),實現(xiàn)小車前進(jìn),左轉(zhuǎn)彎。同時開啟尾部左邊的尾燈,關(guān)閉右邊的尾燈。</p><p> Time_Configuration(350,0,500,7199)為占空比調(diào)制函數(shù)。通過輸入不同的值,改變電機(jī)的轉(zhuǎn)速。</p><p> 4.void Time_Configuration(uint16_t CCR1_Val,uint16_t CCR2_Val
17、,uint16_t periodValue,uint16_t PrescalerValue)</p><p><b> {</b></p><p> /*開啟TM2定時器時鐘*/</p><p> RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);</p><p&g
18、t; /*TIM2定時器復(fù)用管腳PA0,PA1,PA2,PA3*/</p><p> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;</p><p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p> GPIO_InitStructu
19、re.GPIO_Speed = GPIO_Speed_50MHz;</p><p> GPIO_Init(GPIOA, &GPIO_InitStructure);</p><p> /*配置定時器時基*/</p><p> TIM_TimeBaseStructure.TIM_Period = periodValue;</p><p&
20、gt; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;</p><p> TIM_TimeBaseStructure.TIM_ClockDivision = 0;</p><p> TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;</p>&
21、lt;p> TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);</p><p> /*配置定時器各通道情況*/</p><p> TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;</p><p> TIM_OCInitStructure.TIM_Out
22、putState = TIM_OutputState_Enable;</p><p> TIM_OCInitStructure.TIM_Pulse = CCR1_Val;</p><p> TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;</p><p> TIM_OC1Init(TIM2, &
23、amp;TIM_OCInitStructure);</p><p> TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);</p><p> TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;</p><p> TIM_OCInitStruct
24、ure.TIM_Pulse = CCR2_Val;</p><p> TIM_OC2Init(TIM2, &TIM_OCInitStructure);</p><p> TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);</p><p> TIM_ARRPreloadConfig(TIM2, ENABL
25、E); </p><p> TIM_Cmd(TIM2, ENABLE);</p><p><b> }</b></p><p> PWM脈寬調(diào)制波形輸出,是stm32定時器功能的一大亮點,以往8位單片機(jī)輸出PWM波形,均為模擬,或者借助外圍芯片,而stm32內(nèi)部定時器,實現(xiàn)了精確的PWM波形直接輸出。上面功能函數(shù),為TIM2定時器的配置
26、情況。我在使用時,開啟了TIM2定時器的通道1和通道2。分別為PA0,PA1,這兩個端口控制小車的后輪電機(jī)。由于前輪為舵機(jī)。所以,沒有采用PWM波形。而是直接給高低電平調(diào)整小車的方向。stm32定時器采用預(yù)分頻處理,即將系統(tǒng)時鐘分頻后給定時器,這個預(yù)分頻值,由傳入的參數(shù)PrescalerValue決定。系統(tǒng)時鐘為72MHz,設(shè)分頻后的頻率為F,則:</p><p> F = 72MHz/(PrescalerVa
27、lue+1)</p><p> 定時器的計數(shù)周期為傳入?yún)?shù)periodValue的值決定。PWM占空比值由傳入?yún)?shù)CCR1_Val和CCR2_Val決定,分別控制PA0,PA1的占空比值。</p><p> 占空比 = CCR1_Val/periodValue。</p><p> 4. void LeftSlideBehind() </p>
28、<p><b> {</b></p><p> GPIOD->BSRR = 0X01;</p><p> GPIOD->BRR = 0X02;</p><p> GPIOA->BRR = 0X04;</p><p> GPIOA->BSRR = 0X08;</p&g
29、t;<p> Time_Configuration(0,350,500,7199);</p><p><b> }</b></p><p> 調(diào)用此函數(shù),控制小車后退并左轉(zhuǎn)彎。同時開啟左邊尾燈,關(guān)閉右邊尾燈。</p><p> 5.void RightSlideFront() </p><p&g
30、t;<b> {</b></p><p> GPIOD->BSRR = 0X02;</p><p> GPIOD->BRR = 0X01;</p><p> GPIOA->BRR = 0X08;</p><p> GPIOA->BSRR = 0x04;</p><
31、p> Time_Configuration(350,0,500,7199);</p><p><b> } </b></p><p> 調(diào)用此函數(shù),控制小車前進(jìn)并右轉(zhuǎn)彎。同時關(guān)閉左邊尾燈,開啟右邊尾燈。</p><p> 6. void RightSlideBehind() //后退,右轉(zhuǎn)彎</p><
32、p><b> {</b></p><p> GPIOD->BSRR = 0X02;</p><p> GPIOD->BRR = 0X01;</p><p> GPIOA->BRR = 0X08;</p><p> GPIOA->BSRR = 0X04;</p>&l
33、t;p> Time_Configuration(0,350,500,7199);</p><p><b> } </b></p><p> 調(diào)用此函數(shù),控制小車后退并右轉(zhuǎn)彎。同時關(guān)閉左邊尾燈,開啟右邊尾燈。</p><p> 7. void Upshift() </p><p><b> {
34、</b></p><p> uint16_t i;</p><p> GPIOD->BRR = 0x03;</p><p> for(i = 100;i <= 180;i = i + 10)</p><p><b> {</b></p><p> Delay(20
35、0);</p><p> Time_Configuration(i,0,500,7199);</p><p><b> }</b></p><p> while(i <= 500)</p><p><b> {</b></p><p> i = i + 50;
36、</p><p> Time_Configuration(i,0,500,7199);</p><p> Delay(100);</p><p><b> }</b></p><p><b> }</b></p><p> 調(diào)用此函數(shù),實現(xiàn)小車的加速,我們小組將加速
37、過程分為2級,第一級為慢加速,讓速度慢慢起來,第二級加速為快加速,當(dāng)速度達(dá)到一定值后,占空比增大的幅度加強。</p><p> 8. void SlowDown() </p><p><b> {</b></p><p> uint16_t i = 400;</p><p> GPIOD->BSRR
38、 = 0X03;</p><p> while(i > 200)</p><p><b> {</b></p><p> Time_Configuration(i,0,500,7199);</p><p><b> i = i-50;</b></p><p>
39、 Delay(70);</p><p><b> }</b></p><p> for(;i > 170; i = i - 5)</p><p><b> {</b></p><p> Time_Configuration(i,0,500,7199); </p>&l
40、t;p> Delay(80);</p><p><b> }</b></p><p><b> }</b></p><p> 調(diào)用此函數(shù),實現(xiàn)小車的減速,減速過程,我們也分為兩級。第一級為快速減速,第二級為慢速減速。使小車平穩(wěn)減速。</p><p> 9.void Brake()
41、 </p><p><b> {</b></p><p> GPIOD->BSRR = 0x03;</p><p> GPIOA_Conf();</p><p> GPIOA->BSRR = 0x0f;</p><p><b> }</b></p&
42、gt;<p> 調(diào)用該函數(shù),小車將停止。同時后面尾燈開啟。</p><p><b> 3.遙控系統(tǒng)</b></p><p><b> 3.1 遙控器簡介</b></p><p> 我們小組使用的遙控器發(fā)射編碼為NEC協(xié)議,NEC編碼協(xié)議中,遙控器每發(fā)送一個8位數(shù)據(jù),可以分為5個部分:</p&g
43、t;<p> 圖 3.1 NEC協(xié)議編碼規(guī)則</p><p> 當(dāng)按下遙控器上的任意一個鍵時,遙控器將發(fā)送一個38KHz的載波信號,根據(jù)NEC編碼協(xié)議,如果發(fā)送數(shù)據(jù)位為1,則向外發(fā)送38KHz的載波信號,持續(xù)發(fā)送0.56ms.然后停止發(fā)送1.685ms后繼續(xù)發(fā)送下一位。如果發(fā)送數(shù)據(jù)位為0,則紅外遙控向外發(fā)送38KHz的載波信號,持續(xù)發(fā)送0.56ms,然后停止發(fā)送0.565ms后繼續(xù)發(fā)送下一位。&
44、lt;/p><p> 3.2 接收探頭與解碼</p><p> 接受紅外信號部分,我們采用HS0038接收探頭,HS0038共三個引腳,分別為,OUT、VCC、GND。通電后,當(dāng)沒有收到紅外信號時,OUT端口默認(rèn)為高電平。接受端口信號與紅外遙控發(fā)送信號電平相反。</p><p> 在解碼方面,接收探頭接受到38KHz的載波后,輸出端OUT電平拉低。由于NEC發(fā)射編
45、碼中,采用的是38KHz載波表示高,無發(fā)射表示低。所以在接受探頭部分的電平高低,與發(fā)射部分剛好相反。解碼部分,數(shù)據(jù)1,0的電平寬度為別是:</p><p> 圖 3.2 NEC協(xié)議1、0電平寬度</p><p> 由于每個數(shù)據(jù)位開始低電平均為0.56ms,所以,我們使用TIM3定時器,準(zhǔn)確捕獲到每位數(shù)據(jù)高電平持續(xù)時間。通過捕獲到的值,來確認(rèn)1和0.</p><p&g
46、t; 通過軟件解碼時,首先接受到引導(dǎo)碼,9ms的低電平和4.5ms的高電平,然后是地址碼和地址反碼,最后是數(shù)據(jù)碼和數(shù)據(jù)反碼。在程序設(shè)計上,我們定義個unsigned char型數(shù)組,分別記錄下地址碼、地址反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼。取出數(shù)組下標(biāo)為2和3的值,將下標(biāo)為3的數(shù)組數(shù)據(jù)取反,判斷是否相等,如果不相等,表示解碼數(shù)據(jù)有誤;如果相等,表示解碼正確。</p><p><b> 3.3 紅外控制</
47、b></p><p> 將stm32的外部中斷3端口與紅外探頭的輸出端相連,捕捉紅外遙控發(fā)射來的信號。外部中斷端口程序配置如下:</p><p> 1.void EXTI3_Configration()</p><p><b> {</b></p><p> /***************配置PC3端口,
48、作為外部中斷觸發(fā)端口***********/</p><p> RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);</p><p> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;</p><p> GPIO_InitStructure.GPIO_Mode = GPIO
49、_Mode_IN_FLOATING;</p><p> GPIO_Init(GPIOC, &GPIO_InitStructure);</p><p> RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);</p><p> GPIO_EXTILineConfig(GPIO_PortSourceGPIO
50、C, GPIO_PinSource3);</p><p> /****************外部中斷線配置,設(shè)置為上升沿觸發(fā)****************/</p><p> EXTI_InitStructure.EXTI_Line = EXTI_Line3;</p><p> EXTI_InitStructure.EXTI_Mode = EXTI_Mod
51、e_Interrupt;</p><p> EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; </p><p> EXTI_InitStructure.EXTI_LineCmd = ENABLE;</p><p> EXTI_Init(&EXTI_InitStructure);</p
52、><p> /********************中斷向量表配置*****************/</p><p> NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;</p><p> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;<
53、;/p><p> NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;</p><p> NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;</p><p> NVIC_Init(&NVIC_InitStructure);</p><p&g
54、t;<b> }</b></p><p> 配置好外部中斷后,當(dāng)stm32上電后,便會實時監(jiān)控PC3端口,當(dāng)接受到紅外信號后,便產(chǎn)生一個中斷信號,調(diào)用中斷處理函數(shù),處理該事件,下面為中斷處理函數(shù),主要是解碼紅外信號:</p><p> 2.void EXTI3_IRQHandler(void)</p><p><b> {&l
55、t;/b></p><p> int i,j,Counter = 0;</p><p> char IR[4] = {0};</p><p> char ch1=0,ch2=0;</p><p> if(EXTI_GetITStatus(EXTI_Line3) != RESET)</p><p><
56、b> {</b></p><p> TIM3->CNT = 0;</p><p> TIM_Cmd(TIM3,ENABLE);</p><p> while(TIM_GetCounter(TIM3) < 7000);</p><p> TIM_Cmd(TIM3,DISABLE);</p>
57、<p> TIM3->CNT = 0;</p><p> if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) == 0)</p><p><b> {</b></p><p> while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));</p&
58、gt;<p> TIM3->CNT = 0;</p><p> TIM_Cmd(TIM3,ENABLE);</p><p> while(TIM_GetCounter(TIM3) < 3500);</p><p> TIM_Cmd(TIM3,DISABLE);</p><p> if(GPIO_ReadIn
59、putDataBit(GPIOC,GPIO_Pin_3) == 1)</p><p><b> {</b></p><p> while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));</p><p> for(i = 0; i< 4; i++)</p><p><b
60、> {</b></p><p> for(j = 0; j < 8; j++)</p><p><b> {</b></p><p> while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));</p><p> TIM3->CNT = 0;&
61、lt;/p><p> TIM_Cmd(TIM3,ENABLE);</p><p> while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));</p><p> Counter = TIM_GetCounter(TIM3);</p><p> TIM_Cmd(TIM3,DISABLE);</p&
62、gt;<p> ch1 = ch1>>1;</p><p> if(Counter > 840)</p><p><b> {</b></p><p> ch1 = ch1|0x80;</p><p><b> }</b></p><p&
63、gt;<b> else </b></p><p><b> {</b></p><p> ch1 = ch1|0;</p><p><b> }</b></p><p> Counter = 0;</p><p><b> }&
64、lt;/b></p><p> IR[i] = ch1;</p><p><b> }</b></p><p> ch1 = IR[2];</p><p> ch2 = IR[3];</p><p> ch2 = ~ch2;</p><p> if(ch1
65、 == ch2)</p><p><b> {</b></p><p> switch(ch1)</p><p><b> {</b></p><p> case 0x07:LeftSlideFront();break;</p><p> case 0x09:Rig
66、htSlideFront();break;</p><p> case 0x40:Front();break;</p><p> case 0x19:Back();break;</p><p> case 0x16:LeftSlideBehind();break;</p><p> case 0x0d:RightSlideBehind
67、();break; </p><p> case 0x0c:Upshift();break;</p><p> case 0x5e:SlowDown();break;</p><p> case 0x15:Brake();break;</p><p> default :Brake();break;</p><p&
68、gt;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p> Delay(500);</p><p> EXTI_Cle
69、arITPendingBit(EXTI_Line3); </p><p><b> }</b></p><p><b> }</b></p><p> 這個函數(shù)為中斷處理函數(shù),在中斷處理函數(shù)中,我們又用到了一個TIM3定時器,該定時器主要是解碼紅外信號,根據(jù)上文所述的0,1編碼規(guī)則,用TIM3定時器,所捕獲到的值,
70、來判斷信號0,1,實現(xiàn)軟件解碼紅外信號。下面為TIM3定時器的配置:</p><p> 3. void TIM3_Configuration()</p><p><b> { </b></p><p> TIM_DeInit(TIM3);</p><p> RCC_APB1PeriphClockCmd(RCC_A
71、PB1Periph_TIM3,ENABLE);</p><p> TIM_TimeBaseStructure.TIM_Period = 50000;</p><p> TIM_TimeBaseStructure.TIM_Prescaler = 0;</p><p> TIM_TimeBaseStructure.TIM_ClockDivision = 0;<
72、;/p><p> TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;</p><p> TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);</p><p> TIM_PrescalerConfig(TIM3,71,TIM_PSCReloadMode
73、_Immediate);</p><p> TIM_ARRPreloadConfig(TIM3,DISABLE);</p><p> TIM_Cmd(TIM3,DISABLE);</p><p><b> }</b></p><p> 設(shè)置預(yù)分頻值為71,經(jīng)過分頻后,計數(shù)器的頻率為1MHz。周期為50000.計數(shù)
74、方式為向上計數(shù)。雖然stm32普通定時器的時鐘為36MHz,如果將TIM_ClockDivision的值設(shè)置為0,則采用預(yù)分頻時,時鐘值應(yīng)選72MHz進(jìn)行分頻。</p><p><b> 4.超聲波</b></p><p><b> 4.1 簡介 </b></p><p> 通過超聲波發(fā)射裝置發(fā)出超聲波,根據(jù)接收器接
75、到超聲波時的時間差就可以知道距離了。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。(超聲波在空氣中的傳播速度為340m/s,根據(jù)計數(shù)器記錄的時間t,就可以計算出發(fā)射點距障礙物的距離(s),即:s=340t/2)</p><p> 4.2 超聲波測距具體實現(xiàn)</p><p> 我們在小車的
76、前端放置一個超聲波模塊,采用查詢法,每隔1s,發(fā)射一個10us以上的脈沖信號,超聲波模塊便自動發(fā)送8個40Khz的信號。當(dāng)模塊接收到返回信號時,輸出端會輸出一個高電平,這個高電平的持續(xù)時間,就是超聲波模塊到達(dá)障礙物,聲速的來回時間。如果測得前方障礙物距離小于設(shè)置距離,則小車后退,并發(fā)出報警蜂鳴聲。</p><p> 4.3 超聲波程序設(shè)計</p><p> 1. float Dista
77、nce()</p><p><b> {</b></p><p> float distance;</p><p><b> int time;</b></p><p> TIM3->CNT = 0; //非常重要,不清零,沒結(jié)果</p><
78、p> GPIOB->BSRR = 0X01;</p><p> while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);//等待接收到反回信號</p><p> GPIOB->BRR = 0X01; </p><p> TIM_Cmd(TIM3,ENABLE); //開啟
79、定時器,記下電平持續(xù)時間</p><p> while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 1);</p><p> TIM_Cmd(TIM3,DISABLE);</p><p> time = TIM_GetCounter(TIM3);</p><p> distance = (fl
80、oat)time*0.017; //cm數(shù)量級</p><p> return distance;</p><p><b> }</b></p><p> 程序中的TIM3定時器,在上文3.3.3已經(jīng)詳細(xì)的描述。我們將stm32的PB0作為發(fā)送10us以上高電平的端口,將PB1作為接受超聲波模塊饋送的時間信號電平端口。該高電平的時間,為超
81、聲波來回障礙物的時間。該函數(shù)返回值,即為小車到障礙物的距離。</p><p> 2. void KeepDistance() //超聲波測距,距離控制函數(shù)</p><p><b> {</b></p><p> GPIOB->BRR = 0x100;</p><p> if(Distance() &
82、lt; 25.0)</p><p><b> {</b></p><p> GPIOB->BSRR = 0x100;</p><p> RightSlideBehind(); </p><p> Delay(200);</p><p> GPIOB->
83、;BRR = 0x100;</p><p> Delay(700); </p><p> GPIOA->BSRR = 0x0c;</p><p> Time_Conf
84、iguration(70,0,100,71);</p><p><b> }</b></p><p><b> }</b></p><p> 調(diào)用這個函數(shù),當(dāng)小車查詢到前方距離小于25cm時,便進(jìn)行一些列的調(diào)整,如蜂鳴器想起,小車向右后轉(zhuǎn)。</p><p><b> 5.紅外尋跡
85、</b></p><p> 5.1 反射式紅外傳感器 </p><p> 圖5.1 反射式紅外傳感器</p><p> 如圖5.1所示,當(dāng)紅外發(fā)射管發(fā)射信號,經(jīng)地面反射到接收管時,接收管部位電阻值很??;當(dāng)紅外傳感器與地面距離拉大,接收管接收不到反射信號時,接收管部位電阻值很大。采用一個電壓比較器LM393,LM393為兩端輸入,一端輸出,比較兩個輸
86、入信號的大小。我們將紅外傳感器接收管在接收到信號和沒有接收到信號時,電阻兩端的電壓與一個固定的值相比,接收到信號時,LM393輸出低電平;沒有接受到信號時,LM393輸出高電平。通過高低電平,判斷紅外管發(fā)出的信號是否被黑線吸收。</p><p> 5.2 具體實現(xiàn)方法</p><p> 小車上的黑線檢測設(shè)備,采用的中斷觸發(fā)方式是,下降沿。由于電機(jī)在轉(zhuǎn)動過程中,不可避免的會發(fā)生突然變向,
87、減速等。這樣會干擾電源電壓,由于我我們組采用的stm32為3.3V供電,該電壓有6個電池串聯(lián),經(jīng)過穩(wěn)壓芯片穩(wěn)壓后,輸出3.3V給stm32,當(dāng)點擊由于突然變向,加速減速才生大電流,對電池電壓產(chǎn)生較大的沖擊,穩(wěn)壓芯片輸出截止。黑線檢測的模塊與stm32并聯(lián),當(dāng)穩(wěn)壓芯片輸出的3.3V電壓突然截止時,尋跡模塊輸出電壓為0.如果采用下降沿觸發(fā),這時,由于電壓的不穩(wěn)定而導(dǎo)致了一個有害的觸發(fā)中斷。</p><p> 通過修
88、改硬件電路,采用上升沿觸發(fā),當(dāng)紅外對管檢測到黑線時,輸出信號為0,當(dāng)小車沒有檢測到黑線時,輸出信號為1。當(dāng)穩(wěn)壓芯片突然截止時,輸出也0,這樣可以有效的解決電機(jī)對尋跡模塊的干擾。</p><p> 我們小組采用3個尋跡模塊,stm32采用3個外部觸發(fā)端口分別與3個尋跡模塊相連。左右兩邊尋跡模塊用于檢測跑到邊沿,防止小車沖出跑到。中間尋跡模塊用于檢測小車轉(zhuǎn)彎線。stm32分槍占式優(yōu)先級和響應(yīng)式優(yōu)先級。如果搶占式優(yōu)先
89、級相同,則不能發(fā)生中斷嵌套。小車經(jīng)過轉(zhuǎn)彎線時,三個尋跡模塊均會檢測到黑線。所以,我們設(shè)置中間尋跡模塊的搶占式優(yōu)先級最高,兩邊搶占式等級低于中間,當(dāng)小車經(jīng)過轉(zhuǎn)彎線時,三個中斷同時,或一次來臨。中間中斷等級打斷兩邊,保證中間的中斷執(zhí)行程序能順利執(zhí)行。</p><p> 5.3 尋跡程序設(shè)計</p><p> 我們采用三個外部中斷,分別為PC0,PC1,PC3三個端口,分別監(jiān)控三個尋跡模塊。
90、下面以外部中斷0為例:</p><p> 1.void EXTI0_Configration()</p><p><b> {</b></p><p> /************配置PC0端口,作為外部中斷觸發(fā)端口*******/</p><p> RCC_APB2PeriphClockCmd(RCC_APB2
91、Periph_GPIOC, ENABLE);</p><p> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;</p><p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p> GPIO_Init(GPIOC, &GPIO_InitStru
92、cture);</p><p> RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);</p><p> GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);</p><p> /****************外部中斷線配置,設(shè)置為下降沿觸發(fā)
93、****************/</p><p> EXTI_InitStructure.EXTI_Line = EXTI_Line0;</p><p> EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;</p><p> EXTI_InitStructure.EXTI_Trigger = EXTI_Tr
94、igger_Rising; </p><p> EXTI_InitStructure.EXTI_LineCmd = ENABLE;</p><p> EXTI_Init(&EXTI_InitStructure);</p><p> /********************中斷向量表配置*****************/</p>&l
95、t;p> NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;</p><p> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f;</p><p> NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;<
96、/p><p> NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;</p><p> NVIC_Init(&NVIC_InitStructure);</p><p><b> }</b></p><p> 將外部中斷設(shè)置為上升沿觸發(fā),出現(xiàn)中斷后,按照中斷處理函數(shù)進(jìn)行
97、,下面為中斷處理函數(shù):</p><p> 2.void EXTI0_IRQHandler(void)</p><p><b> {</b></p><p> if(EXTI_GetITStatus(EXTI_Line0) != RESET)</p><p> { E
98、XTI_ClearITPendingBit(EXTI_Line0);</p><p><b> Back();</b></p><p><b> Delay(5);</b></p><p> RightSlideBehind();</p><p> Delay(1000);</p>
99、;<p> GPIOA->BSRR = 0X0C;</p><p> Time_Configuration(350,0,500,7199);</p><p> EXTI_ClearITPendingBit(EXTI_Line0);</p><p><b> } </b></p><p>&
100、lt;b> }</b></p><p> 其余兩個中斷按照類似的方法配置。端口號改為PC1,PC2。</p><p><b> 6.總結(jié)</b></p><p> 由于超聲波模塊使用的頻率是40KHz,紅外遙控使用的是38KHz頻率。在小車運行過程中,會產(chǎn)生沖突。即遙控器發(fā)送的信號會干擾超聲波對距離的判斷,考慮到黑色的
101、紙可以較好的吸收紅外信號,為了減小干擾。我們在小車的車上,靠近超聲波模塊的地方,貼上了黑色紙張。減小紅外信號對超聲波模塊的干擾。測試證明,效果很明顯。基本解決了遙控器發(fā)射的紅外信號對超聲波的干擾。</p><p> 小車與TFT模塊,霍爾測速上的通信。通過SPI接口,實現(xiàn)STM32與STC89C52的通信。把霍爾元件測得的車速,超聲波模塊測得的距離實時傳送到STC89C52控制的TFT顯示器上。實現(xiàn)測量數(shù)據(jù)的可
102、視化,直觀化。</p><p><b> 主函數(shù)為:</b></p><p> int main()</p><p><b> {</b></p><p> RCC_Config();</p><p> GPIO_Configuration();</p>
103、<p> GPIOB->BRR = 0x100; //初始化蜂鳴器--關(guān)閉</p><p> GPIOD->BRR = 0X03; //關(guān)掉尾燈</p><p> Delay_ms(1000); //消除上電時,脈沖導(dǎo)致的莫名其妙的中斷操作。</p><p> /***4個外部中斷*****/&l
104、t;/p><p> EXTI0_Configration(); //左邊黑線檢測</p><p> EXTI1_Configration(); //中間黑線檢測</p><p> EXTI2_Configration(); //右邊黑線檢測</p><p> EXTI3_Configration(); //紅外控制端
105、口</p><p> TIM3_Configuration(); //定時器配置,用于超聲波測距</p><p><b> while(1)</b></p><p><b> {</b></p><p> KeepDistance();</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能小車課程設(shè)計--智能循跡小車
- 智能控制小車課程設(shè)計
- 智能小車課程設(shè)計--智能巡線小車的設(shè)計
- 課程設(shè)計--基于arm平臺的無線遙控小車設(shè)計報告
- 基于藍(lán)牙遙控智能小車設(shè)計
- 嵌入式課程設(shè)計--智能循跡小車設(shè)計
- 單片機(jī)課程設(shè)計--智能小車—硬件設(shè)計
- 單片機(jī)課程設(shè)計---電動智能小車
- 課程設(shè)計-- 智能小車循跡控制系統(tǒng)
- 單片機(jī)智能藍(lán)牙小車課程設(shè)計
- 智能小車課程設(shè)計說明書
- 藍(lán)牙智能遙控小車畢業(yè)設(shè)計論文
- 智能遙控避障小車畢業(yè)設(shè)計
- 基于藍(lán)牙遙控的智能小車設(shè)計
- 紅外遙控智能小車系統(tǒng)設(shè)計開題報告
- 遙控智能小車設(shè)計(含全套cad圖紙)
- 紅外遙控課程設(shè)計
- 課程設(shè)計--智能小車控制信號的fpga實現(xiàn)
- 綜合電子課程設(shè)計----智能循跡避障小車
- 遙控智能小車設(shè)計說明書.doc
評論
0/150
提交評論