武漢科技大學(xué)2012級智能汽車設(shè)計(jì)及制作論文_第1頁
武漢科技大學(xué)2012級智能汽車設(shè)計(jì)及制作論文_第2頁
武漢科技大學(xué)2012級智能汽車設(shè)計(jì)及制作論文_第3頁
武漢科技大學(xué)2012級智能汽車設(shè)計(jì)及制作論文_第4頁
武漢科技大學(xué)2012級智能汽車設(shè)計(jì)及制作論文_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、二一四二一五 學(xué)年第 一 學(xué)期信息科學(xué)與工程學(xué)院技術(shù)報(bào)告書課程名稱: 智能汽車設(shè)計(jì)與實(shí)踐 班 級: 自動(dòng)化1201 學(xué) 號(hào): 201204134013 姓 名: 指導(dǎo)教師: 章政 2014年12月24日基于紅外尋跡型智能汽車設(shè)計(jì)與制作為了方便智能汽車的結(jié)構(gòu)設(shè)計(jì),在設(shè)計(jì)的初期我們就打算采取模塊化的設(shè)計(jì)原理,對智能汽車實(shí)行模塊化的設(shè)計(jì)。論文以智能汽車的設(shè)計(jì)與制作的實(shí)現(xiàn)流程進(jìn)行模塊化的介紹:第一節(jié):制作技術(shù)的整體方案;第二節(jié):設(shè)計(jì)的思路:硬件,軟件設(shè)計(jì)與實(shí)現(xiàn)第三節(jié):問題與調(diào)試;第四節(jié):總結(jié)與回顧一制作技術(shù)的整體方案: 在實(shí)現(xiàn)智能車的過程中我們采用了各種的方案比對,對所有電路進(jìn)行模塊化接口化處理,大大

2、降低了電路在實(shí)現(xiàn)過程中出現(xiàn)的錯(cuò)誤,分為:電源接口模塊,傳感器模塊,電機(jī)驅(qū)動(dòng)模塊,數(shù)據(jù)傳輸與上位機(jī)模塊等。然后通過接口連接在一起,實(shí)現(xiàn)工作穩(wěn)定的智能車硬件電路。他使用了傳感器,編碼電機(jī),無線模塊,穩(wěn)壓管等作為重要的任務(wù)器件。實(shí)現(xiàn)了賽道識(shí)別,速度測控,賽車數(shù)據(jù)傳輸,電源穩(wěn)壓,速度控制等功能。 車模整體模型二.設(shè)計(jì)思路:1.硬件:圖1 電路板 圖2 前輪 圖3 后輪 圖4 舵機(jī) 圖5 電池的安裝 圖6 傳感器支架 圖7 傳感器2. 電路模塊:1.單片機(jī)及接口是焊接的第一個(gè)步驟,主要包括晶振(下)和復(fù)位電路(上)。2.紅外傳感器:光電傳感器一般有兩個(gè)部分組成:發(fā)射管和接收管。發(fā)射管發(fā)射光線,光線經(jīng)過賽

3、道的反射,由接收管接受,用過不同的光強(qiáng)接收管的狀態(tài)不同,實(shí)施賽道信息的采集,應(yīng)為白色和黑色對于光線反射的系數(shù)不同,放射會(huì)傀儡的光線的強(qiáng)度不一樣,被不同的接收單元接收后表現(xiàn)出不同的反應(yīng)狀態(tài)(電阻的變化,電流電壓的變化等)3.電源:為了使智能汽車的系統(tǒng)正常的工作,需要對電源電池電壓進(jìn)行調(diào)節(jié),其中單片機(jī)的路徑識(shí)別傳感器,測速模塊需要5V的電壓,用LM7805組成5V穩(wěn)壓電路。直流電機(jī)作在7.2V直接上電。因?yàn)殡姍C(jī),舵機(jī)要頻繁接加速減速,所以電壓波動(dòng)較大,5V電壓還要給51單片機(jī)供電,防止意外功能給點(diǎn)不足重啟再LM7805兩端加上大電解電容。4.舵機(jī): 5.撥碼開關(guān) 6.電機(jī)驅(qū)動(dòng)模塊:電機(jī)驅(qū)動(dòng)使用專用

