利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)_第1頁(yè)
利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)_第2頁(yè)
利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)_第3頁(yè)
利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)_第4頁(yè)
利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、利用紅外發(fā)射接收傳感器進(jìn)行距離檢測(cè)一、實(shí)驗(yàn)要求對(duì)紅外的發(fā)射接收作進(jìn)一步的探討。紅外可以用來(lái)測(cè)距離,理解紅外測(cè)距的基本原理,能夠掌握簡(jiǎn)單的比例控制方法,以及編程。掌握定時(shí)/計(jì)數(shù)器的使用。對(duì)循跡效果作分析。二、實(shí)驗(yàn)概要本實(shí)驗(yàn)將探討紅外測(cè)距的內(nèi)容。利用紅外檢測(cè)器的內(nèi)置電子濾波功能,調(diào)節(jié)發(fā)射紅外的載波頻率,而檢測(cè)器對(duì)不同頻率的信號(hào)有不同的“敏感度”,這樣,就能大概的知道距離。1測(cè)試紅外的掃描頻率。記錄紅外發(fā)射接收的距離。2尾隨小車(chē)。讓一個(gè)小車(chē)跟著另一個(gè)小車(chē)前行。要將前后距離控制在一定的范圍內(nèi),若前后距離較大,后面跟隨的小車(chē)應(yīng)該加速,跟上去;若距離小于預(yù)定值,則減速。3跟蹤黑色條紋帶。紅外測(cè)距的另一種形

2、式的應(yīng)用。也能讓小車(chē)實(shí)現(xiàn)循跡功能。三、實(shí)驗(yàn)內(nèi)容紅外技術(shù)發(fā)展到現(xiàn)在,已經(jīng)為大家所熟知,這種技術(shù)已經(jīng)在現(xiàn)代科技、國(guó)防和工農(nóng)業(yè)等領(lǐng)域獲得了廣泛的應(yīng)用。紅外傳感系統(tǒng)是用紅外線為介質(zhì)的測(cè)量系統(tǒng),按照功能能夠分成五類(lèi):(1)輻射計(jì),用于輻射和光譜測(cè)量;(2)搜索和跟蹤系統(tǒng),用于搜索和跟蹤紅外目標(biāo),確定其空間位置并對(duì)它的運(yùn)動(dòng)進(jìn)行跟蹤;(3)熱成像系統(tǒng),可產(chǎn)生整個(gè)目標(biāo)紅外輻射的分布圖像;(4)紅外測(cè)距和通信系統(tǒng);(5)混合系統(tǒng),是指以上各類(lèi)系統(tǒng)中的兩個(gè)或者多個(gè)的組合。紅外傳感器根據(jù)探測(cè)機(jī)理可分成為:光子探測(cè)器(基于光電效應(yīng))和熱探測(cè)器(基于熱效應(yīng))。本次試驗(yàn)將嘗試用紅外來(lái)測(cè)距。1測(cè)試掃描頻率下圖9-1顯示的是

3、一個(gè)特殊品牌的紅外線探測(cè)器數(shù)據(jù)表(Panasonic PNA4602M)的部分摘錄。這個(gè)摘錄顯示了紅外線探測(cè)器在接收到頻率不同于38.5 kHz時(shí)紅外線信號(hào)時(shí)其敏感程度隨頻率變化的曲線圖。例如,當(dāng)你發(fā)送頻率為40 kHz的信號(hào)給探測(cè)器時(shí),它的靈敏度是頻率為38.5 kHz的50%。如果紅外LED發(fā)送頻率為42 kHz,探測(cè)器的靈敏度是頻率為38.5 kHz的20%左右。尤其是對(duì)于讓探測(cè)器的靈敏度很底的頻率,為了讓探測(cè)器探測(cè)到紅外線的反射,物體必須離探測(cè)器更近讓反射的紅外光更強(qiáng)。另一個(gè)角度來(lái)考慮就是最高靈敏度的頻率可以探測(cè)最遠(yuǎn)距離的物體,較低靈敏度的頻率可以探測(cè)距離較近的物體。這使得距離探測(cè)就簡(jiǎn)

4、單了。選擇5個(gè)不同頻率,然后從最高靈敏度到最低靈敏度進(jìn)行測(cè)試。首先嘗試最高靈敏度頻率,如果物體被探測(cè)到了,就讓僅次于它的高靈敏度頻率測(cè)試,觀察是否可以探測(cè)到。依賴于探測(cè)器不能再檢測(cè)到物體的紅外線頻率,我們就可以推斷物體的大概位置。圖 9-1 濾波器靈敏度由載波頻率決定圖 9-2 探測(cè)區(qū)域例程:TestLeftFrequencySweep.c例程要做兩件事情:首先,測(cè)試IR LED/探測(cè)器(分別與P1_3和P1_2連接)以確認(rèn)它們的距離探測(cè)功能正常;然后,完成圖9-2所示的頻率掃描。#include<BoeBot.h>#include<uart.h>#define Lef

