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