4、電機(jī)的驅(qū)動(dòng)芯片ULN2803,系統(tǒng)利用單片機(jī)的PWM控制電機(jī)轉(zhuǎn)速,充分利用PWM模塊資源。電機(jī)PWM的頻率8KHz。3.軟件:/晶振 12MHz 1T模式 總線頻率12MHz,一個(gè)指令1/12us#include "STC12C5A60S2.H" /STC12C5A60S2的頭文件#include "nokia_5110.h"#include "key.h"#define uchar unsigned char /宏定義#define uint unsigned int#define T0_HIGH 0xff /T0計(jì)時(shí)器寄存器初值#

5、define T0_LOW 0x7f /溢出計(jì)數(shù)120個(gè),120*(1/12)定時(shí)周期10us#define MOTOR_MAX_PWM_COUNT 100 /PWM計(jì)數(shù)器最大值 10us*100=1ms,1000Hz#define SERVO_MAX_PWM_COUNT 2000/10us*2000=20ms,50HZ /舵機(jī)控制高電平0.52.5ms對應(yīng)PWM的50250 #define MOTOR_MAX_PWM 100 /電機(jī)PWM最大最小值#define MOTOR_MIN_PWM 0#define SERVO_LEFT_MAX_PWM 80 /min 90 /舵機(jī)左打最大角度時(shí)的P

6、WM#define SERVO_RIGHT_MAX_PWM 160 /max 150 /這個(gè)值需要自己根據(jù)舵機(jī)實(shí)際角度調(diào)試#define SERVO_MID_PWM 120/舵機(jī)中心值#define ERROR_HISTORY_NUM 3 /歷史偏差記錄個(gè)數(shù)#define MAX_ERROR_SUM 200 /積分幅值sbit LEFT_MOTOR_PWM_PORT=P37; / 電機(jī)PWM控制端口sbit RIGHT_MOTOR_PWM_PORT=P36;sbit SERVO_PWM_PORT=P35; /舵機(jī)PWM控制端口sbit PHL=P17;sbit change_line = P1

7、0;/獨(dú)立按鍵掃描sbit Add_1 = P14;sbit Sub_1 = P15;sbit KEY=P13; sbit Add_5 = P11;sbit Sub_5 = P12;sbit BOMA1=P07;bit control_period_finished=0; /控制周期結(jié)束標(biāo)志位,控制周期選擇20mschar motor_PWM_counter=0;/生成電機(jī)PWM的計(jì)數(shù)器char left_motor_PWM=0; /左右電機(jī)的PWM占空比 /由于數(shù)值在128以內(nèi),所以定義為charchar right_motor_PWM=0;int servo_PWM_counter=0;/

8、生成舵機(jī)PWM的計(jì)數(shù)器int servo_PWM=0;/舵機(jī)PWM /超過char型變量的范圍uchar infrared_state=0; /紅外管狀態(tài)uchar AD_value8; /紅外管電壓int error=0; /本次偏差int error_historyERROR_HISTORY_NUM=0; /歷史偏差int error_sum=0; /偏差的積分servo_P=30; /PID系數(shù)servo_I=4;servo_D=85;servo_F=8;servo_L=65;int PID_out=0; /PID輸出int P2H;int PH; speed_expect=95; /給

9、定速度 int worse=0;/-void sys_init(void) /系統(tǒng)初始化 /-IO口設(shè)置- P0M1=0x00; /撥碼,設(shè)置為輸出, P0M0=0xff; P0=0xff; /初始化為高電平,撥碼打開時(shí)為低電平 P1M1=0x00; /獨(dú)立按鍵,設(shè)置為準(zhǔn)雙向口 P1M0=0x00; P1=0xff; P2M1=0x00; /指示燈,設(shè)置為準(zhǔn)雙向口 P2M0=0x00; P2=0xff; P3M1=0x00; /模擬PWM,設(shè)置為輸出 P3M0=0xff; P3=0x00; LEFT_MOTOR_PWM_PORT=0; /PWM口設(shè)為低電平,電機(jī)不轉(zhuǎn) RIGHT_MOTOR_P