5、tIR P1_2 /左邊紅外接受連接到P1_2 #define LeftLaunch P1_3 /左邊紅外發(fā)射連接到P1_3unsigned int time;/定時(shí)時(shí)間值int leftdistance;/左邊的距離int distanceLeft, irDetectLeft;unsigned int frequency5=29370,31230,33050,35700,38460;void timer_init(void)IE=0x82; /開(kāi)總中斷EA,允許定時(shí)器0中斷ET0TMOD |= 0X01;/定時(shí)器0工作在模式1:16位定時(shí)器模式void FreqOut(unsigned in

6、t Freq)time = 256 - (500000/Freq);/根據(jù)頻率計(jì)算初值 TH0 = 0XFF;/高八位設(shè)FF TL0 = time;/低八位根據(jù)公式計(jì)算 TR0 = 1;/啟動(dòng)定時(shí)器 delay_nus(800);/延時(shí) TR0 = 0;/停止定時(shí)器void Timer0_Interrupt(void) interrupt 1/定時(shí)器中斷LeftLaunch = LeftLaunch;/取反 TH0 = 0xFF;/重新設(shè)值 TL0 = time;void Get_lr_Distances()unsigned int count; leftdistance = 0; /初始化左

7、邊的距離 for(count = 0;count<5;count+) FreqOut(frequencycount);/發(fā)射頻率 irDetectLeft = LeftIR;printf("irDetectLeft = %d",irDetectLeft); if(irDetectLeft = 1) leftdistance+; int main(void)uart_Init(); timer_init(); printf("Progam Running!n"); printf("FREQENCY ETECTEDn"); whil

8、e(1) Get_lr_Distances(); printf("distanceLeft = %dn",leftdistance);printf("-n"); delay_nms(1000); Tips:TestLeftFrequencySweep.c是如何工作的?還記得“數(shù)組”嗎?這里你將用整數(shù)型數(shù)組存儲(chǔ)五個(gè)頻率值:unsigned int frequency5=29370,31230,33050,35700,38460;uart_Init();串口的初始化,這個(gè)函數(shù)已多次用到。timer_init();定時(shí)器的初始化。此例程使定時(shí)器0工作在模式1,

9、16位定時(shí)模式,不具備自動(dòng)重載功能。注意,timer_init()并沒(méi)有開(kāi)啟定時(shí)器。Get_lr_Distances();機(jī)器人要發(fā)射某一頻率,該給定時(shí)器設(shè)定多大的值呢?頻率為f時(shí),周期T=1/f,高低電平持續(xù)時(shí)間為t=1/(2T),根據(jù)公式TC=2n-CC可算定時(shí)器初值time:但實(shí)際上,time值并未占滿低八位,所以你可以這樣簡(jiǎn)化計(jì)算:高八位設(shè)0xFF,低八位根據(jù)n=8時(shí)計(jì)算,即函數(shù)FreqOut(frequencycount)中用的time = 256 - (500000/Freq)來(lái)計(jì)算。當(dāng)?shù)桶宋挥?jì)滿后,整個(gè)寄存器將溢出。根據(jù)圖6-2所示的描述原理,如果檢測(cè)結(jié)果irDetectLeft

10、為1,即沒(méi)有發(fā)現(xiàn)物體,則距離leftdistance加1。循環(huán)描述,當(dāng)5個(gè)頻率描完后,可根據(jù)leftdistance的值來(lái)判斷物體離機(jī)器人的大致距離。運(yùn)行程序時(shí),在機(jī)器人前端放一白紙,前后移動(dòng)白紙,調(diào)試終端將會(huì)顯示白紙所在的區(qū)域,如圖9-3所示。圖9-3 距離探測(cè)輸出實(shí)例程序通過(guò)計(jì)算 “1” 出現(xiàn)的數(shù)量,就可以確定目標(biāo)在哪個(gè)區(qū)域。緊記,這種距離測(cè)量方法是相對(duì)的而非絕對(duì)地精確。然而,它為機(jī)器人跟隨,跟蹤和其他行為提供了一個(gè)足夠好的探測(cè)距離的能力。l 輸入、保存并運(yùn)行程序TestLeftFrequencySweep.cl 用一張紙或卡片面對(duì)IR LED/探測(cè)器做距離探測(cè)l 改變紙片與機(jī)器人距離,記

