西交大專案設計實驗報告(自動化系)
0 專案設計概述
開發資料百度雲網址:http://yun.baidu.com/ 開發平臺:win10 Freescale Kinetis K60晶片 IAR EWARM開發環境
一、程式設計軟體的安裝與使用
1.1下載安裝軟體
目前最新的IAR for ARM為v6.30,支援更多的Kinetics系列晶片, 因此我們安裝最新版,避免因為版本太低而出現不相容,甚至出 現異常錯誤的情況
1.2安裝 IAR 詳細過程
1.下載後解壓檔案,開啟目錄,執行安裝檔案:
2.IAR的程式設計介面
相對於Keil For ARM、CodeWarrior 而言,IAR for ARM的程式設計介面是最簡單的,編譯效率高,在嵌入式系統的除錯方面提供了可供除錯的外掛。
3.安裝模擬器
又換會原來的安裝導航介面:選擇Install driver,選擇了用jlink作為模擬偵錯程式,因此這裡選擇jlink,執行安裝,執行後,會自動安裝驅動,不會有其他提示。另外,為了可以使用擦除晶片等功能,我們可以選擇用segger 公司的 j-link。
二、模組檢測與除錯
在車輛組裝過程中,因為人為原因,可能出現各個問題,需要在利用一些電氣裝置和程式的情況下,進行模組檢測。在模組檢測時,各個模組間的線,先不插入插座中,待各個模組檢測完後,在按照說明連線線路。
2.1檢測的電源模組。
檢測方法:給電源模組正常供電後,用萬用表測量各個端子的電壓是否正常。具體電壓,雖然電池上寫著是7.2v,但是滿充狀態下電壓是8.3v左右,低於3.5v後,整車不工作。
2.2檢測核心板
核心板的檢測,需要開啟程式碼檢測程式。,用jlink給系統板供電,下載該程式程式碼,程式下載後,核心板上指示燈會閃爍。如果接上串列埠,波特率設定為115200,會不斷的發資料出來。以證明系統版是能夠正常工作的。把系統板插到主機板上。這一步上一屆學長學姐替我們做過啦,所以這步我們只是簡單的點燈看系統版是否正常工作。主機板上的外設通過萬用表可以檢測是否和外設連線正確。
2.3檢測電機驅動
2.3.1程式驗證
下載電機檢測程式[E:\BaiduYunDownload\專案設計\藍宙飛思卡爾資料\藍宙電子智慧車攝像頭套件k60平臺資料-更新至20130601\03藍宙電子智慧車競賽單電機驅動BTS7960資料\藍宙電子智慧車競賽單電機驅動BTS7960資料\landzoK60單電機檢測程式],連線好電源線和驅動線。檢視電機是否正反。可以看到此程式包含電機模組的初始化。
與設定佔空比的不同來進行正反轉
我們可以檢視電機模組說明書[E:\BaiduYunDownload\專案設計\前三節PPT\2 姚向華]電機使用隔離晶片5V電源(可以與微控制器共用5V);微控制器到驅動模組用4跟線即可(GND、5V、PWM1、PWM2);最大頻率支援15KHz,超過會造成晶片發燙、電機運轉不正常。 從真值表我們可以看到INH是使能標誌,IN1與IN2的組合代表著正反轉和制動。我們知道FTM模組可以提供定時、計數、輸出PWM波等功能。檢視程式中FTM模組中相關變數。 可以看到FIMn與CHn都是列舉變數,兩者的組合對應一個引腳。此次程式是:
FTM_PWM_init(FTM0 , CH1, 80000,0); //功能定時器模組 通道號 頻率 佔空比
FTM_PWM_init(FTM0 , CH2, 80000,0);
使用的是FIM0與CH1,CH2對應的引腳號為PTC2與PTC3。 開啟主機板的原理圖 [E:\BaiduYunDownload\專案設計\藍宙 飛思卡爾資料\藍宙電子智慧車攝像頭套件k60平臺資料-更新至20130601\01藍宙電子智慧車MK60主機板資料\藍宙電子智慧車MK60主機板資料] 裡的主機板原理圖,看到PTC2與PTC3正好對應著MotorPwm2和MotorPwm4,也就是電機驅動的PWM波。
2.3.2電路連線
如果認為這個猜想不正確,那麼可以繼續驗證一下,我們可以看到主機板的背面, 4這裡的5個引腳分別於電機的控制電路的5個引腳相連,而PWM2、PWM3與電機模組的IN1與IN2相連,這也就是解釋了為什麼
FTM_PWM_Duty(FTM0 , CH1,0);
FTM_PWM_Duty(FTM0 , CH2,50);
01是正傳,10是反轉,00與11都是制動,有人也許會說這個正反轉和上面的真值表有所不同,是這樣,有些車就是01正傳,10反轉,試一下就知道。 改變佔空比,佔空比越大,轉速越快。在我們的最終程式中,佔空比在25%左右。
2.3.3 PCB與對應引腳
開啟主機板的原理圖 [E:\BaiduYunDownload\專案設計\藍宙 飛思卡爾資料\藍宙電子智慧車攝像頭套件k60平臺資料-更新至20130601\01藍宙電子智慧車MK60主機板資料\藍宙電子智慧車MK60主機板資料] 裡的主機板原理圖,看到PCB電路圖中 P9對應著電機模組,怎麼看的,就是根據引腳數量和大致位置就可以知道啦,5個引腳的就p9這一個,然後向上翻找到P9模組, 可以看到四路PWM波中PWM2、PWM3對應著MotorPwm2和MotorPwm3,而MotorPwm2和MotorPwm3連線著電機模組的IN1與IN2,這樣一切就解釋都很合理了。
2.4檢測舵機和舵機對正
機械安裝好後,先把舵機上面的黑色小圓盤從舵機上拔出來。改裝舵接的連線線,舵連線線的改裝方法參考主機板原理圖。把舵機連線線插入主機板上,下載舵機測試程式,舵機測試程式會讓舵機左右轉動。如果舵機能夠正常工作,下載舵機對中程式,讓舵機對中,安裝上黑色小圓,說完這些是不是不知道我在說什麼,好我們回到電機除錯的思路來。
2.4.1 舵機概述
首先看一下舵機的材料 [E:\BaiduYunDownload\專案設計\前三節PPT\2 姚向華] : 一組減速齒輪; 電源線:一般為4.8v或6v。一般為紅色; 地線:一般為黑色 控制線:週期是20ms(也就是50HZ)的脈寬調製(PWM)訊號 (FUTABA為白色) 脈衝寬度從0.5ms-2.5ms,相對應舵盤的位置為0-180度,呈線性變化。從這裡可以得到佔空比從0.5/50-2.5/50,也就是2.5%到12.5%。 重點是,控制線提供一定的脈寬,它的輸出軸就會保持在一個相對應的角度上,直到給它提供一個另外寬度的脈衝訊號,它才會改變輸出角度到新的對應的位置上。不是說各個佔空比他就一直轉,而是一個佔空比對應一個角度的。
2.4.2 舵機的電路連線
依舊看主機板,可以看到主機板的後面有舵機1與舵機2,我們任意選一個,以舵機1為例。 我們選擇舵機1模組,在PCB電路圖中為: 可以看到舵機1是P4模組,怎麼看出來,根據相對位置猜的,因為舵機1靠外面一點。我們向上翻可以看到P4模組: 它標的SteeringPwm2,不過不用管他,可能就是想把P3標成SteeringPwm1,把P4標成SteeringPwm2,這時候也該反應出來這應該和電機一個套路,用的是FTM模組,我們具體看一下SteeringPwm2是哪個引腳? 可以看到SteeringPwm2對應的是PTA9。
2.4.3 舵機除錯
我們回到電機的除錯程式中,看到FTM2與CH1正好對應著PTA9, 那麼我們只需要在電機的除錯程式里加入舵機的初始化與佔空比的改變就完成了對舵機的除錯。怎麼加呢?如下圖: 在電機模組初始化完成後,進行舵機模組的初始化,注意頻率為50HZ。
在80ms中斷裡,改變舵機的佔空比因此使得舵機向左與向右,由於舵機的佔空比為2.5%-12.5%,5和7是試出來的,一個向左偏,另一個向右偏。
2.4.4 舵機對正
上面的除錯,5%向左偏,7%向右偏。這也告訴我們一個道理,用佔空比除錯比較麻煩,我們可以進入這個函式
可以看到,利用公式 佔空比 = (CnV-CNTIN)/(MOD-CNTIN+1) ,我們將duty轉化為cv值,然後給了暫存器,因為FTM_PRECISON = 0.1%,這樣的cv值的範圍很大,我們根據cv值和
FTM_CnV_REG(FTMx[ftmn], ch) = cv
來除錯舵機中值。我們把FTM_PWM_Duty(FTM1 , CH1, duty)
改成FTM_CnV_REG(FTMx[FTM1], CH1) = cv
根據2分法來除錯舵機中值,cv = 3000時舵機向左轉,cv=4000時舵機向右轉,舵機等於3500時在中間位置,有時候其實3300,3700都可能是中值,因為我們改變的是暫存器的值,不是很敏感,方便除錯舵機。
2.5檢測攝像頭
連線電源線到主機板上,檢視核心板的power燈是否亮著。把攝像頭排線接到主機板上,用萬用表測試一下供電電壓是不是5V。如果供電正常,把排線插到攝像頭上,看攝像頭的指示燈是否亮。用視訊卡檢視,攝像頭的影象。下載攝像頭測試程式,看串列埠是否有采集的AD值輸出。當然我並沒有這樣做,看著燈亮,就覺得就開始除錯啦。畢竟上一屆替我們做過了這些工作。順著以前的思路,我們先看一下,攝像頭的一些資料
2.5.1 攝像頭概述
先看一下攝像頭的基本資料 [E:\BaiduYunDownload\專案設計\前三節PPT\5 王瑩] 可以看到攝像頭主要用到PCLK畫素同步訊號,HREF水平同步訊號,VSYNC垂直同步訊號,FOOD奇偶場同步訊號沒有用到。Y0-Y7是傳輸一個8bit的畫素的,在73ns的PCLK畫素同步訊號下,一次傳一個畫素,繼續往下看: 可以看到攝像頭模組隔行掃描時,30幀/s,60場/s,採出來的影象時240*640,它的那種表示方法和我們數字影象處理的不太一樣。後期我們每個24行取一行,取10行進行處理。
2.5.2 攝像頭的連線
這裡我就不細說了,他看PCB圖, 是P1模組的電路圖為
在主機板上找到相應的引腳號
除錯攝像頭就是對這些引腳進行操作。
2.5.3 攝像頭例程
1.Ov7620採集初始化
2.PORTD中斷服務程式
3.DMA中斷服務程式
4.資料搬移
三、專案設計實現
3.1整體框架
到此我們就可以實現我們自己程式裡。我們的流程類似
1.在攝像頭程式採集中,只用了10行資料。 2.找黑線,本歷程的找黑執行緒序,是先二值劃,再根據雙線特徵,進行黑線查詢 3.。在用PID演算法,算出轉向 PWM。計算轉向值程式,是需要根據道路的實際情況結合攝像頭前瞻和舵機響應時間,計算出來的值。 4.計算轉向值,根據視覺中心與賽道中心,給舵機一個適當的佔空比,改變舵機角度。 5.速度演算法,需要根據自己賽道是直道和轉彎半徑給出合適的目標車速。還需要對車速響應做出調整,這裡主要是看需要不需要剎車和加速候的 PID 值。 起跑線的檢測我們就不需要了。
3.2初始化
起初我們進行電機,舵機與攝像頭的初始化,程式為:
初始化之前必須要先關閉中斷,之後再開啟,以防在程式中跑飛。初始化失敗。
對於攝像頭的初始化正如前面例程所說:
我們用全域性變數陣列AData[10][400]來存放從攝像頭採集來的10行資料,
DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTE_BYTE0_IN, ADdata[0], PTD12, DMA_BYTE1, DATACOUNT, DMA_rising_keepon);
DMA_PORTx2BUFF_Init()採用DMA通道4 ,PTE0-PTE7 資料採集,ADdata資料儲存位置,PTD12觸發通道,DMA_BYTE1資料儲存長度1,DATACOUNT資料總個數400,DMA_rising_keepon 觸發方式上升沿。其中DMA_CH4與DMA_BYTE1都是列舉變數。
代表16個DMA通道和DMA每次傳輸位元組數。
3.3 攝像頭資料的採集
PTD12觸發通道對應著PCLK畫素同步訊號,之前我們說過,每個24行採集一次,總共採集10行結束,就是對應著這個程式。
採集到的10*400的資料存放在全域性變數陣列AData[][]中。
3.4攝像頭資料的處理
攝像頭的處理包括了影象二值化與尋找黑線,我們的思路與下面的流程圖相符合,不過我們每次都採集10行,因此第一個條件就”採集到的黑線行數>5”不用判斷啦。
3.4.1影象二值化
我們可以設定一個全域性閾值對影象進行簡單的二值化,程式為: 用兩個for循壞遍歷一個二維陣列,然後if條件做判斷,如果此畫素大於閾值128則設定為255,否則為0。
3.4.2尋找黑線與賽道中心
我從影象的中心相兩邊找,如果找到三個連續的點則為黑線。程式為 兩邊黑線的1/2出為賽道中心,儲存在CenterLine[]數組裡,這對於下圖的彎道, 當我們檢測不到黑線的位置的時候,我們應該就取影象的中心,也就是視覺中心與賽道中心重合,可以保持前行。
3.5 PID演算法
在工業控制中,比例+積分+微分的控制規律是一種常用的方法,可適用於多種被控物件。PID調節器是一種線性調節器,它的實質是將設定值r(t)與輸出值c(t)進行比較構成控制偏差 e(t)=r(t)-c(t) 將其按比例、積分、微分運算後,並通過線性組合構成控制量,如圖所示,所以簡稱為P(比例)、I(積分)、D(微分)調節器。
這個誤差我們以視覺中心與賽中中心的距離作為誤差 由此我們便可以計算得到誤差,將中間5個error取平均,然後用PID得到u(t)也就是result,程式如圖:
3.6舵機控制
根據視覺中心與賽道中心的誤差來進行舵機的控制,我們很自然的想到,將error放大一定倍數加到舵機中值上,如果每次轉彎的方向是相反的,我們就用舵機中值減去得到的誤差。如下圖所示:
可能會注意到,為什麼要對result進行判斷,那是因為舵機的佔空比取值範圍不大,如果大於一定程度,角度超過一定極限容易損傷舵機,而且不一定左右都要在1000範圍內,根據具體情況,具體調整。
3.7電機控制
此次專案設計,我們的電機佔空比在25%左右,佔空比不是很大,程式如圖 但是在轉彎的時候,由於舵機在極限位置,小車可能會卡著慢慢移動,這時候我們應該適當的增加速度,以保證在轉彎的時候,小車正常行駛,不會出現停下來,緩慢轉彎的情況。
四、總結
此次專案設計到這裡也算告一段落,其中學到了很多,比如熟悉了一下基本環境的搭建,由於例程比較詳細,這裡顯得輕鬆了許多。對於整車的除錯,需要各模組進行,這樣很輕鬆。在一個就是在海量的資訊中找到我們有用的資訊,這個很重要,資訊爆炸的時代,如果對資訊過濾的好,那必然會贏得時代,做一個弄潮兒,可我這種能力有待加強。因為首先是Thomas除錯了程式,告訴了我有用的文件,我在開始開發的。在開發過程中,我也是表現出來極大的陌生感,因為對電路以及硬體除錯的不熟,自己又好高騖遠,不是很情願動手動腦,導致最後開發速度慢,但在其中也學到了,邊看開發文件邊寫程式,邊讀例程,找對應引腳,理清邏輯,邊修改程式,實現自己想要的功能。未來的路還很長,希望自己靜下心來,認認真真做每一件事,要想成功,興趣與堅持,一直要動手,天生聰明,不如每天動手。