




已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
51小車作為一種入門小車,其基本原理與飛思卡爾比賽的小車相似,共分為硬件和軟件兩個部分。其中軟件部分可分為傳感器數(shù)據(jù)采集,舵機控制,速度控制等,這里現(xiàn)在對51小車的軟件進行一個詳細的介紹1.程序思路概述:首先51單片機需要通過紅外傳感器監(jiān)測道路信息,然后將傳感器得到的數(shù)據(jù)進行轉換。最后將轉換后的數(shù)據(jù)通過某種控制算法,計算出舵機和電機的控制量,使小車能夠沿著跑道行駛。主體控制流程可以表示為如下圖形:2.程序算法2.1數(shù)據(jù)采集 小車傳感器為個紅外對管,經(jīng)過電壓比較器后,每個紅外對管都有和兩種狀態(tài)。因此,個紅外對管產生的數(shù)據(jù)剛好為個字節(jié)。因此程序有兩種方式將這位數(shù)據(jù)讀入:1、可以將/口數(shù)據(jù)當做一個字節(jié),直接賦給一個字符變量;2、將8位數(shù)據(jù)按位讀取,分別賦給字符變量的每一位。我們的示例程序中采用的就是第二種方法。2.2數(shù)據(jù)處理 由于讀入的數(shù)據(jù)并不方便直接參與控制計算,因此先將該數(shù)據(jù)集分成類,分別對應于小車不同的位置信息,由-7+7表示,其中+7表示引導線位于小車最左側,0表示引導線位于小車中部,-7表示引導線位于小車最右側,8表示未檢測到引導線或其他錯誤情況。2.3控制算法上面的轉換后的數(shù)據(jù)可以作為控制計算的輸入,即小車與賽道的偏差信息。方向的控制算法可以采用位置型PD算法。 其中為比例環(huán)節(jié),簡單的說就是根據(jù)當前小車與賽道的偏差直接進行控制,偏離多少就轉多少,偏離越多,舵機轉向越多。可以通過調節(jié)比例系數(shù)改變轉向的幅度。系數(shù)越大,轉向幅度越大,轉向越快。稱為微分環(huán)節(jié),這里的微分信息指上面偏差信息的微分,可以簡單理解為小車偏離賽道的速率??梢院唵蔚膶⒈敬蔚钠钚畔⑴c上一次偏差的差值算作微分項。微分項的控制方法是說,小車偏離跑道越快,方向就要轉的越多,反之則轉向越小。因此當小車逐漸靠近跑道時,微分項可以使小車偏轉量減小,使小車不至于偏向另一邊??梢酝ㄟ^改變微分項的系數(shù)來改變這種調節(jié)作用的程度。一般來講,微分系數(shù)越大,小車對于彎道的響應就越靈敏,行駛時也更穩(wěn)定。由于小車在不同的位置時,可能需要不同的比例系數(shù)或微分系數(shù),因此可以考慮在不同的情況下,采用不同的系數(shù)進行運算。示例程序中采用的就是這種方法。 速度控制也可以采用算法進行控制。為了使程序簡單化,示例程序中采用了勻速的控制方式。想要提高成績的同學可以自行加入速度控制程序.生成 由于51單片機沒有PWM模塊,因此需要通過通用I/O口進行模擬來輸出舵機和電機所需的PWM波。 可以分別使用一個定時器來作為一路PWM波的計時器。先將I/O口置位,通過高電平時間確定好定時器的初值,當定時器產生中斷時,再將I/O口清零,并設定低電平時間,由此循環(huán)即可產生PWM波。其中,高電平時間由上面的控制計算得出,低電平時間由PWM周期減去高電平時間得到。#include /包括一個52標準內核的頭文件#include /*定義數(shù)據(jù)類型(方便移植)*/typedef unsigned char UINT8;typedef char SINT8;typedef unsigned int UINT16;typedef int SINT16;/*/*定義布爾值(增強程序可讀性)*/#define HIGH_LEVEL 1#define LOW_LEVEL 0/*/*定義相關常數(shù)(移植于不同的小車時,需根據(jù)實際情況改變該常數(shù)*/#define SERVOMID 1270/舵機中值#define SERVOMOSTLEFT 1680/舵機左值#define SERVOMOSTRIGHT 870/舵機右值#define SERVO_PERIOD 20000/舵機PWM周期:20ms,晶振12M公式:計數(shù)值=定時時間*晶振/頻率/12,如20ms:計數(shù)值=0.02 s * 12 000 000 Hz/12 = 20000#define MOTOR_PERIOD 10000/電機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;/舵機D參數(shù)UINT8 KServoP5=65,40,10,40,65;/舵機分段P參數(shù)UINT8 SampleData=0;/采樣數(shù)據(jù)SINT8 Offset=0;/當前賽道位置SINT8 LastOffset2=0;/上一次賽道位置UINT16 SevorPWM=0;/舵機PWM高電平時間UINT16 MotorPWM=0;/電機PWM高電平時間/*/*初始化函數(shù)*/void Init(void)TMOD=0x11;/定時器0,16位工作方式;定時器1,16位工作方式TR0=1;/啟動定時器0TR1=1;/啟動定時器1ET0=1;/打開定時器0中斷ET1=1;/打開定時器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ù)采集到的值進行判斷case 0x80:Offset=7;break;/1000 0000最左邊1個光電傳感器檢測到黑線case 0xc0:Offset=6;break;/1100 0000最左邊2個光電傳感器檢測到黑線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;/其余情況包括跑道丟失于檢測錯誤/*賽道位置數(shù)據(jù)濾波(減少某次采樣錯誤對系統(tǒng)的干擾)*/void Filter(void)if (Offset=8)/濾除錯誤信號,沒有檢測到黑線(是需要保持上一次測量值的)Offset=LastOffset0;else if(abs(Offset-LastOffset0)5) /濾除尖峰信號Offset=LastOffset0; /*舵機控制函數(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; /限幅/*舵機測試函數(shù)*/ServoTest()/ SevorPWM=SERVOMID;/測試舵機中值SevorPWM=SERVOMOSTLEFT;/測試舵機極左值/ SevorPWM=SERVOMOSTRIGHT;/測試舵機極右值/*速度控制函數(shù)*/void MotorCtrl(void)MotorPWM=3000;/*數(shù)據(jù)存儲函數(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();/確認黑線位置Filter();/濾波ServoCtrl();/舵機控制/ServoTest();/舵機測試MotorCtrl();/電機控制SaveData();/*舵機定時器中斷函數(shù)*/void TC0Isr(void) interrupt 1static UINT8 TC20msFlag=LOW_LEVEL;/舵機輸出狀態(tài)標志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;/*電機定時器中斷函數(shù)*/void TC1Isr(void) interrupt 3static UINT8 TC10msFlag=LOW_LEVEL;/舵機輸出狀態(tài)標志UINT16 LowlvlTime=0;UINT16 HighlvlTime=0;if(TC10msFlag=HIGH_LEVEL)Low
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防工程師技術實務模擬試卷案例分析與解析
- 保育老師培訓大綱
- 2025年人力資源管理師專業(yè)技能考核試卷:人力資源管理與組織效能試題
- 2025年小學二年級語文生字注音與組詞能力測試卷(全冊覆蓋)
- 2025年上海市閔行區(qū)六年級上學期期末數(shù)學考試卷(幾何圖形計算與數(shù)學思維拓展與應用)
- 內科護理胃炎講解
- 戒毒知識與康復指導
- 2025年注冊造價工程師案例分析模擬試卷及答案
- 貴州省黔西南州2020-2021學年高一下學期期末檢測試題(生物)
- 2025年考研數(shù)學(一)高等代數(shù)知識體系構建與空間解析幾何問題求解卷
- 研究生英語翻譯答案
- 小學生1-6年級成長檔案模板(絕對原創(chuàng))
- GB 15607-2023涂裝作業(yè)安全規(guī)程粉末靜電噴涂工藝安全
- 創(chuàng)傷性胸腔積液查房
- 蘇州鄰里中心調研報告以及應用
- 手表買賣合同協(xié)議書
- 2023門面裝修合同范本
- 旅游接待計劃表
- 《教育研究方法》教學課件-教育實驗研究
- 4施工過程各階段質量安全的保證措施
- 產品方案技術白皮書模板(含系統(tǒng)架構說明書)
評論
0/150
提交評論