10、WM_PORT=0; left_motor_PWM=0; /占空比設(shè)置為0 right_motor_PWM=0; servo_PWM=SERVO_MID_PWM;/舵機(jī)打角到中心 /-定時(shí)器設(shè)置- AUXR=AUXR | 0x80; /定時(shí)器0不分頻 TMOD=0x11; /定時(shí)器方式1 TH0=T0_HIGH; /定時(shí)器賦初值 TL0=T0_LOW ; TR0=1; /定時(shí)器運(yùn)行 ET0=1; /開定時(shí)器中斷 EA=1; /開總中斷/-int ABS(int i) /絕對值函數(shù) if (i>=0) return i; else return -i;/-void delay(unsign

11、ed int i) /延時(shí)函數(shù) unsigned char j; for(;i>0;i-) for(j=0;j<250;j+);void get_black_position(void) /判斷黑線位置 PH=PHL; P2H=P2; PH=PH<<8; P2H=P2H + PH; switch(P2H & 0x1ff) /參考方案使用了8個(gè)紅外管 /case表示紅外管的狀態(tài),最多會(huì)有兩個(gè)紅外管在黑線上(根據(jù)紅外管焊接的距離而定,黑線寬度2.5cm) case 0x001: error=135;worse/=2; break; /000000001 0x01 /

12、右 case 0x003: error=115;worse/=2; break; /000000011 0x03 case 0x002: error=95;worse/=2; break; /000000010 0x02 case 0x006: error=75;worse/=2; break; /000000110 0x06 case 0x004: error=60;worse/=2; break; /000000100 0x04 case 0x00c: error=45;worse/=2; break; /000001100 0x0c case 0x008: error=30;worse/

13、=2; break; /000001000case 0x014: error=15;worse/=2; break; /000011000 000011000 case 0x010: error=0;worse/=2; break; /000010000 0x08 case 0x030: error=-15;worse/=2; break; /000110000 0x18 case 0x020: error=-30;worse/=2; break; /000100000 0x10 case 0x060: error=-45;worse/=2; break; /001100000 0x30 ca

14、se 0x040: error=-60;worse/=2; break; /001000000 0x20 case 0x0c0: error=-75;worse/=2; break; /011000000 0x60 case 0x080: error=-95;worse/=2; break; /010000000 0x40 case 0x180: error=-115;worse/=2; break; /110000000 0xC0 case 0x100: error=-135;worse/=2; break; /1 0000 0000 0x80 /左 case 0x00: error=err

15、or_historyERROR_HISTORY_NUM-1;worse+; break; /00000000 0x00 default: error=error_historyERROR_HISTORY_NUM-1;worse+; break; /其他情況時(shí),保持上一次偏差/-void servo_control(void) /舵機(jī)控制 char i=0; if(ABS(error-error_historyERROR_HISTORY_NUM-1)>120) /如果兩次的偏差過大,則保持上一次的偏差 error=error_historyERROR_HISTORY_NUM-1; /防止不

16、確定情況(如紅外管沖出跑道)造成的偏差跳變 for(i=0;i<ERROR_HISTORY_NUM-1;i+) /記錄偏差 error_historyi=error_historyi+1; error_historyERROR_HISTORY_NUM-1=error; /根據(jù)偏差計(jì)算舵機(jī)角度輸出 PID_out = ( 28*error_historyERROR_HISTORY_NUM-1 /比例 + servo_D*(error_historyERROR_HISTORY_NUM-1-error_historyERROR_HISTORY_NUM-2)/微分 )/150; /這里使用乘以一

17、個(gè)大的系數(shù)再除以一個(gè)數(shù)的方法 servo_PWM = SERVO_MID_PWM + PID_out; /控制舵機(jī) if(servo_PWM<SERVO_LEFT_MAX_PWM) /限幅 servo_PWM=SERVO_LEFT_MAX_PWM; /防止舵機(jī)超過極限值 if(servo_PWM>SERVO_RIGHT_MAX_PWM) servo_PWM=SERVO_RIGHT_MAX_PWM;void motor_control(void) /電機(jī)控制 char SUM=0 ; /歷次偏差和 char i=0; for(i=0;i<ERROR_HISTORY_NUM;i+

18、) /對歷次偏差絕對值求和 SUM=SUM+error_historyi; if(SUM <=25 &&SUM>=10) /向右拐 right_motor_PWM=speed_expect-2*servo_F*SUM/500; left_motor_PWM=speed_expect-servo_I*SUM/500; else if (SUM <=-10 &&SUM>-25) /向左拐 right_motor_PWM=speed_expect+servo_I*SUM/500; left_motor_PWM=speed_expect+serv