11、錄使distanceLeft變化的位置該你了測(cè)試右邊的IR LED/探測(cè)器l 修改程序TestLeftFrequencySweep.c,對(duì)右邊的IR LED/探測(cè)器做距離探測(cè)測(cè)試l 運(yùn)行該程序,檢驗(yàn)這對(duì)IR LED/探測(cè)器能否測(cè)量同樣的距離。你可參考教材配套光盤(pán)對(duì)應(yīng)例程中的注釋部分。例程:DisplayBothDistances.cl 修改程序TestLeftFrequencySweep.c,添加右邊IR LED/探測(cè)器部分l 輸入、保存并運(yùn)行程序DisplayBothDistances.cl 用紙片重復(fù)對(duì)每個(gè)IR LED進(jìn)行距離探測(cè),然后對(duì)兩個(gè)IR LED同時(shí)進(jìn)行測(cè)試該你了更多的距離測(cè)試l

12、嘗試測(cè)量不同物體的距離,弄清物體的顏色和(或)材質(zhì)是否會(huì)造成距離測(cè)量的差異2尾隨小車(chē)讓一個(gè)寶貝車(chē)跟隨另一個(gè)寶貝車(chē)行走,跟隨的寶貝車(chē),也叫尾隨車(chē),必須知道距離引導(dǎo)車(chē)有多遠(yuǎn)。如果尾隨車(chē)落在后面,它必須能察覺(jué)并加速。如果尾隨車(chē)距離引導(dǎo)車(chē)太近,它也要能察覺(jué)并減速。如果當(dāng)前距離正好合適,它會(huì)等待直到測(cè)量距離變遠(yuǎn)或變近。 距離僅僅是由機(jī)器人和其它自動(dòng)化機(jī)器需要控制一種數(shù)值之一。當(dāng)一個(gè)機(jī)器被設(shè)計(jì)用來(lái)自動(dòng)維持某一數(shù)值,比如距離、壓力或液位等,它一般都包含一個(gè)控制系統(tǒng)。這些系統(tǒng)有時(shí)由傳感器和閥門(mén)組成,或者由傳感器和電機(jī)組成。在寶貝車(chē)?yán)锩妫蓚鞲衅骱瓦B續(xù)旋轉(zhuǎn)電機(jī)組成。還必須有某些處理器可以接受傳感器的測(cè)量結(jié)果并把

13、它們轉(zhuǎn)化為機(jī)械運(yùn)動(dòng)。必須對(duì)處理器編程來(lái)基于傳感器的輸入做出決定,從而控制機(jī)械輸出。 閉環(huán)控制是一種常用的維持控制目標(biāo)數(shù)據(jù)的方法,它很好地幫助寶貝車(chē)保持與一個(gè)物體之間的距離。閉環(huán)控制算法類(lèi)型多種多樣,最常用的有滯后、比例、積分以及微分控制。所有這些控制方法都將在過(guò)程控制教材中詳細(xì)介紹。 事實(shí)上,圖9-4所示的方框圖描述了寶貝車(chē)用到的比例控制過(guò)程的步驟,即寶貝車(chē)用右邊的IR LED/探測(cè)器探測(cè)距離并用右邊的伺服電機(jī)調(diào)節(jié)機(jī)器人之間的位置以維持適當(dāng)?shù)木嚯x。圖9-4 右邊的伺服電機(jī)及IR LED/探測(cè)器的比例控制方框圖讓我們仔細(xì)觀察一下圖9-4的數(shù)字,學(xué)習(xí)一下比例控制是如何工作的。這個(gè)特殊的例子是右邊的

14、IR LED/探測(cè)器和右邊的伺服電機(jī)的比例控制方框圖。設(shè)定位置為2,說(shuō)明我們想寶貝車(chē)維持它和任何它探測(cè)到的物體之間的距離是2。測(cè)量的距離為4,距離太遠(yuǎn)。誤差是設(shè)定值減去測(cè)量值的差,即2 - 4 = - 2 ,這在圓圈的左方以符號(hào)的形式指出,這個(gè)圓圈叫求和點(diǎn)。接著,誤差傳入一個(gè)操作框。這個(gè)操作框顯示,誤差將乘以一個(gè)比例常數(shù)Kp。Kp的值為70。該操作框的輸出顯示為2×70 = 140,這叫輸出校正。這個(gè)輸出校正結(jié)果輸入到另一個(gè)求和點(diǎn),這時(shí)它與電機(jī)的零點(diǎn)脈沖寬度1500相加。相加的結(jié)果是1360,這個(gè)脈寬可以讓電機(jī)大約以3/4全速順時(shí)針旋轉(zhuǎn)。這讓寶貝車(chē)右輪向前、朝著物體的方向旋轉(zhuǎn)。 第二

