第一篇:智能車電磁組報告
目錄
一.學(xué)分認定書 …… …………………………………………XX 二.實驗報告 …… ………………………………………………XX 三.智能車制作研究報告 ……………………………………… XX 四.心得體會 ………………………………………………… XX 五.附錄:程序源代碼………………………………………… … XX
(要求:給出一級目錄,宋體加粗,四號字,1.5倍行距。)
一.學(xué)分認定書(每個隊員1份)二.實驗報告
實驗一.通用輸入輸出口和定時中斷
一、實驗?zāi)康?/p>
1.掌握 MC9S12XS128 匯編語言對通用端口的操作指令。2.掌握程序中指令循環(huán)和跳轉(zhuǎn)的方法。
3.學(xué)會使用程序延時,并會大概估算延遲時間。
二、實驗任務(wù)
1.將 PORTA 口接八位DIP 開關(guān),PORTB口接七段數(shù)碼管顯示,PORTK控制四個數(shù)碼管其中某一個顯示。
2.采用定時中斷方式,利用八位DIP 開關(guān)輸入二進制數(shù),數(shù)碼管顯示其十進制數(shù)。
三、實驗內(nèi)容
實驗中每個通用輸入輸出端口要用到的寄存器都有兩個,端口定義寄存器和端口方向寄存器。以 A 端口為例,端口定義寄存器為PORTA和端口方向寄存器為DDRA。在MC9S12XS128的DATASHEET 上可以查到DDRA的地址是0x00(輸入), DDRB的地址是0xFF(輸出), DDRK的地址是0xFF(輸出)。則初始化端口PORTA、PORTB、PORTK的語句為: void initGPIO(void){ DDRA = 0x00;DDRB = 0xFF;DDRK= 0xFF;}
置0 表示該位為接受輸入位,置1 表示該位為輸出位。
MC9S12DP256/DG128 中可以使用實時時鐘或增強型定時器來完成定時功能,二者是相互獨立的。本實驗中用實時時鐘定時。實時時鐘的可以通過對外部晶振分頻而得到一個定時中斷。RTICTL 是實時時鐘控制寄存器,向該寄存器寫入內(nèi)容,通過查表會得到一個分頻因子,外部晶振除以分頻因子就是中斷的頻率了。因為外部晶振頻率是16MHz,要得到1ms中斷一次,需要16000分頻。在MC9S12XS128的DATASHEET 上可以查到RTICTL設(shè)置為0x8F, 中斷允許寄存器CRGINT設(shè)置為0x80(開中斷)。則初始化中斷程序為: void InitRTI(void){ RTICTL = 0x8F;CRGINT = 0x80;} 一但進入中斷,即開始讀PORTA口的二進制數(shù),并轉(zhuǎn)換為十進制,通過PORTB口顯示出來。由于是數(shù)碼管動態(tài)顯示,PORTK口控制四個數(shù)碼管輪流顯示。具體程序見開發(fā)板例程中——SevenSegmentDigitalTube。
四、思考題
1.如果不用PORTA口做輸入,直接讓單片機內(nèi)部從0—9999自動計數(shù),并在PORTB口顯示出計數(shù)過程,PORTK口控制四個數(shù)碼管輪流顯示,程序該如何改? 對程序的修改如下:
void interrupt 7 RTI_INT(void){ time++;if(time >=50){ 2 time=0;Count_Num++;LedData[0] = Count_Num/1000%10;LedData[1] = Count_Num/100%10;LedData[2] = Count_Num/10%10;LedData[3] = Count_Num%10;if(Count_Num >=9999){ Count_Num=0;} } PORTK = 0x01 << LedNum;PORTB = LedCode[LedData[LedNum]];LedNum++;if(LedNum >= 4)LedNum = 0;CRGFLG = 0x80;} 這樣便可以在數(shù)碼管中顯示動態(tài)顯示0000—9999,經(jīng)試驗檢測該方法正確。
實驗二.A/D轉(zhuǎn)換實驗
一、實驗?zāi)康?/p>
了解 S12 單片機ADC 模塊的使用方法。
二、實驗任務(wù)
用 S12 的ADC 模塊將一路(或多路)模擬電平轉(zhuǎn)換成數(shù)字量,并將轉(zhuǎn)換結(jié)果顯示在數(shù)碼管上,或者通過SCI 發(fā)送到PC 終端顯示出來。
三、實驗內(nèi)容
1、與 S12 的ADC 模塊相關(guān)的寄存器如下,各寄存器的詳細定義可參閱datasheet。ATDCTL2:控制寄存器。主要設(shè)置A/D 標志位清除方式、A/D 采樣觸發(fā)方式、是否允許A/D 采樣完成中斷等。
ATDCTL3:控制寄存器。主要設(shè)置每次A/D 轉(zhuǎn)換采樣幾路電平、采樣結(jié)果的存儲方式等。
ATDCTL4:控制寄存器。主要設(shè)置A/D 轉(zhuǎn)換精度、A/D 轉(zhuǎn)換時鐘頻率等。
ATDCTL5:控制寄存器。主要設(shè)置A/D 轉(zhuǎn)換結(jié)果的對齊方式和數(shù)據(jù)類型,以及A/D 的采樣模式(連續(xù)采樣/單詞采樣,順序轉(zhuǎn)換/單通道轉(zhuǎn)換等)
ATDSTAT0:狀態(tài)標志寄存器。包括A/D 轉(zhuǎn)換完成標志,出錯標志、轉(zhuǎn)換結(jié)果存儲索引等標志位。
ATDTEST1:測試寄存器。
ATDSTAT1:標志寄存器。標識一次A/D 轉(zhuǎn)換中各通道的完成情況。
以上寄存器的具體內(nèi)容和其他與 ADC 模塊相關(guān)的寄存器請參看datasheet 相應(yīng)章節(jié)。
2、本實驗采取AN14單通道連續(xù)AD轉(zhuǎn)換模式,且結(jié)果存放在ATD0DR0L中, 轉(zhuǎn)換序列長度為1,轉(zhuǎn)換精度為8位,在freeze模式下繼續(xù)轉(zhuǎn)換。通過查看datasheet,得出ATD0初始化程序如下:void ATD0_init(void){ ATD0CTL1=0x0e;//轉(zhuǎn)換精度為8位,從AN14通道轉(zhuǎn)換 ATD0CTL2=0x40;//禁止外部觸發(fā), 中斷禁止 ATD0CTL2_ASCIE = 1;//允許中斷
ATD0CTL3=0x88;//轉(zhuǎn)換序列長度為1,在freeze模式下繼續(xù)轉(zhuǎn)換 ATD0CTL4=0xFF;ATD0CTL5=0x2E;//單通道連續(xù)AD轉(zhuǎn)換模式 } 具體程序見開發(fā)板例程中——testAN14。
四、預(yù)習(xí)要求
(1)參考datasheet 明確ADC 各寄存器的作用,主要思考以下問題: 1.A/D 轉(zhuǎn)換的時鐘應(yīng)該是多少?如何設(shè)置分頻因子? 答:A/D 轉(zhuǎn)換的時鐘應(yīng)該是如下:
其中PRS為ATDCLT4中的后五位。
2.A/D 轉(zhuǎn)換如何啟動?有幾種啟動方式?分別如何設(shè)置相關(guān)寄存器?
答:可以用ATD0CLT2去給ATD模塊上電,有五種上電(觸發(fā)方式)分別如下:設(shè)置ATD0CLT2中的10~12位。第10位為0時忽略外部觸發(fā),為1時則使用內(nèi)部觸發(fā)。但第十位為1時,前兩位為00,01,10,11,分別對應(yīng)下降沿觸發(fā),上升沿觸發(fā),低電平觸發(fā),高電平觸發(fā)。3.每次A/D 轉(zhuǎn)換啟動那幾路電平采樣?采樣結(jié)果如何存儲(注意FIFO 的A/D 轉(zhuǎn)換模式)?采樣結(jié)果的數(shù)據(jù)類型(8 位/10 位?左對齊/右對齊?有符號數(shù)/無符號數(shù)?)? 答: 每次啟動那一路轉(zhuǎn)化得看ATD0CTL5中的設(shè)置。采樣結(jié)果的儲存也是在該寄存器控制的。采樣結(jié)果的位數(shù)也是該寄存器控制。如ATD0CTL5 = 00110000時該結(jié)果為左對齊無符號型數(shù)據(jù)是連續(xù)轉(zhuǎn)化,多通道轉(zhuǎn)化。并且從0通道開始轉(zhuǎn)化。4.如何判斷A/D 轉(zhuǎn)換是否結(jié)束?如何清標志位? 答:從ATD0START1_CCF0 = 0 時轉(zhuǎn)化完成。(2)如何實現(xiàn)多通道轉(zhuǎn)換? 答:ATD0CTL5中的第四位置1。
五、實驗現(xiàn)象
開發(fā)板通電后,用起子旋轉(zhuǎn)電位器,發(fā)現(xiàn)數(shù)碼管上數(shù)字從0—255連續(xù)變化。
實驗
三、PWM 模塊實驗
一、實驗?zāi)康?/p>
1. 學(xué)習(xí)使用 PWM 模塊。
2. 用 PWM 實現(xiàn)小型直流電機調(diào)速和舵機轉(zhuǎn)向。
二、實驗任務(wù)
1、使用單片機內(nèi)部PWM 模塊調(diào)制產(chǎn)生不同脈寬的方波,實現(xiàn)小型直流電機調(diào) 速和舵機轉(zhuǎn)向。
2、將 PORTA 口接八位DIP 開關(guān),PORTB口接七段數(shù)碼管顯示,PORTK控制 四個數(shù)碼管其中某一個顯示,數(shù)碼管動態(tài)顯示原理同實驗1。撥碼開關(guān)高兩位控 制舵機,當(dāng)為00,11代表舵機轉(zhuǎn)到正中央,為10,01代表舵機分別左轉(zhuǎn)右轉(zhuǎn)。撥 碼開關(guān)低六位控制電機,表示PWM占空比。數(shù)碼管第一位顯示舵機控制方向,后 兩位顯示電機占空比。
三、實驗內(nèi)容
1.PWM 模塊共有28 個寄存器,其中8 個為系統(tǒng)保留寄存器,具體介紹如下: PWM 啟動寄存器(PWME)
本寄存器的 8 個bits 分別用來開關(guān)8 路PWM 的通道。PWM 極性寄存器(PWMPOL)
本寄存器的 8 位bits 分別用來設(shè)定8 路PWM 通道輸出波形的起點電平。PWM 預(yù)分頻寄存器(PWMPRCLK)
本寄存器用來設(shè)定 ClockA 和ClockB 的預(yù)分頻因子。ClockA 分頻寄存器(PWMSCLA)
本寄存器提供 PWM 模塊操作時的幾個控制位。PWM 通道周期寄存器(PWMPERx)
此 8 個寄存器分別為8 個通道設(shè)定方波的周期。PWM 通道脈寬寄存器(PWMDTYx)此 8 個寄存器分別為8 個通道設(shè)定脈寬。PWM初始化程序如下: void initPWM(void){ PWME=0x00;//關(guān)閉所有PWM通道
PWMPOL = 0xFF;//PWM極性選擇,選擇一個周期開始時為高電平
PWMPRCLK = 0x22;//CLOCK A,B時鐘分頻,均選擇從總線四分頻 10M PWMSCLA = 5;//CLOCK SA從CLOCK A十分頻,1M PWMSCLB = 5;//CLOCK SB從CLOCK B十分頻,1M PWMCTL = 0xF0;//01級聯(lián),23級聯(lián),45級聯(lián),67級聯(lián)
PWMCLK = 0xFF;//PWM始終選擇,選擇CLOCK SA SB為PWM時鐘 PWMPER01=1000;//電機PWM正轉(zhuǎn)頻率1k PWMDTY01=0;PWMPER23=1000;PWMDTY23=0;//電機反轉(zhuǎn)頻率為1k PWMPER45=20000;//舵機PWM頻率為50Hz PWMDTY45=STEER_CENTER;//舵機占空比 PWME_PWME3=1;PWME_PWME1=1;//電機PWM波開始輸出 PWME_PWME5=1;//舵機PWM波開始輸出 } 參考程序參見實驗例程——motorpwm
四、實驗現(xiàn)象
撥碼開關(guān)高兩位控制舵機轉(zhuǎn)向,當(dāng)為00,11舵機在中央,為10,01舵機分別左轉(zhuǎn)右轉(zhuǎn)。撥碼開關(guān)低六位控制電機,表示PWM占空比。數(shù)碼管第一位顯示舵機控制方向,后兩位顯示電機占空比。占空比越大,轉(zhuǎn)速越大。
四、電磁組實驗——信號處理
一、實驗步驟
1、電磁傳感器檢測到信號
2、單片機處理這些信號——判斷是否需要轉(zhuǎn)向、減速
二、實驗內(nèi)容
1、電磁感器檢測處理后為一模擬電平,需用到AD 轉(zhuǎn)換程序。將光信號轉(zhuǎn)換為數(shù)字量存在單片機中。接下來由單片機處理這些數(shù),判斷是否要轉(zhuǎn)向。最簡單的兩個傳感器布局,當(dāng)導(dǎo)線在傳感器中央時,相應(yīng)的AD數(shù)值相同,導(dǎo)線偏向右邊的傳感器時,右邊傳感器的值變大,左邊傳感器值變小。本實驗關(guān)鍵在于如何確定導(dǎo)線位置。
2、輸入輸出口和ATD 的初始化同前面的實驗一和實驗二,將程序運行后,打 開Data1 窗口,找出AD 轉(zhuǎn)換后的數(shù)字值,應(yīng)該在0-255 之間。將車子的左邊電感對準黑色牽引線,觀察兩個傳感器。理論上應(yīng)該該電感的值最大,調(diào)解好放大器的應(yīng)在160左右記錄該數(shù)值(159),再將黑線想又移動,發(fā)現(xiàn)右邊傳感器的值逐漸增大,左邊傳感器的值逐漸減小。黑線一動到右邊電感正下方時,將此電感的值調(diào)解到160左右,記錄該數(shù)值(150)。而黑線偏出兩個電感的范圍時,兩個傳感器的值同時減小。
正常情況下小車檢測中心線程序如下: //計算Line_center 6 if(ad_data[0]+ad_data[1]<100){ Line_center =(int)(ad_data[0])*160/159-(int)(ad_data[1])*160/150;//歸一化,差值計算中心線 Get_Line = 1;} else{ Get_Line = 0;} 根據(jù)檢測到黑線的位置可以判斷行車方向。參考程序見電磁基本程序。
三.智能車制作研究報告
1.原理介紹
可以確定電感相對于導(dǎo)線的位置,或者說可以確定導(dǎo)線相對于小車的分布
2.電磁傳感器
1首先由LC回路檢測磁場○,輸出信號Singal1。
2通過放大電路INA128將信號放大 ○
3通過○獲得負電源。
4因為放大后的電路頻率依然為20KHz的周期信號,所以我們通過下面電路轉(zhuǎn)換為穩(wěn)○定輸出。
5在起跑線檢測上我們用干簧管電路。○6幅值測量 ○可以不使用檢波電路,而直接將上述單管放大電路中,三極管集電極電壓接入單片機的AD 端口,使用單片機直接采樣交變電壓信號
只要保證單片機的 AD 采集速率大于20kHz 的5-10 倍,連續(xù)采集5-10 個周期的電壓信號(大約100 數(shù)據(jù)左右),就可以直接從采集的數(shù)據(jù)中最大值減去最小值獲得信號的峰峰值。假設(shè)采集了128 個數(shù)據(jù): , 1,2, ,128 i x i=,計算信號的峰峰值p p V ? 可以有下式計算:
上面計算計算方法由于只用應(yīng)用了數(shù)據(jù)的最大值、最小值,所得結(jié)果容易受 到噪聲的影響,所以還可以通過計算數(shù)據(jù)交流信號的平均值、有效值反映信號的 幅值:
上面所計算得到的 , ave e x x 等都與信號的峰峰值成單調(diào)關(guān)系,所以也可以用來 進行計算位置差值信號。
7軟件設(shè)計 ○程序主要用到 S12 芯片中的PWM 模塊,TIM 模塊、PIT 模塊、AD 模塊、I/O 模塊 以及 SCI 模塊等。PWM 模塊主要用來控制舵機和電的運轉(zhuǎn); TIM 模塊主要是用在了測速模塊,捕捉中斷并計算瞬時度。PIT模塊用于設(shè)置定時中斷; AD 模塊主要用于讀取傳感器信息以判斷黑線位置; I/O 模塊主要是用來讀取按鍵信息和控制數(shù)碼管顯示; SCI 模塊只要用在無線串口傳送模塊。
源碼后附
四.心得體會(每個隊員都要提交心得體會)
五.附錄:程序源代碼
#include
#include “derivative.h” /* derivative-specific definitions */
/********************************************************************************* * * * *
*********************************************************************************/ #define StrCnr 1500 /**********************************/ //初始化鎖相環(huán) //將總線頻率調(diào)整到40M
/**********************************/ void InitPLL(void){ CLKSEL=0x00;//禁止鎖相環(huán),時鐘由外部晶振提供,總線頻率=外部晶振/2
PLLCTL_PLLON=1;//打開鎖相環(huán) SYNR=0x49;REFDV=0x43;// pllclock=fvco=2*osc*(1+SYNR)/(1+REFDV)=80MHz;POSTDIV = 0x00;_asm(nop);//BUS CLOCK=40M
_asm(nop);while(!(CRGFLG_LOCK==1));// 等待鎖相環(huán)初始化完成 CLKSEL_PLLSEL =1;// 使用鎖相環(huán) 2012東南大學(xué)智能車競賽電磁組Demo程序 電感信號分別接0,1口 } /**********************************/ //初始化通用IO口 //A口輸入B口和K口輸出
/**********************************/ void InitGPIO(void){ DDRA = 0x00;//A口輸入 DDRB = 0xFF;//B口輸出 DDRK = 0xFF;//K口輸出 } /**********************************/ //初始化PWM
/**********************************/ void InitPWM(void){ PWME=0x00;PWMPOL = 0xFF;PWMPRCLK = 0x22;PWMCLK = 0xFF;PWMSCLA =5;PWMSCLB =5;PWMCTL = 0xF0;PWMCAE=0;PWMPER01=100;PWMDTY01=0;PWMPER23=100;PWMDTY23=0;PWMPER45=20000;PWMDTY45=StrCnr;PWME_PWME3=1;PWME_PWME1=1;PWME_PWME5=1;} /**********************************/ //初始化AD
/**********************************/ void InitATD(void){ ATD0CTL0 = 0x0f;ATD0CTL1_SRES = 2;ATD0CTL1_SMP_DIS=1;ATD0CTL2_AFFC = 1;//ATD0CTL2_ASCIE = 1;//10
//關(guān)閉所有PWM通道 每位對應(yīng)一個端口 //PWM極性選擇,選擇一個周期開始時為高電平//CLOCK A,B時鐘頻率為10M //選擇CLOCK SA SB為PWM時鐘 //CLOCK SA頻率為1M //CLOCK SB頻率為1M //設(shè)定PWM通道兩兩級聯(lián)使用 //電機正轉(zhuǎn)頻率10k //電機反轉(zhuǎn)頻率10k //設(shè)定舵機控制線的頻率為50Hz //設(shè)定舵機初始位置 //電機PWM波開始輸出
//舵機PWM波開始輸出 //多路轉(zhuǎn)換時轉(zhuǎn)換 //轉(zhuǎn)換精度為12位 //中斷標志位自動清零
一個序列傳喚結(jié)束觸發(fā)中斷
//ATD0CTL3 = 0xC0;//結(jié)果寄存器對齊方式右對齊(ATD0CTL3_DJM=1),轉(zhuǎn)換序列長度為8(8路),循環(huán)轉(zhuǎn)換,freeze模式下繼續(xù)轉(zhuǎn)換 ATD0CTL3 = 0x80;ATD0CTL4_SMP = 0;// 采樣周期為4個周期
ATD0CTL4_PRS = 19;//atdclk=busclk/(2*(19+1))=1M ATD0CTL5_SCAN = 1;//連續(xù)轉(zhuǎn)換模式
ATD0CTL5_MULT = 1;//多通道采樣
} /**********************************/ //初始化實時中斷
/**********************************/ void InitRTI(void){ RTICTL =0x9F;//2ms中斷一次 }
void main(void){ /* put your own code here */ InitPLL();InitGPIO();InitPWM();
{ _FEED_COP();/* feeds the dog */ } /* loop forever */
/* please make sure that you never leave main */ }
float StrP=0.1;float StrD=0.01;float StrPCtl;float StrDCtl;float StrCtl;
#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 7 RTI_INT(void){ DisableInterrupts;11 InitRTI();InitATD();EnableInterrupts;CRGINT_RTIE = 1;for(;;)CRGFLG = 0x80;
//可以在此加入合適的數(shù)碼管顯示代碼,讓其中兩位顯示左邊電感的AD值(顯示不下可以顯示其中
//部分二進制位),讓另外兩位顯示右邊電感的AD值,方便調(diào)試。注意需要合適的初始化操作。
StrCtl=(ATD0DR1-ATD0DR0)*StrP;//如果需要更加精確可以使用ATD中斷,對這兩個值進行取平均值,低通濾波等操作。
/*
如果使用PD控制的偽代碼: StrPCtl=(Right-Left)*StrP;
StrDCtl=((Right-Left)-LastValueOf(Right-Left))*StrD;StrCtl=StrPCtl+StrDCtl;*/
//對舵機控制輸出限幅,避免燒壞舵機
if(StrCtl>1800)StrCtl=1800;else
if(StrCtl<1200)StrCtl=1200;PWMDTY45=StrCtl;
//請加入合適的速度控制
//如果不確定,可以使用撥碼控制速度。這時請注意相關(guān)初始化操作
EnableInterrupts;}
第二篇:智能車攝像頭組技術(shù)報告
山 東 工 商 學(xué) 院
課程設(shè)計報告
設(shè) 計 題 目:智能車設(shè)計及實驗
所屬課程名稱:智能車設(shè)計及實驗 班 級:
姓 名:
學(xué) 號:
目錄
目錄..........................................................................................................第一章 引言...........................................................................................1.1 整車設(shè)計思路..................................................................................第二章 硬件設(shè)計...................................................................................2.1 小車機械改造............................................................................2.1.1 舵機的改裝.................................................................................2.2 單片機系統(tǒng)設(shè)計...............................11.........................................2.3 攝像頭的對比選型....................................................................2.4電機驅(qū)動電路設(shè)計....................................................................2.5 電源模塊設(shè)計............................................................................第三章 軟件設(shè)計.................................................................................第四章 心得體會............................................................引言
智能汽車是當(dāng)今車輛工程領(lǐng)域研究的前沿,它體現(xiàn)了車輛工程、人工智能、自動控制、計算機等多個學(xué)科領(lǐng)域理論技術(shù)的交叉和綜合,是未來汽車發(fā)展的趨勢。全國大學(xué)生智能汽車競賽對高校學(xué)生而言是一次難得的機遇和挑戰(zhàn)。智能汽車競賽涉及的知識較為寬泛,為了設(shè)計出性能優(yōu)越的智能賽車,需要在賽車的設(shè)計開發(fā)過程中參考許多有價值的文獻資料,不斷學(xué)習(xí),不斷創(chuàng)新。
智能汽車競賽考驗參賽選手的綜合能力,包括傳感器的應(yīng)用、電動機的應(yīng)用、電路設(shè)計、自動控制原理、系統(tǒng)調(diào)試、機械結(jié)構(gòu)設(shè)計等,將這些知識合理運用到智能汽車上是對選手的巨大挑戰(zhàn)。對于競賽選手來說,臨場發(fā)揮對比賽成績的好壞至關(guān)重要,及時制定并調(diào)整策略才能發(fā)揮出智能汽車的最大性能。
關(guān)于飛思卡爾微控制器
競賽指定控制芯片為飛思卡爾系列芯片,飛思卡爾公司是嵌入式控制領(lǐng)域的全球帶頭人,是主要技術(shù)創(chuàng)新者,開發(fā)了首個基于Flash 存儲 的MCU。
“飛思卡爾”杯全國大學(xué)生智能汽車競賽是由教育部高等自動化專業(yè)教學(xué)指導(dǎo)分委員會主辦的一項以智能汽車為研究對象的創(chuàng)意科技競賽,是面向全國大學(xué)生的一種具有探索性工程實踐性活動,是教育部倡導(dǎo)大學(xué)生科技競賽之一。該競賽以“立足培養(yǎng),重在參與,鼓勵探索,追求卓越”為指導(dǎo)思想,旨在促進高等學(xué)校素質(zhì)教育,培養(yǎng)大學(xué)生的綜合知識運用能、基本工程實踐能力和創(chuàng)新意識,激發(fā)大學(xué)生從事科學(xué)研究與探索的興趣和潛能,倡導(dǎo)理論聯(lián)系實際,求真務(wù)實的學(xué)風(fēng)和團隊協(xié)作的人文精神,為優(yōu)秀人才的脫穎而出創(chuàng)造條件。該競賽以智能車電子為背景,涵蓋自動控制,模式識別,傳感技術(shù),電子,電氣,計算機等多個學(xué)科的科技創(chuàng)意性比賽
1.1 整車設(shè)計思路
1.2 自主駕駛系統(tǒng)的三個子系統(tǒng)——環(huán)境感知系統(tǒng)、自主決策系統(tǒng)和操作執(zhí)行系統(tǒng)。它們相互聯(lián)系、相互制約,共同完成控制任務(wù)。環(huán)境感知系統(tǒng),我們的該部分主要包括感知路面信息的傳感器和感知車體狀態(tài)的傳感器。傳感器的選擇相當(dāng)靈活,我們的車選用了兩種傳感器。
?CMOS 攝像頭:感知車體與路面的相對位置信息,預(yù)視距離遠。
?光電碼盤:感知車體信息,推算車體狀態(tài)。
自主決策系統(tǒng),主要通過單片機的軟件來實現(xiàn)決策控制。操作執(zhí)行系統(tǒng),就是從單片機發(fā)出控制指令到車體響應(yīng)這一部分的系統(tǒng),主要就是相應(yīng)的驅(qū)動電路,H橋之類。三個系統(tǒng)相互聯(lián)系、制約,它們都統(tǒng)一于一個共同的系統(tǒng),有共同的目標和核心的控制策略,這些直接決定了三個系統(tǒng)的構(gòu)成和性能要求。比如由控制策略,我們就可以確定環(huán)境感知系統(tǒng)要選什么傳感器、什么精度、怎么安裝,決定自主決策系統(tǒng)要如何分配CPU時序,各部分各用多少資源;決定操作執(zhí)行系統(tǒng)的能力,比如是否要雙向的H橋。比賽要求在組委會提供統(tǒng)一智能車競賽車模、單片機HCS12開發(fā)板、開發(fā)軟件Code Warrior和在線調(diào)試工具的基礎(chǔ)上制作一個能夠自主識別路線的智能車,它將在專門設(shè)計的跑道上自動識別道路行駛。比賽要求在不違反大賽規(guī)則的情況下以最短時間完成單圈賽道。
第二章 硬件設(shè)計
2.1 小車機械改造
3.1.2 舵機的改裝
由于舵機初始位置空程較大,所以我們對舵機的位置進行了改動,通過減少舵機的連桿機構(gòu)來達到響應(yīng)速度靈敏和足夠的轉(zhuǎn)角,具體改造位置見下圖:
2.2 單片機系統(tǒng)設(shè)計
大賽推薦參賽選手使用 MC9S12XS128 作為主控器,不得使用其它輔助處理器以及可編程器件。MC9S12XS128 是飛思卡爾半導(dǎo)體公司生產(chǎn)的采用HCS12 內(nèi)核的16 位單片機,有豐富的外設(shè)接口資源。關(guān)于單片機的使用,在智能小車控制系統(tǒng)中,我們使用鎖相環(huán)(PLL)來設(shè)定系統(tǒng)的工作頻率,用PWM 模塊控制舵機偏角和電機轉(zhuǎn)速,用通用異步串口(SCI)把賽車調(diào)試或比賽的行駛過程中的各種有用參數(shù)發(fā)送到PC 機以便進行分析和改進,我們還使用同步串行外設(shè)接口(SPI)或IIC 總線來控制CMOS 攝像頭。
2.3 攝像頭的對比選型
目前市場上的攝像頭所采用的感光器件分為 CCD 和CMOS 兩種,CCD 的 全稱為電荷耦合裝置,而CMOS 的全稱則是互補金屬氧化物半導(dǎo)體。目前的 CMOS 攝像頭有很多都自帶有可編程控制模塊和模數(shù)轉(zhuǎn)換模塊,無論從結(jié)構(gòu)上、工藝上、性能上和使用方法上,都與普通的存儲器有非常相似之處。與CCD 攝像頭相比之下,CMOS 攝像頭不需要斬波升壓來提供電源,并且具有較強的可編程控制能力,也不需要額外地進行A/D 采樣,各方面都更適合于作為小車的視覺傳感器。市場上的 CMOS 圖像傳感器產(chǎn)品各種各樣,數(shù)不勝數(shù),大部分是彩色的,分辨率也比較高。從小車需要識別的目標特征來看,CIF 分辨率甚至QCIF 分辨率的黑白攝像頭足夠提供路徑識別和規(guī)劃所需要的信息。攝像頭具體情況見下圖:
2.4 電機驅(qū)動電路設(shè)計
在智能汽車競賽中,智能車的速度較快,通常達到2m/s 以上,因此對電機驅(qū)動電流的要求較高,電機驅(qū)動電路必不可少。首先,競賽級電調(diào)并不使用全橋驅(qū)動,而是使用半橋,其原理圖如圖所示。我們使用BTS7960 驅(qū)動芯片。這種芯片的好處是外圍電路簡單。通過設(shè)計電路,能使電機正轉(zhuǎn)以及反轉(zhuǎn),而且使用PWM 波控制,能起到很好的驅(qū)動效果。具體情況見下圖:
2.5 電源模塊設(shè)計
驅(qū)動電路板中的電源模塊為系統(tǒng)其它各個模塊提供所需要的電源。設(shè)計中,除了需要考慮電壓范圍和電流容量等基本參數(shù)之外,還要在電源轉(zhuǎn)換效率、降低噪聲、防止干擾和電路簡單等方面進行優(yōu)化??煽康碾娫捶桨甘钦麄€硬件電路穩(wěn)定可靠運行的基礎(chǔ)。全部硬件電路的電源可充電鎳鎘電池提供。由于電路中的不同電路模塊所需要的工作電壓和電流容量各不相同,因此電源模塊應(yīng)該包括多個穩(wěn)壓電路,將充電電池電壓轉(zhuǎn)換成各個模塊所需要的電壓。主要包括如下不同的電壓:
1.主要為單片機、信號調(diào)理電路以及部分接口電路提供電源,電壓要求穩(wěn)定、噪聲小。
2.主要是為舵機提供工作電壓。實際工作時,舵機所需要的工作電流一般在幾十毫安左右,電壓無需十分穩(wěn)定。
3.一部分直接取自電池兩端電壓,主要為后輪電機驅(qū)動模塊提供電源。4.采用攝像頭進行道路檢測時,為攝像頭供電。具體情況見下圖:
第三章 軟件設(shè)計
本系統(tǒng)控制軟件采用大賽提供的CodeWarrior軟件及BDM作為調(diào)試工具,此外,廠家提供的編程環(huán)境支持C語言和匯編語言的程序設(shè)計,以及C語言與匯編語言的混合編程,大大方便了用戶的程序設(shè)計,提高了系統(tǒng)開發(fā)效率。本系統(tǒng)程序代碼使用C語言編寫。本程序設(shè)計由以下幾個模塊組成:單片機初始化模塊,實時路徑檢測模塊,舵機控制模塊,驅(qū)動電機控制模塊,中斷速度采集模塊,速度模糊控制模塊。
(1)單片機的初始化模塊包括:I/O模塊、PWM模塊、計時器模塊、定時中斷模塊初始化。
(2)實時路徑檢測模塊:前排光電傳感器檢測黑線,將返回信號輸入單片機的輸入端口,程序不間斷地讀入輸入端口的信號,通過判斷語句,得出合適的PWM信號控制舵機轉(zhuǎn)向
(3)舵機控制模塊,驅(qū)動電機控制模塊:通過直接輸出PWM信號控制。舵機的控制采用開環(huán)控制,驅(qū)動電機采用模糊算法閉環(huán)控制。
(4)中斷速度模糊控制模塊實現(xiàn):通過輸出比較中斷實現(xiàn)每5ms產(chǎn)生一次中斷,并由累加器從旋轉(zhuǎn)編碼器信號線讀入脈沖數(shù),通過模糊運算得出PWM信號值輸出控制轉(zhuǎn)速電機控制速度
心得與體會
參見智能車比賽,讓我從中學(xué)會了很多知識。智能車比賽需要細心和耐心,以及豐富的知識和極強的動手能力。拿耐心來說,在我畫板的時候,必須極其小心,一個小小的失誤就有可能讓整個板子廢掉。我是畫了四次才算是成功,而且你在畫板布線的時候更得有耐心,遵循布線的規(guī)則,尋找最優(yōu)的路線說實話,有時候真的會看的眼暈。所以說,畫板需要很好的耐心。
在做車過程中,也讓我學(xué)會了很多知識。你要學(xué)會使用需要的軟件,學(xué)會焊電路,知道各個元器件的性質(zhì)以及各種芯片的性質(zhì)還有引腳的功能。而且大部分資料都是英文版的,需要極有耐心的把他們看一遍,尋找你所需要的部分。在做車過程中,極大的提高了我的動手能力。以前我焊電路的時候手一直會抖,現(xiàn)在是好了很多,手沒有以前那樣,抖個不停。
也許我們的知識還不夠豐富,考慮問題也不夠全面,但是這份技術(shù)報告作為我們小組辛勤汗水的結(jié)晶,凝聚著我們小組每個人的心血和智慧,隨著它的誕生,這份經(jīng)驗將永伴我們一生,成為我們最珍貴的回憶。
第三篇:電磁智能小車設(shè)計報告
標題:電磁感應(yīng)智能電動車
摘要:本系統(tǒng)以AVR單片機MEGAl6為核心器件,實現(xiàn)對驅(qū)動電路的控制,使電動小車自動行駛。利用電磁原理,在車模前上方水平方向固定兩個相距為L的電感,通過比較兩個電感中產(chǎn)生的感應(yīng)電動勢大小即可判斷小車相對于導(dǎo)線的位置,進而做出調(diào)整,引導(dǎo)小車大致循線行駛。用PWM技術(shù)控制小車的直流電動機轉(zhuǎn)動,完成小車位置、速度、時間等的控制。利用干簧管來檢測跑道的起始和終點位置從而完成小車的起步及停車。
系統(tǒng)總體設(shè)計:
AVR單片機MEGAl6(該芯片能夠不需要外圍晶振和復(fù)位電路而獨立工作,非常適合智能尋跡車模的要求。)為核心,由單片機模塊、路徑識別模塊、直流電機驅(qū)動模塊、舵機驅(qū)動模塊等組成,如下圖所示。基于電磁感應(yīng)的智能尋跡車模系統(tǒng)以
直流電動機為車輛的驅(qū)動裝置,轉(zhuǎn)向電動機用于控制車輛行駛方向。智能尋跡車模利用電磁感應(yīng)在跑道上自主尋跡前進,轉(zhuǎn)向。
單片機模塊(控制模塊):
尋跡車模采用AVR內(nèi)核的ATMEGAl6。該芯片能夠不需要外圍晶振和復(fù)位電路而獨立工作,非常適合智能尋跡車模的要求。
路徑識別模塊:
本方案就是在車模前上方水平方向固定兩個相距為L的電感。左邊的線圈的坐標為(x,h,z),右邊的線圈的位置(x-L,h,z)。由于磁場分布是以z軸為中心的同心圓,所以在計算磁場強度的時候我們僅僅考慮坐標(x,y)。由于線圈的軸線是水平的,所以感應(yīng)電動勢反映了磁場的水平分量。計算感應(yīng)電動勢:
圖 1 線圈中感應(yīng)電動勢與它距導(dǎo)線水平位置x 的函數(shù)
如果只使用一個線圈,感應(yīng)電動勢E 是位置x 的偶函數(shù),只能夠反映到水平位置的絕對值x 的大小,無法分辨左右。為此,我們可以使用相距長度為L 的兩個感應(yīng)線圈,計算兩個線圈感應(yīng)電動勢的差值:
對于直導(dǎo)線,當(dāng)裝有小車的中軸線對稱的兩個線圈的小車沿其直線行駛,即兩個線圈的位置關(guān)于導(dǎo)線對稱時,則兩個線圈中感應(yīng)出來的電動勢大小應(yīng)相同、且方向亦相同。若小車偏離直導(dǎo)線,即兩個線圈關(guān)于導(dǎo)線不對稱時,則通過兩個線圈的磁通量是不一樣的。這時,距離導(dǎo)線較近的線圈中感應(yīng)出的電動勢應(yīng)大于距離導(dǎo)線較遠的那個線圈中的。根據(jù)這兩個不對稱的信號的差值,即可調(diào)整小車的方向,引導(dǎo)其沿直線行駛。
對于弧形導(dǎo)線,即路徑的轉(zhuǎn)彎處,由于弧線兩側(cè)的磁力線密度不同,則當(dāng)載有線圈的小車行駛至此處時,兩邊的線圈感應(yīng)出的電動勢是不同的。具體的就是,弧線內(nèi)側(cè)線圈的感應(yīng)電動勢大于弧線外側(cè)線圈的,據(jù)此信號可以引導(dǎo)小車拐彎。
另外,當(dāng)小車駛離導(dǎo)線偏遠致使兩個線圈處于導(dǎo)線的一側(cè)時,兩個線圈中感應(yīng)電動勢也是不平衡的。距離導(dǎo)線較近的線圈中感應(yīng)出的電動勢大于距離導(dǎo)線較遠的線圈。由此,可以引導(dǎo)小車重新回到導(dǎo)線上。
由于磁感線的閉合性和方向性,通過兩線圈的磁通量的變化方向具有一致性,即產(chǎn)生的感應(yīng)電動勢方向相同,所以由以上分析,比較兩個線圈中產(chǎn)生的感應(yīng)電動勢大小即可判斷小車相對于導(dǎo)線的位置,進而做出調(diào)整,引導(dǎo)小車大致循線行駛。
驅(qū)動模塊:
簡易智能小車有兩個電動機。其中一個小電動機控制前輪轉(zhuǎn)向,給電動機加正反向電壓,實現(xiàn)前輪的左右轉(zhuǎn)向;另一電動機控制后輪驅(qū)動力。控制轉(zhuǎn)向電動機需要較小的驅(qū)動力,經(jīng)過實驗,選L293作為驅(qū)動芯片;由于后輪驅(qū)動功率較大,所以選用L298N,經(jīng)過實驗發(fā)現(xiàn)小車行使過程中負載較大,導(dǎo)致L298N發(fā)熱較大,故給芯片添加散熱片以保護芯片正常工作。為了優(yōu)化控制性能,采用PWM脈寬調(diào)速,并利用數(shù)模轉(zhuǎn)換芯片產(chǎn)生 模擬電壓,控制555生成占空比可調(diào)的脈沖從而控制L293B與L298N進行脈寬調(diào)速。
具體設(shè)計方案:
本設(shè)計使用一普通玩具小車作為車模,采用P W M 信號驅(qū)動,當(dāng)PWM信號脈寬處于(1ms,1.5ms)區(qū)間時舵機控制小車向左行駛,脈寬處于(1.5ms,2ms)時小車向右行駛,脈寬約為1.5ms時小車沿直線行駛。本方案使用兩個10mH的電感置于車模頭部作為確定小車位置的傳感器。然后,設(shè)計了一個模擬電路,采集、調(diào)理、放大由電感得到的電動勢信號。具體電路如圖2所示。
該電路采用電壓并聯(lián)負反饋電路,電感信號從PL進入??紤]到單獨電感感應(yīng)出的電動勢很小,本設(shè)計使用電感和電容諧振放大感應(yīng)電動勢。由于使用的是10mH的電感,導(dǎo)線中電流頻率為20kHz,因此使用6.3nF的電容。這樣在電容上得到的電壓將會比較大,便于三極管進行放大。整個電路的具體放大倍數(shù)需要根據(jù)實際負載進行計算。本設(shè)計的小車控制電路如圖3所示。
首先,把由兩個電感得到的感應(yīng)電動勢經(jīng)調(diào)理、放大后得到的電壓輸出u1和u2送入由運放組成的減法器中進行減法運算,然后再經(jīng)由運放組成的電壓跟隨器送給下一級電路。經(jīng)過分析,這一級電路的輸出大致可由下式進行計算:
后一級電路由兩個555定時器組成,其中下方的555構(gòu)成一個占空比非常接近于1的脈沖發(fā)生器,作為上方555的觸發(fā)脈沖。因為此觸發(fā)脈沖的低電平信號非常窄,所以能很好的保證上方555構(gòu)成的單穩(wěn)態(tài)電路正常運行。該脈沖信號頻率為:
上方的555定時器構(gòu)成一個單穩(wěn)型壓控振蕩器,它的脈寬受輸入V1的控制,輸出即PWM信號。當(dāng)V1較大時,即兩個電感線圈中的感應(yīng)電動勢相差較大時,亦即小車偏離導(dǎo)線向左行駛時,則脈寬較大,舵機將控制小車向右行駛;當(dāng)V1適中時,接近,即小車沿導(dǎo)線行駛時,則脈寬接近1.5ms,小車按直線行駛;當(dāng)V1較小時,即小車偏離導(dǎo)線向右行駛時,則脈寬較小,舵機將控制小車向左行駛。從而,控制小車大致循著導(dǎo)線行駛。另外,改變構(gòu)成減法器的電阻的值,可以調(diào)整小車反應(yīng)的靈敏度,進而防止出現(xiàn)小車以導(dǎo)線為中軸線左右搖擺的現(xiàn)象。
補充說明:跑道上的起始位置及終點位置用干簧管來檢測。
程序設(shè)計流程圖:
第四篇:實習(xí)報告——智能車設(shè)計
工業(yè)項目設(shè)計與制作報告
——基于電磁傳感器的智能車設(shè)計
姓名:王香偉 學(xué)號:102673 專業(yè):自動化
基于電磁傳感器的智能車設(shè)計
——工業(yè)設(shè)計報告
(102673 王香偉自動化)
智能車以自主尋線、高速行駛為目的,以嵌入式系統(tǒng)為支撐,以PID控制算法和汽車結(jié)構(gòu)知識為核心,以信號與系統(tǒng)、電力電子、電機拖動、傳感器等為基礎(chǔ),是一項綜合的設(shè)計。全車設(shè)計我認為可分為四大部分:檢測信號采集,控制算法,驅(qū)動及車體結(jié)構(gòu)設(shè)計,輔助部分。一下我將一一介紹:
一、檢測信號采集:
a.將交變磁場采集成電路中的交流電壓
我們電磁組,檢測的是賽道中線導(dǎo)線中100mA,20KHz的交流電所產(chǎn)生的交變磁場。利用交變電磁場在電感線圈中產(chǎn)生交變電壓的原理,輔以LRC濾波來檢測電磁信號。所用電感L=10mH,電容C=6.8nF,二者串聯(lián)諧振頻率為20KHz,可濾掉所感應(yīng)到的其它頻率的電磁信號。
b.將交流電壓放大并整流成直流電壓
我們采用運放AD823將所獲得的的信號電壓放大,并通過二極管和電容不可控整流電路將放大后的交流電壓轉(zhuǎn)換為直流電壓。
c.將直流電壓通過單片機AD口輸入。
五個電感的電磁信號分別連到單片機的五個不同的AD口上,單片機利用一個AD轉(zhuǎn)換器的多路開關(guān)的功能將他們一一轉(zhuǎn)換為數(shù)字量,這一過程在軟件中時這樣實現(xiàn)的。通過定時器中斷0.5ms觸發(fā)一次AD中斷,通過AD中斷讀取AD采樣值。相應(yīng)代碼如下:
#define PIT1_TIME
500 //0.5ms MK60_PITS_INITIALIZE_(MK60_PIT_CH1,SystemCoreClock,PIT1_TIME);設(shè)置定時器中斷為0.5ms觸發(fā)一次
MK60_PITS_Enables_IRQ(MK60_PIT_CH1);打開定時器中斷
} 在定時器中斷的響應(yīng)函數(shù)中打開AD中斷并將多路開關(guān)選擇em0通道。void PIT1_IRQHandler(void)
{
PIT->CHANNEL[1].TCTRL &= ~PIT_TCTRL_TIE_MASK;
PIT->CHANNEL[1].TFLG |= PIT_TFLG_TIF_MASK;
PIT->CHANNEL[1].TCTRL |=(PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK);
ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM0;} 然后再在ad中斷的響應(yīng)函數(shù)中,將AD寄存器的值讀到程序中,賦給程序中對應(yīng)的數(shù)組變量。
void ADC1_IRQHandler(void){
static uint32_t adc_cnt = 0;
ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM0;switch(adc_cnt)
{
case 0:
{
adc1_head++;
}
} if(adc1_head >= 10)
adc1_head = 0;em_adc[0][adc1_head] = ADC1->R[0];ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM1;adc_cnt = 1;break;} case 1: { em_adc[1][adc1_head] = ADC1->R[0];ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM2;adc_cnt = 2;break;} case 2: { em_adc[2][adc1_head] = ADC1->R[0];ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM3;adc_cnt = 3;break;} case 3: { em_adc[3][adc1_head] = ADC1->R[0];ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC1_EM4;adc_cnt = 4;break;} case 4: { em_adc[4][adc1_head] = ADC1->R[0];ADC1->SC1[0] =(ADC1->SC1[0] &(~ADC_SC1_ADCH_MASK))+ ADC_DISABLE;adc_cnt = 0;break;} 每個傳感器值都在不同的時間讀了十次,一共五個傳感器,組成了一個5X10的數(shù)組。之后再通過濾波(將每個傳感器的值加權(quán)平均得到一個之后可用于計算的值)
如果五個電感的最大值不一樣,可以將他們的最大值標準化到10000 void em_adc_filter(void){ volatile int i_pos = 0;int32_t fir_i,fir_head;float em_adc_sum[5] = {0,0,0,0,0};float fir[em_adc_size] = {0.4,0.1,0.1,0.1,0.1,0.1,0.05,0.05,0.0,0.0};for(i_pos = 0;i_pos < 5;i_pos++)//加權(quán)平均
{
for(fir_i = 0;fir_i { fir_head = adc1_headrow)+ D_DIRECTION * row_sub + I_DIRECTION))+ steer_midd_adjust;此句代碼即為方向控制的PID算法,其中 P_DIRECTION為比例系數(shù)、D_DIRECTION為微分系數(shù)、并未添加積分控制,比例系數(shù)和微分系數(shù)是根據(jù)車在賽道位置時刻變化的,如何變化正是我們后期調(diào)試的重點,大體思路為,小車在賽道中線附近時控制系數(shù)較小,距離中線較遠時,控制。 float get_kp(int po_er){ float kp_l; if(po_er<500) { kp_l=p_5; D_DIRECTION_RATIO=d_small; } else if(po_er<1000) { kp_l=p_5+0.002*(po_er-500)*(p_10-p_5); D_DIRECTION_RATIO=d_small; } } else if(po_er<1500){ kp_l=p_10+0.002*(po_er-1000)*(p_15-p_10);D_DIRECTION_RATIO=d_small;} else if(po_er<2000){ kp_l=p_15+0.002*(po_er-1500)*(p_20-p_15);D_DIRECTION_RATIO=d_small;} else if(po_er<2500){ kp_l=p_20+0.002*(po_er-2000)*(p_25-p_20);D_DIRECTION_RATIO=d_big; } else if(po_er<3000) { kp_l=p_25+0.002*(po_er-2500)*(p_30-p_25);D_DIRECTION_RATIO=d_big; } else { kp_l=p_30; } return kp_l;當(dāng)電磁傳感器檢測到的信號過小時,我們就認為這組數(shù)據(jù)無效,并認為此時小車偏離中線較遠,將舵機逐漸打到最大。速度控制中,我們根據(jù)舵機打角的絕對量和和連續(xù)二十次舵機打角的方差來進行速度控制。 速度控制的思路為:入彎減速,彎道加速出彎再加速,直道或者曲率很小的彎拼命加速??刂品椒椋喝舳鏅C打角方差較小,則認為小車處于直道或者彎道而不是入彎狀態(tài),這個時候速度有舵機打角的絕對值來控制。 若方差很大:則說明小車正在入彎,若此時速度很快則需要進行減速。 if(steer_gyh_fangcha<50&&steer_gyh_fangcha>-50) // { if(pwm_steer_gyh_abs<200){ zd_flag++;zd2_flag++; if(zd_flag>10) { speed_set_l=s_z1; zd_flag=21; } } else if(pwm_steer_gyh_abs<400){ zd2_flag++; zd_flag=0; if(zd2_flag>10) { speed_set_l=s_z1-0.0025*pwm_steer_gyh_abs*(s_z1-s_z2); zd2_flag=21; } } else { speed_set_l=s_w1-0.001667*(pwm_steer_gyh_abs-400)*(s_w1-s_w2); speed_set_l+=get_speed_change(); zd_flag=0; zd2_flag=0; } } else if(steer_gyh_fangcha>50) { speed_set_l=s_s1-0.001*pwm_steer_gyh_abs*(s_s1-s_s2);zd2_flag=0;zd_flag=0;} else { speed_set_l=s_w1;} 控制函數(shù)寫在另外一個定時器中斷中,每5ms觸發(fā)一次。 三、驅(qū)動及車體結(jié)構(gòu) 電機和舵機均采用PWM控制,其中舵機直接連接到單片機中的一個PWM信號輸出,而電機則采用通過兩路PWM信號控制由兩片BTN組成組成的全橋電路來驅(qū)動電機 其中電機PWM頻率為1500Hz,舵機PWM頻率為50Hz,舵機的低頻率導(dǎo)致舵機控制會有20ms的延時,這會是5ms的控制周期有些力不從心。 小車采取前輪轉(zhuǎn)向,后輪驅(qū)動,車體設(shè)計以質(zhì)量輕,轉(zhuǎn)動慣量小,重心底為原則。 汽車的轉(zhuǎn)向車輪、轉(zhuǎn)向節(jié)和前軸三者之間的安裝具有一定的相對位置,這種具有一定相對位置的安裝叫做轉(zhuǎn)向車輪定位,也稱前輪定位。前輪定位包括主銷后傾(角)、主銷內(nèi)傾(角)、前輪外傾(角)和前輪前束四個內(nèi)容。這是對兩個轉(zhuǎn)向前輪而言,對兩個后輪來說也同樣存在與后軸之間安裝的相對位置,稱后輪定位。后輪定位包括車輪外傾(角)和逐個后輪前束。這樣前輪定位和后輪定位總起來說叫四輪定位。a.主銷后傾角(caster)的調(diào)整 圖2.2 主銷后傾角 從側(cè)面看車輪,轉(zhuǎn)向主銷(車輪轉(zhuǎn)向時的旋轉(zhuǎn)中心)向后傾倒,稱為主銷后傾角。設(shè)置主銷后傾角后,主銷中心線的接地點與車輪中心的地面投影點之間產(chǎn)生距離(稱做主銷縱傾移距,與自行車的前輪叉梁向后傾斜的原理相同),使車輪的接地點位于轉(zhuǎn)向主銷延長線的后端,車輪就靠行駛中的滾動阻力被向后拉,使車輪的方向自然朝向行駛方向。設(shè)定很大的主銷后傾角可提高直線行駛性能,同時主銷縱傾移距也增大。主銷縱傾移距過大,會使轉(zhuǎn)向盤沉重,而且由于路面干擾而加劇車輪的前后顛簸,在調(diào)節(jié)的時候我們將小車前后墊片(初始為2:2)調(diào)整為1:3,即前一后三,使其傾角為負。這樣可以減少回力矩的作用,使轉(zhuǎn)向更為靈活。 b.前輪外傾角(camber)的調(diào)整 圖2.3 前輪外傾角 從前后方向看車輪時,輪胎并非垂直安裝,而是稍微傾倒呈現(xiàn)“八”字形張開,稱為負外傾,而朝反方向張開時稱正外傾。使用斜線輪胎的鼎盛時期,由于使輪胎傾斜觸地便于方向盤的操作,所以外傾角設(shè)得比較大。如果車輪垂直地面一旦滿載就易產(chǎn)生變形,可能引起車輪上部向內(nèi)傾側(cè),導(dǎo)致車輪聯(lián)接件損壞。所以事先將車輪校偏一個外八字角度,這個角度約在 1°左右。c.前輪前束 圖2.4 前輪前束 腳尖向內(nèi),所謂“內(nèi)八字腳”的意思,指的是左右前輪分別向內(nèi)。采用這種結(jié)構(gòu)目的是修正上述前輪外傾角引起的車輪向外側(cè)轉(zhuǎn)動。如前所述,由于有外傾,轉(zhuǎn)向變得容易。另一方面,由于車輪傾斜,左右前輪分別向外側(cè)轉(zhuǎn)動,為了修正這個問題,如果左右兩輪帶有向內(nèi)的角度,則正負為零,左右兩輪可保持直線行進,減少輪胎磨損,在調(diào)試中,我們發(fā)現(xiàn)將這個角調(diào)整為1度左右,配合主銷后傾,可讓小車既能轉(zhuǎn)向靈活,又能獲得直線良好的沿線能力。 附上小車圖片一張 四、輔助部分 主要的輔助部分由按鍵OLED模塊和藍牙上位機模塊 a.按鍵OLED主要用于參數(shù)修改,測量,標定等 大體上,我們采用6個按鍵來控制OLED,一個用于打開或關(guān)閉OLED,一個用于翻頁,另外一個用于上下左右4個方向移動光標。通過OLED修改參數(shù)的方法是:先將需要修改的參數(shù)顯示到OLED上;然后通過按鍵和編碼器修改顯示在OLED上的參數(shù)的值;最后再將修改后的值賦給參數(shù)對應(yīng)的變量。 在具體實現(xiàn)上,我們需要做到以下三點:1.可以掃描到按鍵按下;2.可以將變量顯示到OLED上;3.可以修改OLED上顯示的數(shù)字;4.可以將OLED上顯示的數(shù)字賦值給變量。1.掃描按鍵: 硬件上:將按鍵、電阻和電源串聯(lián)的電路中合適的點連接到GPIO上,使按鍵按下與否可在相應(yīng)的GPIO端口產(chǎn)生高低電平。 軟件上:先初始化與按鍵相連的GPIO端口,配置成合適的輸入輸出模式。然后調(diào)用MK60_PORT_GPIO_READ(PORTA,key_pin[x])函數(shù)來讀取對應(yīng)GPIO端口的高低電平。2.顯示變量: 硬件上:將OLED按照接口規(guī)范與單片機連好。 軟件上:1.先將需要顯示的變量乘上合適的倍數(shù)轉(zhuǎn)化為整數(shù);2.在把整數(shù)每一位按照順序存儲到一個數(shù)組中;3.把存儲數(shù)據(jù)的數(shù)組中的每個元素加上’0’便于顯示,然后把對應(yīng)的參數(shù)名接到這個數(shù)組的后面;4.調(diào)用OLED中提供的顯示字符的函數(shù)將這個數(shù)組顯示出來。3.修改變量: 硬件上:將編碼器接好。軟件上:按下上下左右按鍵時可以選擇所要修改的位置,轉(zhuǎn)動后輪帶動編碼器計數(shù)來修改對應(yīng)的值,修改的是存儲數(shù)據(jù)的數(shù)組 4.變量重新復(fù)制: 將存儲數(shù)據(jù)的數(shù)組中的數(shù)按位加權(quán)求和賦值給變量。 至此,我們實現(xiàn)了按鍵OLED的基本功能,實現(xiàn)參數(shù)的顯示和修改。此外我們還實現(xiàn)了利用按鍵來實現(xiàn)傳感器最大值的標定和速度檔位的控制,實現(xiàn)方式很簡單,就是先讀取按鍵的值,然后見機行事。同時我們利用 MK60_FTFL_FLASH_WriteRecords()和MK60_FTFL_FLASH_ReadsRecords();函數(shù)將參數(shù)存儲于dataFlash中,便于使用。 b.藍牙上位機模塊主要用于信號的動態(tài)觀測。 我們利用藍牙和串口將程序中需要觀測的變量發(fā)送到上位機,上位機中繪制出折線圖,便于觀察。 五、總結(jié) 和一切智能系統(tǒng)一樣,智能車的智能體現(xiàn)在在反饋信息,對環(huán)境的識別和處理。我們采用電磁傳感器進行路徑識別,實用性不廣,很難應(yīng)用與真實環(huán)境。所以我們有兩方面可以為之努力:一是考慮電磁環(huán)境的可行性,二是改用其他傳感器。二者留給日后研究。 智能車編程總結(jié) 智能車核心是飛思卡爾xs128芯片,盡可能利用單片機里的硬件資源是程序的核心。程序理應(yīng)要有漂亮的算法,但由于智能車任務(wù)不復(fù)雜,合理管理和配置硬件資源才是最重要的。? 編程步驟(關(guān)鍵找到程序框架) I.程序第一步:通過配置寄存器來編寫單片機資源的底層程序。 A.配置總線時鐘頻率(通過鎖相環(huán)電路) B.配置輸出PWM(脈寬調(diào)制波)功能(占空比) C.配置定時中斷功能(PIT定時中斷) D.配置輸入捕捉功能(脈沖累加器) E.配置基本輸入輸出端口的電平 II.程序第二步:利用底層程序編寫各種其他硬件的驅(qū)動程序 A.驅(qū)動電機、舵機(通過PWM波) B.驅(qū)動傳感器發(fā)射和接收(通過IO端口和PWM波)。 C.驅(qū)動碼盤測速裝置并接收。(通過輸入捕捉功能)。 III.程序第三步:連接各種硬件,順序完成巡線任務(wù)。 IV.程序第四位:利用控制思想,不斷調(diào)試和優(yōu)化程序。 ? 編程思想(程序關(guān)鍵要清楚) I.盡量使各種功能都封裝成函數(shù)。 II.程序分層次,不同層次盡量寫在不同文檔中(函數(shù)層層調(diào)用)。 III.主函數(shù)中簡單明了,思路、層次分明。 IV.各種工具函數(shù)同一管理。(延時,絕對值,取最大最小值等) V.重點參數(shù)使用全局變量方便調(diào)試。 ? 控制方法:使用PID控制方法(關(guān)鍵在調(diào)試) I.電機調(diào)試PID (以預(yù)設(shè)速度與實際檢測的速度的差值為偏差值error) II.搖頭舵機PID (以傳感器偏離中心距離為偏差值error) III.轉(zhuǎn)向舵機PID (以搖頭舵機偏離中心的角度為偏差值error) 其他一些都是根據(jù)實際情況的一些細節(jié)處理,比如過十字交叉線,出道檢測,起點檢測等。第五篇:智能車編程總結(jié)