19、o_F*SUM/500; else if (SUM <=10 &&SUM>-10) /直線上 right_motor_PWM=speed_expect; left_motor_PWM=speed_expect; else right_motor_PWM=servo_L; left_motor_PWM=servo_L; if(BOMA1&&worse>=10) right_motor_PWM=0; left_motor_PWM=0; if(left_motor_PWM>MOTOR_MAX_PWM) /限幅 left_motor_PWM=MO

20、TOR_MAX_PWM; if(left_motor_PWM<MOTOR_MIN_PWM) left_motor_PWM=MOTOR_MIN_PWM; if(right_motor_PWM>MOTOR_MAX_PWM) right_motor_PWM=MOTOR_MAX_PWM; if(right_motor_PWM<MOTOR_MIN_PWM) right_motor_PWM=MOTOR_MIN_PWM;/-void main(void) sys_init(); /初始化 LCD_init(); pre_show(); while(KEY) KeyScan();if(KEY

21、) /如果檢測到低電平,說明按鍵按下 LCD_DLY_ms(10); /延時(shí)去抖,一般10-20ms if(KEY) /再次確認(rèn)按鍵是否按下,沒有按下則退出 while(KEY);/如果確認(rèn)按下按鍵等待按鍵釋放,沒有釋放則一直等待 KEY=0; while(1) get_black_position(); /判斷黑線位置 servo_control(); motor_control(); /控制電機(jī) while(control_period_finished=0); /等待控制周期20ms到達(dá),保證每次控制的時(shí)間間隔都相同 control_period_finished=0; /標(biāo)志位清零 /

22、-void TIME_BASE(void) interrupt 1 using 1 /定時(shí)器生成PWM /不清楚的可以參考PWM的定義 TH0=T0_HIGH; /賦初值 TL0=T0_LOW ; motor_PWM_counter+; /計(jì)數(shù)器+1 ,每+1表示10us servo_PWM_counter+; if(motor_PWM_counter>MOTOR_MAX_PWM_COUNT) /PWM比較、生成 motor_PWM_counter=1; /從1開始計(jì)數(shù) if(servo_PWM_counter>SERVO_MAX_PWM_COUNT) /PWM比較、生成 serv

23、o_PWM_counter=1; /從1開始計(jì)數(shù) control_period_finished=1; /20ms控制周期到達(dá),標(biāo)志位置1,這里借用了舵機(jī)控制周期20ms(50Hz), /如果更改主程序控制周期,可定義一個(gè)類似于servo_PWM_counter的計(jì)數(shù)器計(jì)時(shí) if(left_motor_PWM>=motor_PWM_counter) /左右PWM LEFT_MOTOR_PWM_PORT=1; /端口輸出高電平 else LEFT_MOTOR_PWM_PORT=0; /端口輸出低電平 if(right_motor_PWM>=motor_PWM_counter) RIG

24、HT_MOTOR_PWM_PORT=1; else RIGHT_MOTOR_PWM_PORT=0; if(servo_PWM>=servo_PWM_counter)/舵機(jī)PWM SERVO_PWM_PORT=1; else SERVO_PWM_PORT=0;3 問題與調(diào)試:在燒制程序后不是開始直接上賽道,而是分塊的開始調(diào)試個(gè)個(gè)模塊的功能,基本功能是否可以實(shí)現(xiàn),檢查硬件的焊接,接口的連接,在保證個(gè)個(gè)模塊的基本性能是好的以后再開始滿足測速和平穩(wěn)性。改變算法或則改變機(jī)械組裝的方式達(dá)到改善性能的目的??傊⌒〉闹恢悄芷嚂?huì)有很多問題的出現(xiàn),通過不斷地調(diào)試次啊能不斷地的調(diào)試方法不能一舉。在這里我