15、次經(jīng)過(guò)閉環(huán),測(cè)量距離可能發(fā)生變化,但是沒(méi)有問(wèn)題,因?yàn)椴还軠y(cè)量距離如何變,這個(gè)控制環(huán)路將會(huì)計(jì)算出一個(gè)數(shù)值,讓電機(jī)旋轉(zhuǎn)來(lái)糾正任何誤差。修正值與誤差總是成比例關(guān)系,該誤差就是設(shè)定位置和測(cè)量位置的關(guān)系的偏差??刂骗h(huán)都有一組方程來(lái)主導(dǎo)系統(tǒng)行為。圖9-4中的方框圖是對(duì)該組方程的可視化描述方法。下面是從方框圖中歸納出來(lái)的方程關(guān)系及結(jié)果: Error = Right distance set point Measured right distance = 2 4 Output adjus = error·Kp = 2 ·70 = 140 Right servo output = Outpu

16、t adjust + Center pulse width = 140 +1500 = 1360 通過(guò)一些置換,上面三個(gè)等式可被簡(jiǎn)化為一個(gè),提供你相同的結(jié)果: Right servo output = (Right distance set point Measured right distance) Kp+ Center pulse width 代入數(shù)值,我們可以看到結(jié)果一致: = (2 4)·70) + 1500 = 1360 左邊的IR LED/探測(cè)器以及左邊的伺服電機(jī)的控制框圖如圖9-5所示,與右邊的運(yùn)算法則類(lèi)似。不同的是比例系數(shù)Kp的值由+70變?yōu)闉?70。假設(shè)與右邊的測(cè)量

17、值一樣,輸出修正的脈沖寬度應(yīng)該為1640。下面是該框圖的計(jì)算等式: Left servo output = (Left distance set point Measured left distance) Kp + Center pulse width = (2 4)·(70) +1500圖 9-5 機(jī)器人左伺服電機(jī)及 IR Led/探測(cè)器的比例控制方框圖例程:FollowingRobot.c該例程實(shí)現(xiàn)剛才討論過(guò)的各個(gè)伺服脈沖比例控制。換句話說(shuō),在每個(gè)脈沖發(fā)送之前,需要測(cè)量距離,決定誤差信號(hào),然后將誤差值乘以比例系數(shù)Kp,再將結(jié)果加上(或減去)發(fā)送到左(或右)伺服電機(jī)的脈沖寬度值。l

18、 輸入、保存并運(yùn)行程序FollowingRobot.cl 把大小為20×28cm的紙片置于機(jī)器人的前面,就像障礙物墻。機(jī)器人應(yīng)該維持它和紙片之間的距離為預(yù)定的距離l 嘗試輕輕旋轉(zhuǎn)一下紙片,機(jī)器人應(yīng)該跟隨之旋轉(zhuǎn)l 嘗試用紙片引導(dǎo)機(jī)器人四處運(yùn)動(dòng),機(jī)器人應(yīng)該跟隨它l 移動(dòng)紙片距離機(jī)器人特別近時(shí),機(jī)器人應(yīng)該后退,遠(yuǎn)離紙片#include <BoeBot.h>#include <uart.h>#define LeftIR P1_2 /左邊紅外接受連接到P1_2 #define RightIR P3_5 /右邊紅外接收連接到P3_5#define LeftLaunch P

19、1_3 /左邊紅外發(fā)射連接到P1_3#define RightLaunch P3_6 /右邊紅外發(fā)射連接到P3_6#define Kpl -70#define Kpr 70#define SetPoint 2#define CenterPulse 1500 unsigned int time;int leftdistance,rightdistance;/左邊和右邊的距離int delayCount,distanceLeft,distanceRight,irDetectLeft,irDetectRight;unsigned int frequency5=29370,31230,33050,35

20、700,38460;void timer_init(void)IE=0x82; /開(kāi)總中斷EA,允許定時(shí)器0中斷ET0 TMOD |= 0X01;/定時(shí)器0工作在模式1:16位定時(shí)器模式void FreqOut(unsigned int Freq)time = 256 - (50000/Freq); TH0 = 0XFF ; TL0 = time ; TR0 = 1; delay_nus(800); TR0 = 0;void Timer0_Interrupt(void) interrupt 1LeftLaunch = LeftLaunch; RightLaunch= RightLaunch;

21、TH0 = 0XFF; TL0 = time;void Get_lr_Distances()unsigned char count; leftdistance = 0; /初始化左邊的距離 rightdistance = 0; /初始化右邊的距離 for(count = 0;count<5;count+) FreqOut(frequencycount); irDetectRight = RightIR; irDetectLeft = LeftIR; if (irDetectLeft = 1) leftdistance+; if (irDetectRight = 1) rightdista

22、nce+; void Send_Pulse(unsigned int pulseLeft,unsigned int pulseRight)P1_1=1; delay_nus(pulseLeft); P1_1=0; P1_0=1; delay_nus(pulseRight); P1_0=0; delay_nms(18);int main(void)unsigned int pulseLeft,pulseRight; uart_Init(); timer_init(); while(1) Get_lr_Distances(); pulseLeft=(SetPoint-leftdistance)*K

