51小車軟件手冊(cè).doc_第1頁
51小車軟件手冊(cè).doc_第2頁
51小車軟件手冊(cè).doc_第3頁
51小車軟件手冊(cè).doc_第4頁
51小車軟件手冊(cè).doc_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

51小車作為一種入門小車,其基本原理與飛思卡爾比賽的小車相似,共分為硬件和軟件兩個(gè)部分。其中軟件部分可分為傳感器數(shù)據(jù)采集,舵機(jī)控制,速度控制等,這里現(xiàn)在對(duì)51小車的軟件進(jìn)行一個(gè)詳細(xì)的介紹1.程序思路概述:首先51單片機(jī)需要通過紅外傳感器監(jiān)測(cè)道路信息,然后將傳感器得到的數(shù)據(jù)進(jìn)行轉(zhuǎn)換。最后將轉(zhuǎn)換后的數(shù)據(jù)通過某種控制算法,計(jì)算出舵機(jī)和電機(jī)的控制量,使小車能夠沿著跑道行駛。主體控制流程可以表示為如下圖形:2.程序算法2.1數(shù)據(jù)采集 小車傳感器為個(gè)紅外對(duì)管,經(jīng)過電壓比較器后,每個(gè)紅外對(duì)管都有和兩種狀態(tài)。因此,個(gè)紅外對(duì)管產(chǎn)生的數(shù)據(jù)剛好為個(gè)字節(jié)。因此程序有兩種方式將這位數(shù)據(jù)讀入:1、可以將/口數(shù)據(jù)當(dāng)做一個(gè)字節(jié),直接賦給一個(gè)字符變量;2、將8位數(shù)據(jù)按位讀取,分別賦給字符變量的每一位。我們的示例程序中采用的就是第二種方法。2.2數(shù)據(jù)處理 由于讀入的數(shù)據(jù)并不方便直接參與控制計(jì)算,因此先將該數(shù)據(jù)集分成類,分別對(duì)應(yīng)于小車不同的位置信息,由-7+7表示,其中+7表示引導(dǎo)線位于小車最左側(cè),0表示引導(dǎo)線位于小車中部,-7表示引導(dǎo)線位于小車最右側(cè),8表示未檢測(cè)到引導(dǎo)線或其他錯(cuò)誤情況。2.3控制算法上面的轉(zhuǎn)換后的數(shù)據(jù)可以作為控制計(jì)算的輸入,即小車與賽道的偏差信息。方向的控制算法可以采用位置型PD算法。 其中為比例環(huán)節(jié),簡(jiǎn)單的說就是根據(jù)當(dāng)前小車與賽道的偏差直接進(jìn)行控制,偏離多少就轉(zhuǎn)多少,偏離越多,舵機(jī)轉(zhuǎn)向越多??梢酝ㄟ^調(diào)節(jié)比例系數(shù)改變轉(zhuǎn)向的幅度。系數(shù)越大,轉(zhuǎn)向幅度越大,轉(zhuǎn)向越快。稱為微分環(huán)節(jié),這里的微分信息指上面偏差信息的微分,可以簡(jiǎn)單理解為小車偏離賽道的速率??梢院?jiǎn)單的將本次的偏差信息與上一次偏差的差值算作微分項(xiàng)。微分項(xiàng)的控制方法是說,小車偏離跑道越快,方向就要轉(zhuǎn)的越多,反之則轉(zhuǎn)向越小。因此當(dāng)小車逐漸靠近跑道時(shí),微分項(xiàng)可以使小車偏轉(zhuǎn)量減小,使小車不至于偏向另一邊??梢酝ㄟ^改變微分項(xiàng)的系數(shù)來改變這種調(diào)節(jié)作用的程度。一般來講,微分系數(shù)越大,小車對(duì)于彎道的響應(yīng)就越靈敏,行駛時(shí)也更穩(wěn)定。由于小車在不同的位置時(shí),可能需要不同的比例系數(shù)或微分系數(shù),因此可以考慮在不同的情況下,采用不同的系數(shù)進(jìn)行運(yùn)算。示例程序中采用的就是這種方法。 速度控制也可以采用算法進(jìn)行控制。為了使程序簡(jiǎn)單化,示例程序中采用了勻速的控制方式。想要提高成績(jī)的同學(xué)可以自行加入速度控制程序.生成 由于51單片機(jī)沒有PWM模塊,因此需要通過通用I/O口進(jìn)行模擬來輸出舵機(jī)和電機(jī)所需的PWM波。 可以分別使用一個(gè)定時(shí)器來作為一路PWM波的計(jì)時(shí)器。先將I/O口置位,通過高電平時(shí)間確定好定時(shí)器的初值,當(dāng)定時(shí)器產(chǎn)生中斷時(shí),再將I/O口清零,并設(shè)定低電平時(shí)間,由此循環(huán)即可產(chǎn)生PWM波。其中,高電平時(shí)間由上面的控制計(jì)算得出,低電平時(shí)間由PWM周期減去高電平時(shí)間得到。#include /包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件#include /*定義數(shù)據(jù)類型(方便移植)*/typedef unsigned char UINT8;typedef char SINT8;typedef unsigned int UINT16;typedef int SINT16;/*/*定義布爾值(增強(qiáng)程序可讀性)*/#define HIGH_LEVEL 1#define LOW_LEVEL 0/*/*定義相關(guān)常數(shù)(移植于不同的小車時(shí),需根據(jù)實(shí)際情況改變?cè)摮?shù)*/#define SERVOMID 1270/舵機(jī)中值#define SERVOMOSTLEFT 1680/舵機(jī)左值#define SERVOMOSTRIGHT 870/舵機(jī)右值#define SERVO_PERIOD 20000/舵機(jī)PWM周期:20ms,晶振12M公式:計(jì)數(shù)值=定時(shí)時(shí)間*晶振/頻率/12,如20ms:計(jì)數(shù)值=0.02 s * 12 000 000 Hz/12 = 20000#define MOTOR_PERIOD 10000/電機(jī)PWM周期:10ms,晶振12M/*/*輸出口定義*/sbit SevorPort = P01; sbit MotorPort = P06; sbit P20 = P20;sbit P21 = P21;sbit P22 = P22;sbit P23 = P23;sbit P24 = P24;sbit P25 = P25;sbit P26 = P26;sbit P27 = P27;/*/*定義公共變量*/UINT8 KServoD=10;/舵機(jī)D參數(shù)UINT8 KServoP5=65,40,10,40,65;/舵機(jī)分段P參數(shù)UINT8 SampleData=0;/采樣數(shù)據(jù)SINT8 Offset=0;/當(dāng)前賽道位置SINT8 LastOffset2=0;/上一次賽道位置UINT16 SevorPWM=0;/舵機(jī)PWM高電平時(shí)間UINT16 MotorPWM=0;/電機(jī)PWM高電平時(shí)間/*/*初始化函數(shù)*/void Init(void)TMOD=0x11;/定時(shí)器0,16位工作方式;定時(shí)器1,16位工作方式TR0=1;/啟動(dòng)定時(shí)器0TR1=1;/啟動(dòng)定時(shí)器1ET0=1;/打開定時(shí)器0中斷ET1=1;/打開定時(shí)器0中斷EA=1;/打開總中斷/*數(shù)據(jù)采樣函數(shù)*/void Sample(void)SampleData=0;if(P20=0)SampleData|=0x01;if(P22=0)SampleData|=0x02;if(P21=0)SampleData|=0x04;if(P23=0)SampleData|=0x08;if(P24=0)SampleData|=0x10;if(P26=0)SampleData|=0x20;if(P25=0)SampleData|=0x40;if(P27=0)SampleData|=0x80;/*確定賽道位置*/void ConfirmLocation(void)switch(SampleData)/根據(jù)采集到的值進(jìn)行判斷case 0x80:Offset=7;break;/1000 0000最左邊1個(gè)光電傳感器檢測(cè)到黑線case 0xc0:Offset=6;break;/1100 0000最左邊2個(gè)光電傳感器檢測(cè)到黑線case 0x40:Offset=5;break;/0100 0000依次類推case 0x60:Offset=4;break;/0110 0000case 0x20:Offset=3;break;/0010 0000case 0x30:Offset=2;break;/0011 0000case 0x10:Offset=1;break;/0001 0000case 0x18:Offset=0;break;/0001 1000case 0x08:Offset=-1;break;/0000 1000case 0x0c:Offset=-2;break;/0000 1100case 0x04:Offset=-3;break;/0000 0100case 0x06:Offset=-4;break;/0000 0110case 0x02:Offset=-5;break;/0000 0010case 0x03:Offset=-6;break;/0000 0011case 0x01:Offset=-7;break;/0000 0001default:Offset=8;break;/其余情況包括跑道丟失于檢測(cè)錯(cuò)誤/*賽道位置數(shù)據(jù)濾波(減少某次采樣錯(cuò)誤對(duì)系統(tǒng)的干擾)*/void Filter(void)if (Offset=8)/濾除錯(cuò)誤信號(hào),沒有檢測(cè)到黑線(是需要保持上一次測(cè)量值的)Offset=LastOffset0;else if(abs(Offset-LastOffset0)5) /濾除尖峰信號(hào)Offset=LastOffset0; /*舵機(jī)控制函數(shù)*/void ServoCtrl(void)UINT8p=0,d=0;SINT16 PID=0;if(Offset=-7&Offset=-4&Offset=-1&Offset=2&Offset=5&OffsetSERVOMOSTLEFT)SevorPWM=SERVOMOSTLEFT;/限幅if(SevorPWMSERVOMOSTRIGHT)SevorPWM=SERVOMOSTRIGHT; /限幅/*舵機(jī)測(cè)試函數(shù)*/ServoTest()/ SevorPWM=SERVOMID;/測(cè)試舵機(jī)中值SevorPWM=SERVOMOSTLEFT;/測(cè)試舵機(jī)極左值/ SevorPWM=SERVOMOSTRIGHT;/測(cè)試舵機(jī)極右值/*速度控制函數(shù)*/void MotorCtrl(void)MotorPWM=3000;/*數(shù)據(jù)存儲(chǔ)函數(shù)*/void SaveData(void)static UINT8 TCnt2=0;if(TCnt2=20)LastOffset1=LastOffset0;TCnt2=0;TCnt2+;LastOffset0=Offset;/*主函數(shù)*/void main(void)Init();/初始化while (1)Sample();/采樣ConfirmLocation();/確認(rèn)黑線位置Filter();/濾波ServoCtrl();/舵機(jī)控制/ServoTest();/舵機(jī)測(cè)試MotorCtrl();/電機(jī)控制SaveData();/*舵機(jī)定時(shí)器中斷函數(shù)*/void TC0Isr(void) interrupt 1static UINT8 TC20msFlag=LOW_LEVEL;/舵機(jī)輸出狀態(tài)標(biāo)志UINT16 LowlvlTime=0;UINT16 HighlvlTime=0;if(TC20msFlag=HIGH_LEVEL)LowlvlTime=65535-(SERVO_PERIOD-SevorPWM);TH0=LowlvlTime/256;TL0=LowlvlTime%256;SevorPort=LOW_LEVEL;TC20msFlag=LOW_LEVEL;elseHighlvlTime=65535-SevorPWM;TH0=HighlvlTime/256;TL0=HighlvlTime%256;SevorPort=HIGH_LEVEL;TC20msFlag=HIGH_LEVEL;/*電機(jī)定時(shí)器中斷函數(shù)*/void TC1Isr(void) interrupt 3static UINT8 TC10msFlag=LOW_LEVEL;/舵機(jī)輸出狀態(tài)標(biāo)志UINT16 LowlvlTime=0;UINT16 HighlvlTime=0;if(TC10msFlag=HIGH_LEVEL)Low

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論