25、以自己出現(xiàn)的問題為例加以說明。里面涉及到的主要問題就是舵機(jī),因?yàn)槎鏅C(jī)自身的問題為此找過章政老師兩次,當(dāng)然有一次也麻煩到了孫平學(xué)長幫我檢測。后來換上好的舵機(jī)以后就得考慮算法問題,最后還是采用的老師所給出的PID算法,不過考慮到積分時(shí)間與舵機(jī)的脈沖時(shí)間,發(fā)現(xiàn)I實(shí)際上是沒有多大的作用分,于是最后直接采用的是PD算法。對于速度的測試,原本打算利用測速碼盤采用閉環(huán)控制,后來由于感覺比賽臨近來不及(當(dāng)然后來推遲了幾次),于是放棄了閉環(huán)控制。因此,只能依賴于硬件以及對傳感器的控制上面。為了讓傳感器有很好的控制,能夠靈敏的反應(yīng),于是之前利用一個(gè)板子上面有一條黑線的測試了好幾次,確定在黑白不同位置舵機(jī)能夠有所反

26、應(yīng)。但是當(dāng)我把車子放到賽道上時(shí),發(fā)現(xiàn)她并不能像之前想象的那樣行駛,原因是由于傳感器由于光線的原因無法做出正確的反應(yīng),當(dāng)然這樣舵機(jī)就無法得到正確的脈寬,于是出現(xiàn)不能做出正確的轉(zhuǎn)向的問題。后來只能在跑道上,對每一個(gè)燈加上熱縮管,改變其接受到的紅外光強(qiáng)度,最后獲得了最佳狀態(tài)。隨著速度的增加,或多或少傳感器都會(huì)出現(xiàn)晃動(dòng),然而我們知道晃動(dòng)會(huì)影響到接受紅外光的強(qiáng)度,最終導(dǎo)致舵機(jī)無法正常的偏轉(zhuǎn)。于是我又用膠槍把傳感器那部分直接膠死,然后加了兩個(gè)黑色支架對傳感器支架進(jìn)行了固定(利用三角形的穩(wěn)定性)?;蛟S正是因?yàn)槲覍鞲衅鬟@樣的設(shè)計(jì),因此它的壽命以及抗干擾的能力提高了很多。當(dāng)然這一點(diǎn)從平時(shí)練習(xí)跑時(shí),不管事我撞別

27、人還是別人撞我,以及意外的撞到墻上,傳感器基本沒有什么影響可以看出。針對車子會(huì)撞到墻上,也就是意外的沖出跑道,采取了未填學(xué)長的保護(hù)程序。這樣的確有了很好的保護(hù),不過發(fā)現(xiàn)有時(shí)候它會(huì)在全白的跑道減速甚至停止,盡管并沒有沖出跑道,但是依然無法正常的比賽。后來為了防止在正式的比賽不會(huì)出現(xiàn)這種狀況,我加了一個(gè)撥碼開關(guān),可以選擇開或者關(guān)保護(hù)程序。賽車可以完整的跑完賽道以后,現(xiàn)在需要的就是如何讓它穩(wěn)定而且快速的跑完賽道。對于采用開環(huán)控制的我來說這就需要硬件達(dá)到更高的高度,還有就是參數(shù)得盡量達(dá)到完美。之前對傳感器的改善讓我對硬件有了很大的提高。剩下的就是參數(shù)得改變。為了讓PD控制的更加精確,我增加了error

28、得值,同時(shí)將PD控制除以得分母增加了。里面error的值是根據(jù)多次賽道試跑改變的。再就是加了一個(gè)彎度得判斷,再她左拐時(shí),左輪和右輪都減速,左輪比右輪減速更多。同理對右拐時(shí)也是如此。為了得到最佳的參數(shù),我給出了I,F(xiàn)參數(shù),其中F大于I,利用right_motor_PWM=speed_expect+servo_I*SUM/500;left_motor_PWM=speed_expect+servo_F*SUM/500;其中SUM是幾次拐彎error的總和,根據(jù)SUM的正負(fù)判斷是作怪還是右拐(上面以左拐為例,左輪的速度在原來的基礎(chǔ)上減去的更多)。后來發(fā)現(xiàn)當(dāng)SUM大到一定的值時(shí)這種控制并不科學(xué),于是又給了一個(gè)參數(shù)L來判斷彎度多大時(shí)用什么控制。再確定以后,又將L換成速度參數(shù)直接在當(dāng)SUM太大時(shí)同時(shí)給定左右輪速度。因?yàn)槔锩娴膮?shù)(包括PD)都是利用按鍵控制以及顯示屏顯示,因此在參數(shù)調(diào)節(jié)上有了很大的便利。最后當(dāng)SUM的值小時(shí),給它原來的速度,SUM大時(shí)利用差輪減速,然后SUM更大時(shí)直

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論