23、pl+CenterPulse; pulseRight=(SetPoint-rightdistance)*Kpr+CenterPulse; Send_Pulse(pulseLeft,pulseRight); Tips:FollowingRobot.c是如何工作的?主程序做的第一件事是調(diào)用Get_lr_Distances子函數(shù)。Get_lr_Distances函數(shù)運(yùn)行完成之后,變量leftdistance和rightdistance分別包含一個(gè)與區(qū)域相對(duì)應(yīng)的數(shù)值,該區(qū)域里的目標(biāo)被左、右紅外線探測(cè)器探測(cè)到。隨后兩行代碼對(duì)每個(gè)電機(jī)執(zhí)行比例控制計(jì)算:pulseLeft =(SetPoint - left

24、distance)* Kpl + CenterPulsepulseRight =(SetPoint rightdistance) * Kpr + CenterPulse最后調(diào)用子函數(shù)Send_Pulse對(duì)電機(jī)的速度進(jìn)行調(diào)節(jié)。因?yàn)槟阋龅膶?shí)驗(yàn)是尾隨,串口線的連接影響了機(jī)器人的運(yùn)動(dòng),故可去掉。該你了圖9-6所示是引導(dǎo)車(chē)和尾隨車(chē)。引導(dǎo)車(chē)運(yùn)行的程序是FastIrRoaming.c修改后的版本,尾隨車(chē)運(yùn)行的程序是FollowingRobot.c。比例控制讓尾隨車(chē)成為忠實(shí)的追隨者。一個(gè)引導(dǎo)車(chē)可以引導(dǎo)一串大概6到7個(gè)尾隨車(chē)。只需要把導(dǎo)引車(chē)的側(cè)面板和后擋板加到其它的尾隨車(chē)上。圖9-6 導(dǎo)引機(jī)器人(左)和尾隨機(jī)

25、器人(右)l 如果你是班級(jí)成員之一,把紙板安裝在導(dǎo)引小車(chē)的兩側(cè)和尾部,參考圖9-6l 如果你不屬于班級(jí)成員的一部分(并且只有一個(gè)機(jī)器人),可以讓尾隨車(chē)跟隨一張紙或你的手來(lái)運(yùn)動(dòng),就和跟隨導(dǎo)引車(chē)一樣l 用阻值為1k或2k的電阻替換掉連接機(jī)器人紅外線發(fā)光二極管的470電阻l 使用程序FastIrRoaming.c修改后的版本對(duì)導(dǎo)引機(jī)器人編程來(lái)做避障試驗(yàn),打開(kāi)程序FastIrRoaming.c重命名為SlowerIrRoamingForLeadRobot.cl 對(duì)程序SlowerIrRoamingForLeadRobot.c做以下修改:n 把1300的增加為1420n 把1700的減少為1580l 尾

26、隨車(chē)運(yùn)行程序FollowingRobot.c,不用做任何修改l 機(jī)器人都運(yùn)行自己的程序,把尾隨車(chē)放在引導(dǎo)車(chē)的后面。尾隨車(chē)應(yīng)該跟隨一個(gè)固定的距離,只要它不被其它的諸如手或附近墻壁等引開(kāi)你可以通過(guò)調(diào)整SetPoint和比例常數(shù)來(lái)改變尾隨車(chē)的行為。用手或一張紙片來(lái)引導(dǎo)尾隨車(chē),做下面練習(xí):l 嘗試用30到100范圍內(nèi)的常量Kpr和Kpl來(lái)運(yùn)行程序FollowingRobot.c,注意機(jī)器人在跟隨目標(biāo)運(yùn)動(dòng)的時(shí)候的響應(yīng)有何差異l 嘗試調(diào)節(jié)常量SetPoint的值,范圍從0到43跟蹤條紋帶圖9-8是你可以搭建的一個(gè)路徑并編程使機(jī)器人跟它運(yùn)動(dòng)的例子。路徑中每個(gè)條紋帶是由三條1/4英寸寬的聚乙烯絕緣帶邊對(duì)邊并行

27、放置在白色招貼板上組成的,絕緣帶條紋之間不能漏出白色板。1)搭建和測(cè)試路線為了成功跟蹤該路徑,測(cè)試和調(diào)節(jié)機(jī)器人是必要的。需要的材料:(1)一張招貼板大概尺寸: 22 X 28 英寸 (56 X 71 cm)(2)1/4英寸(19 mm)寬黑色聚乙烯絕緣帶一卷l 參考圖9-7用白色招貼板和絕緣帶搭建運(yùn)行路徑 圖9-7 條紋帶跟蹤 圖9-8 紅外探測(cè)器朝下掃描條紋帶2)測(cè)試條紋帶l 調(diào)節(jié)IR LED/探測(cè)器的位置向下和向外,如圖6-8所示l 確保絕緣帶路徑不受熒光燈干擾l 用1k電阻代替與IR LED串聯(lián)的470電阻,使機(jī)器人更加近視l 運(yùn)行程序DisplayBothDistances.c。機(jī)器人

28、與串口電纜相連,以便你能看到顯示的距離l 如圖9-9所示,把機(jī)器人放在白色招貼板上l 驗(yàn)證你的區(qū)域讀數(shù)是否表示被探測(cè)的物體在很近的區(qū)域,兩個(gè)傳感器給你的讀數(shù)都是1或0l 放置機(jī)器人使兩個(gè)IR LED/檢測(cè)器都直接指向三條絕緣帶的中心,如圖9-10和9-11所示,然后調(diào)整機(jī)器人的位置(靠近或遠(yuǎn)離絕緣帶)直到兩個(gè)區(qū)域的值都達(dá)到4或者5,這表明要么發(fā)現(xiàn)一個(gè)很遠(yuǎn)的物體,要么沒(méi)有發(fā)現(xiàn)物體 圖9-9 低區(qū)域測(cè)試俯視圖l 如果在你的絕緣帶路徑上很難獲得比較高的讀數(shù)值,參考絕緣帶路徑排錯(cuò)部分圖9-10 高區(qū)域測(cè)試頂視圖 圖9-11 高區(qū)域測(cè)試(側(cè)視圖)3)絕緣帶路徑排錯(cuò)如果當(dāng)IR LED/檢測(cè)器指向絕緣帶路徑

29、的中心的時(shí)候你不能獲得比較高的讀數(shù)值,代替原來(lái)三條絕緣帶用四條絕緣帶搭建路徑。如果區(qū)域讀數(shù)仍然低,確認(rèn)你是用1k電阻串聯(lián)在IR LED上。你可以試用2k電阻使機(jī)器人更加近視。如果都不行,試試不同的絕緣帶。調(diào)整IR LED/探測(cè)器,使它們指向更靠近或更遠(yuǎn)離機(jī)器人的前部可能有幫助。如果當(dāng)讀白色表面時(shí)你的低區(qū)域測(cè)試有問(wèn)題。試試將IR LED/探測(cè)器朝機(jī)器人的方向再向下調(diào)整,但是要注意不要讓底盤(pán)帶來(lái)干擾。你也可以試試一個(gè)更低阻值的電阻。如果你用老的縮小包裝的IR LED代替帶套筒的IR LED,當(dāng)IR LED/探測(cè)器聚焦在白色背景上時(shí)你要得到一個(gè)低區(qū)域的值可能有問(wèn)題。這些IR LED可能需要串聯(lián)220

30、電阻。也要確保IR LED的腳沒(méi)有相互接觸。l 現(xiàn)在,將機(jī)器人放在絕緣帶路徑上,它的輪子正好跨在黑色線上。IR探測(cè)器應(yīng)該稍稍向外,如圖9-12。驗(yàn)證兩個(gè)距離讀數(shù)是否又是0或者1。如果讀數(shù)較高,意味著IR探測(cè)器需要再稍微朝遠(yuǎn)離絕緣帶邊緣的方向向外調(diào)整一下圖9-12 IR檢測(cè)器朝向放大圖當(dāng)你把機(jī)器人沿圖中雙箭頭所示的任何一個(gè)方向移動(dòng),兩個(gè)IR中的一個(gè)會(huì)指向絕緣帶上。當(dāng)你做了這些后,這個(gè)指向絕緣帶上的IR的讀數(shù)應(yīng)該增加到4或5。記住如果你將機(jī)器人向左移動(dòng),右邊檢測(cè)器的值會(huì)增加,如果你將機(jī)器人向右移動(dòng),左邊檢測(cè)器的值會(huì)升高。l 調(diào)整IR LED/檢測(cè)器直到機(jī)器人通過(guò)這個(gè)最后的測(cè)試,然后你可以試驗(yàn)下面的

31、例程使機(jī)器人沿著條紋帶行走4)編程跟蹤條紋帶你只需對(duì)程序FollowingRobot.c做一點(diǎn)小小的調(diào)整,就可以使機(jī)器人跟蹤條紋帶行走。首先,機(jī)器人應(yīng)當(dāng)向目標(biāo)靠近,以使到目標(biāo)的距離比SetPoint要??;或遠(yuǎn)離目標(biāo),以使距離比SetPoint大,這同程序FollowingRobot.c的表現(xiàn)相反。當(dāng)機(jī)器人離物體的距離不在SetPoint的范圍內(nèi)時(shí),讓機(jī)器人向相反的方向運(yùn)動(dòng)。只需簡(jiǎn)單地更改Kpl和Kpr的符號(hào),換句話說(shuō),將Kpl由-70改為70;由Kpr由70改為-70。你應(yīng)該做試驗(yàn),當(dāng)SetPoint從2到4時(shí),看哪個(gè)值使系統(tǒng)工作穩(wěn)定。下面的例程將SetPoint值改為3。例程:StripeF

32、ollowingRobot.cl 打開(kāi)程序FollowingRobot.c另存為StripeFollowingRobot.cl 將SetPoint的值由2改為3l 將Kpl由-70改為70l 將Kpr由70改為-70l 運(yùn)行程序l 將機(jī)器人放在圖9-7所示的“Start”位置,機(jī)器人將靜止。如果你把手放在IR組前面,然后它會(huì)向前移動(dòng),當(dāng)它走過(guò)了開(kāi)始的條紋帶時(shí),把手移開(kāi),它會(huì)沿著條紋帶行走。當(dāng)它看到“Finish”條紋帶時(shí),它應(yīng)該停止不動(dòng)l 假定你從絕緣帶獲得的距離讀數(shù)為5,從白色招貼板獲得的讀數(shù)為0,SetPoint的常量值為2、3 以及4時(shí)都可以正常工作。嘗試不同的SetPoint值,注意機(jī)

33、器人在條紋帶上運(yùn)行時(shí)的性能附錄:定時(shí)/計(jì)數(shù)器的運(yùn)用實(shí)驗(yàn)需要用到單片機(jī)更精確的定時(shí)功能,因此再回顧一下51單片機(jī)定時(shí)/計(jì)數(shù)器的使用方法。單片機(jī)的定時(shí)/計(jì)數(shù)器能夠提供更精確的時(shí)間。前面已經(jīng)介紹了幾種延時(shí)方法,除了空操作函數(shù)_nop_()外,定時(shí)/計(jì)數(shù)器能產(chǎn)生更精確的延時(shí),它的最小延時(shí)單位為1個(gè)機(jī)器周期。前面講過(guò):若晶振頻率為12MHz,則延時(shí)單位為1us;若為11.0592MHz,則延時(shí)單位為1.08us。單片機(jī)P89V51RD2的定時(shí)/計(jì)數(shù)器可以分為定時(shí)器模式和計(jì)數(shù)器模式。其實(shí)這兩種模式?jīng)]有本質(zhì)上的區(qū)別,均使用二進(jìn)制的加一計(jì)數(shù):當(dāng)計(jì)數(shù)器的值計(jì)滿回零時(shí)能自動(dòng)產(chǎn)生中斷的請(qǐng)求,以此來(lái)實(shí)現(xiàn)定時(shí)或者計(jì)數(shù)功

34、能。它們的不同之處在于定時(shí)器使用單片機(jī)的時(shí)鐘來(lái)計(jì)數(shù),而計(jì)數(shù)器使用的是外部信號(hào)。定時(shí)/計(jì)數(shù)器的控制單片機(jī)P89V51RD2有3個(gè)定時(shí)/計(jì)數(shù)器,通過(guò)TCON和TMOD這兩個(gè)特殊功能寄存器控制。TCON和TMOD你都可以在頭文件uart.h中看到其應(yīng)用。TCON為定時(shí)器控制寄存器,有8位,每個(gè)位的含義為如表9-1所示。TCON的低4位與定時(shí)器無(wú)關(guān),它們用于檢測(cè)和觸發(fā)外部中斷。表 9-1 TCON控制寄存器位符 號(hào)描述TCON.7TF1定時(shí)器1溢出標(biāo)志位。由硬件置位,由軟件清除TCON.6TR1定時(shí)器1運(yùn)行控制位。由軟件置或清除:置1為啟動(dòng);置0為停止TCON.5TF0定時(shí)器0溢出標(biāo)志位TCON.4T

35、R0定時(shí)器0運(yùn)行控制位TCON.3IE1外部中斷1邊沿觸發(fā)標(biāo)志TCON.2IT1外部中斷1類(lèi)型標(biāo)志位TCON.1IE0外部中斷0邊沿觸發(fā)標(biāo)志TCON.0IT0外部中斷0類(lèi)型標(biāo)志位TMOD為定時(shí)器模式寄存器,它也有8位,但不能像TCON一樣可以一位一位的設(shè)置,只能通過(guò)字節(jié)傳送指令來(lái)設(shè)定TMOD的各個(gè)狀態(tài)。TMOD的各位定義如表9-2所示。表9-2 TMOD模式寄存器位名字定時(shí)器描述7GATE1門(mén)控制。當(dāng)被置為1時(shí),只有為高電平時(shí),定時(shí)器才開(kāi)始工作61定時(shí)/計(jì)數(shù)器選擇位:1=計(jì)數(shù)器;0=定時(shí)器5M11模式位1(見(jiàn)表6-3)4M01模式位0(見(jiàn)表6-2)3GATE0定時(shí)器0的門(mén)控制位20定時(shí)器0的定

36、時(shí)/計(jì)數(shù)選擇位1M10定時(shí)器0的模式位10M00定時(shí)器0的模式位0表9-3 定時(shí)器工作模式M1M0模式000011102113工作模式每個(gè)定時(shí)/計(jì)數(shù)器都有一個(gè)16位的寄存器Tn(n=0或1)來(lái)控制計(jì)數(shù)長(zhǎng)度,由高8位THn和低8位TLn置初值。定時(shí)/計(jì)數(shù)器有四種工作模式。模式0:定時(shí)/計(jì)數(shù)器按13位自加1計(jì)數(shù)器工作。這13位由TH的全部8位和TL中的低5位組成,TL中的高3位沒(méi)有用到。模式1:定時(shí)/計(jì)數(shù)器按16位自加1計(jì)數(shù)器工作。模式2:定時(shí)/計(jì)數(shù)器被拆成一個(gè)8位寄存器TH和一個(gè)8位計(jì)數(shù)器TL,以便實(shí)現(xiàn)自動(dòng)重載。這種模式使用起來(lái)非常方便,一旦設(shè)置好TMOD和THn,定時(shí)器就可以按設(shè)定好的周期溢出

37、。模式3:TH0和TL0均作為兩個(gè)獨(dú)立的8位計(jì)數(shù)器工作。定時(shí)器1在模式3下不工作。定時(shí)/計(jì)數(shù)器初值的計(jì)算定時(shí)/計(jì)數(shù)器是在計(jì)數(shù)初值的基礎(chǔ)上加法記數(shù)的,假設(shè)Tn(TLn和THn)中寫(xiě)入的值為T(mén)C,在該模式下最大計(jì)數(shù)值為2n,程序運(yùn)行的計(jì)數(shù)值為CCTC=2n-CC回顧一下,前面的實(shí)驗(yàn)中已經(jīng)用LED來(lái)測(cè)試電路,通過(guò)延時(shí)函數(shù)使LED每隔一段時(shí)間閃爍一次。在實(shí)驗(yàn)中,你是否可以通過(guò)定時(shí)/計(jì)數(shù)器來(lái)實(shí)現(xiàn)LED測(cè)試電路呢?假設(shè)通過(guò)P1_0所接的燈每0.4ms閃動(dòng)一次,即每過(guò)0.2ms滅一次,再過(guò)0.2ms亮一次。模式2最大計(jì)數(shù)值為256us(28),滿足要求,因此用模式2來(lái)顯示LED燈閃爍功能,計(jì)數(shù)的值CC為0.

38、2ms/1us=200。利用公式計(jì)算得出TC=256-200=59,換成十六進(jìn)制為T(mén)C=0x38。例程:TimeApplication.cl 搭建LED的測(cè)試電路(具體請(qǐng)參照第二章內(nèi)容)l 接通教學(xué)板的電源l 輸入、保存并運(yùn)行程序Time_Application.cl 驗(yàn)證與P1_0連接的LED是否每個(gè)0.4ms閃爍一次#include <reg51.H>#include <stdio.h>void initial(void); /子函數(shù)聲明void main(void)initial(); /調(diào)用定時(shí)/計(jì)數(shù)器初始化函數(shù) while(1); /等待中斷/*= 初始化定時(shí)

39、/計(jì)數(shù)器函數(shù)=*/void initial(void) IE=0x82; /開(kāi)總中斷EA,允許定時(shí)器0中斷ET0 TCON=0x00; /停止定時(shí)器,清除標(biāo)志 TMOD=0x02; /工作在定時(shí)器0的模式2中TH0=0x38; /設(shè)置重載值 TL0=0x38; /設(shè)置定時(shí)器初值 TR0=1; /啟動(dòng)定時(shí)器0/中斷服務(wù)程序void TIMER(void) interrupt 1 /中斷服務(wù)程序,1是定時(shí)器0的中斷號(hào) P1_0=P1_0; /P1_0的值取反TimeApplication.c是如何工作的?在程序開(kāi)頭,你看到了兩個(gè)頭文件reg51.h和stdio.h,它們有什么用呢?打開(kāi)這兩個(gè)頭文件(reg51.h在“C:Program FilesKeilC51INC”目錄下,stdio.h在“C:Program FilesKeilC51INC”目錄下),你可以看到:在reg51.h中對(duì)一些標(biāo)識(shí)符進(jìn)行了聲明,如P1_0(可能沒(méi)有,要自己在程序中定義)、IE、TCON等;而stdio.h對(duì)常用的一些IO函數(shù)進(jìn)行了聲明,如printf()等。在程序中,一個(gè)函數(shù)的定義可以放在任意位置,既可放在主函數(shù)main之前,也可放在main之后,但如果放在main之

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論