仁翔科技-49.9思附送其他總結(jié)_第1頁
仁翔科技-49.9思附送其他總結(jié)_第2頁
仁翔科技-49.9思附送其他總結(jié)_第3頁
仁翔科技-49.9思附送其他總結(jié)_第4頁
仁翔科技-49.9思附送其他總結(jié)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余21頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

1、假期以來,重新系統(tǒng)學(xué)習(xí)智能車。首先學(xué)習(xí)了以下教材:1.蘇州大學(xué)王宜懷ARM Cortex M4嵌入式系統(tǒng)開發(fā)實(shí)踐基于飛思卡爾k60系列微控制器。本書第二章詳細(xì)闡述了K60 的144引腳的LQFP封裝。即:Low-profile Quad Flat Package.超薄型四邊扁平封裝。我仔細(xì)觀察了一下K60那一小塊,感覺還真貼切。這144個引腳中有44個工作支撐引腳,這些引腳沒有復(fù)用功能。主要包括:電源引腳;參考地引腳;AD轉(zhuǎn)換的參考電源,地,高低電平;USB調(diào)節(jié)器的輸入輸出;引腳晶振的電源,輸入輸出等;這些引腳的功能非常底層。另外100個引腳是I/O資源類引腳,這就是用戶比較關(guān)心的了。這100

2、個引腳復(fù)用功能十分強(qiáng)大。有16個功能不等。但都至少有一個功能:GPIO!這一點(diǎn)王宜懷的表格畫的很詳細(xì),仔細(xì)研究就會發(fā)現(xiàn)。但是,一個復(fù)用的port,你怎么設(shè)定它是哪種功能呢?這就要通過寫寄存器來配置了!下面這句代碼來自gpio.c,就是把復(fù)用的port設(shè)定為GPIO功能的:PORT_PCR_REG(PORTx,n)=(0|PORT_PCR_MUX(1);這是通過寫PORT_PCR_REG寄存器來實(shí)現(xiàn)的。K60的32位(4GB)地址空間的表我也仔細(xì)看了。重點(diǎn)是GPIO的區(qū)域和SRAM_L,SRAM_R兩個區(qū)域。這個信息應(yīng)該在MK60DZ10.h里面,這個頭文件有1萬5千多行,是官方的一些最基礎(chǔ)的定

3、義,包括大量的寄存器。下面,我又著重了解了一下晶振的原理。K60使用的是有源晶振,這種晶振的原理是機(jī)電效應(yīng)。是用電損耗很小的石英晶體經(jīng)精密切割磨削并鍍上電極焊上引線做成。這種晶體有一種特性:如果給它通電,他就會產(chǎn)生機(jī)械震蕩,反之,如果給它機(jī)械力,他又會產(chǎn)生電。這就是給它電它振嘍。我仍然覺得它很奇妙。第三章介紹了小燈閃爍工程的組織。首先明白了GPIO輸入輸出引腳的兩種接法:上拉和下拉。這只不過是引腳接高低電平的一種比較形象的說法。GPIO的設(shè)定仍然是由寄存器控制的。這些寄存器控制都十分細(xì)致,種類很多。就拿GPIO來說,方向,輸入輸出,等都由大量寄存器控制。下面了解了一個工程的具體組織方式,至少知

4、道了往往都是.h與.c成對出現(xiàn)的。前者庫包含,宏定義,函數(shù)聲明;后者只需包括前者然后來實(shí)現(xiàn)函數(shù)功能(function)。第四章我最大的收獲是知道了main.c和isr.c是兩條線交替進(jìn)行的。程序執(zhí)行main那是默認(rèn)的,而isr呢?它是外設(shè)中斷的。具體到智能車就是ov7620發(fā)出的中斷請求信號,有3個哦。所以isr會和main穿插交替進(jìn)行(開中斷以后)。這一點(diǎn)直到我單步調(diào)試的時候才真正明白,應(yīng)為程序會在main和isr之間跳轉(zhuǎn)。剛開始我還一直不明白程序是怎么進(jìn)isr.c的呢,因?yàn)閙ain.c并沒有調(diào)用它。其實(shí)它是和main并駕齊驅(qū)的!王宜懷老師的書很基礎(chǔ)又詳細(xì),不錯。2.劉火良三天入門Corte

5、xM4Kinetis系列。這本書可分為三個部分第一部分是上電啟動過程,這部分可以讓你知道程序是怎么到main的。不過我一般直接run to main了。第二部分關(guān)于工程的建立,書上的重點(diǎn)是jlink下載設(shè)置那塊吧。就是一些IAR最簡單的操作。但沒有調(diào)試的介紹是個敗筆。調(diào)試才是IAR的精髓。第三部分是野火底層的介紹,主要是把寫好的函數(shù)給你看看,讓你知道怎么用?;静簧婕凹拇嫫?,這樣雖然方便,但看的時候有關(guān)寫寄存器的代碼讓人感覺糊涂,很不好,只能查那個1千8百頁的RM。(ReferenceManual)。由于我完全使用野火底層,這一塊很重要。3.IAR Embedded Workbench IDE

6、用戶手冊由于2號書中IAR的操作介紹的比較粗略,我又看了這本官方說明。我主要看了后面關(guān)于斷點(diǎn),單步調(diào)試的內(nèi)容。Auto,watch,live watch,local等監(jiān)視窗口。這些窗口有些變量的值有時會出現(xiàn)error,那是因?yàn)槟鉾atch了一個局部變量,而現(xiàn)在程序并沒有走到那個局部的緣故。關(guān)于局部變量和全局變量復(fù)習(xí)C語言吧。感覺再難的程序你一步一步走幾遍就很容易懂。而一些隱蔽的錯誤不單步調(diào)試真看不出來。不過IAR有的時候有bug,step in了以后,程序明明跳進(jìn)函數(shù)里了,函數(shù)窗口卻不跳轉(zhuǎn),綠色箭頭也沒了,只有在反匯編里能看。還有時按step in了,他居然step over,沒有進(jìn)去。軟件的

7、bug,鄙視之。IAR的另一個bug是go to definition的問題,查找算法沒設(shè)計(jì)好,比VS有很大差距。程序中一些莫名的縮略詞有時很煩,比如SADDR,你要看出是source address; PCR,你要看出是port control register; PTD,你要看出是port D;ISFR,你要看出是interrupt service flag register。知道了名詞的意思,有助于理解程序。另外其實(shí)寄存器也有地址,且也是32位的,(看RM)。但跟內(nèi)存的地址完全是兩回事。前面那個4GB的是內(nèi)存的。不過寄存器的地址一般玩家不常用,只要關(guān)心里面的值就行了。因?yàn)楦叨送婕乙呀?jīng)定義

8、好了。但你想他若沒有地址,你寫寄存器,寫給誰?怎么找他?然后我開始研究ov7620這款數(shù)字?jǐn)z像頭。談到攝像頭首先就要清楚他的工作模式,ov7620有RGB,YUV,YCbCr三種工作模式。RGB是彩色的模式不說了,我們用不到。YUV格式中,Y代表灰度(這個我們最熟悉了),UV代表色差。而YCbCr則是YUV演變的又一個版本。在這里粗略地對他們兩個不做區(qū)分。實(shí)際上,我們采用的就是YUV16位的格式。大家可能會奇怪,我們見到的ov7620數(shù)據(jù)線都是Y0-Y7,既然是YUV格式,那UV跑哪里去了?good question!開始我也對此感到困惑。后來我查看了OminiVision的datasheet

9、才發(fā)現(xiàn)ov7620其實(shí)是48pin的,通常的18pin的只是一個經(jīng)過加工的閹割版。保留了智能車所能用的管腳,至于UV色差信號,智能車用不到就被閹割了。說這么多的目的只是讓大家堅(jiān)信我們的輸出格式是YUV16位,那8位的UV信號被我們?nèi)恿?。而不是說他只能輸出一個8位的灰度值。3天前上傳 HYPERLINK /forum.php?mod=attachment&aid=NTU4NDF8ZjYzM2QzMTB8MTM5MjgxNTQ4NXwxNTIwMjd8MjE1MjM2¬humb=yes o 捕獲.JPG 下載次數(shù):1 t _blank 下載附件(44.46 KB)最重要的過程便是程序的調(diào)試了

10、。斷點(diǎn)的設(shè)置是關(guān)鍵,位置設(shè)置合適的斷點(diǎn)可以幫你理清程序流程,找出錯誤。如下我在main.c里面設(shè)置了3個斷點(diǎn),在isr.c里面設(shè)置了2個,都是關(guān)鍵的位置。按順序分別記為1,2,3,4,5號斷點(diǎn)。圖一,main.c里的斷點(diǎn)圖二,isr.c里的斷點(diǎn)程序從上電啟動開始運(yùn)行crt0.s到進(jìn)入main.c這是一個固定的流程,然后運(yùn)行到1號斷點(diǎn),停止。隨后將進(jìn)入攝像頭的初始化和設(shè)置語句。從1號斷點(diǎn)到2號斷點(diǎn)之間是完成ov7620初始化和工作模式設(shè)置的過程。在此過程中由于沒有開中斷(攝像頭都沒設(shè)置好當(dāng)然不能開),任何中斷都進(jìn)不來,第二條程序線是不存在的。所以2號斷點(diǎn)是一個關(guān)鍵點(diǎn),從它開始程序開始變成雙線執(zhí)行

11、。程序會隨時被中斷(PCLK觸發(fā))而進(jìn)入到4號斷點(diǎn)。(F10,F(xiàn)11就知道)執(zhí)行到DMA_EN(DMA_CH0)的時候,灰度值數(shù)據(jù)開始從E端口的低8位((void *)&PTE_BYTE0_IN)傳輸?shù)絻?nèi)存中的IMG_BUFF(通過DMA_CH0),這句代碼在ov7620.c中,是OV7620_init中的一個語句(F11,進(jìn)去看看。也就是說怎么傳早就設(shè)置好了,現(xiàn)在只要使能通道就可以*_*)DMA_PORTx2BUFF_Init(DMA_CH0,(void *)&PTE_BYTE0_IN, IMG_BUFF, PCLK, DMA_BYTE1, 320 , DMA_rising_keepon);

12、5號斷點(diǎn)是采完一幅圖像的判斷點(diǎn),并將標(biāo)志位IMG_finsh置1,這時當(dāng)程序再運(yùn)行到3號斷點(diǎn)時就會進(jìn)入下面的圖像處理模塊。這里的keepon保證了傳輸320字節(jié)(一行)后下次傳輸?shù)牡刂肥荌MG_BUFF+320,而不會恢復(fù)成IMG_BUFF。即下一次數(shù)據(jù)會存放在第二行。它keepon的是結(jié)束的地址而不是最初的地址。昨天看到陳正沖一句話:鍵盤上F10,F(xiàn)11要锃亮錚亮。與大家共勉。順便糾正一個野火的錯誤(不知道改了沒有):CPSIE i是開中斷而不是關(guān),CPSID i才是關(guān)。(enable啊!怎么會是關(guān)?)野火書和庫的注釋在這一點(diǎn)都是錯的。官方寫的arm_cm4.h不會錯,可以查看。官方arm_

13、cm4.h:野火的三天入門P6:閑來無聊寫一下關(guān)于我對攝像頭數(shù)據(jù)采集處理的設(shè)計(jì) K60的內(nèi)核是Cortex-M4,不得不說這個內(nèi)核比M3有了很大的長進(jìn),特別是核心對dsp內(nèi)核的支持。玩過STM32的朋友知道32上也有dsp庫,但最大的缺點(diǎn)是M3內(nèi)核模擬的,速度算不上快,但比一般自己寫代碼快很多。 下面來講一下怎么讀取攝像頭數(shù)據(jù),這個是關(guān)鍵只有獲得了有效的數(shù)據(jù)才能處理啊。我用的攝像頭是OV7620,買來的時候基本是出廠設(shè)置。OV7620視頻輸出格式通過YCrCb格式,這里我們只用Y通道,里面輸出的是灰度。 攝像頭輸出通過VS(場同步信號)、HS(行同步信號)、PCLK(像素時鐘同步信號),和Y0

14、Y7組成。用示波器觀察PCLK的時間是74ns,也就是13.5M的速度(用杜邦線小心,攝像頭架的很高,線很長衰減很厲害)。這里我采用了中斷和DMA相結(jié)合(有DMA這么好的資源干嘛不用呢),沒接觸過的人可能不知道那時什么功能,其實(shí)很簡單只要你給它設(shè)置好相應(yīng)的參數(shù),它就會不通過CPU直接將你的數(shù)據(jù)從外設(shè)和內(nèi)存之間相互搬運(yùn),或者內(nèi)存到內(nèi)存的搬運(yùn),什么時候搬運(yùn)你就要告訴他。在程序開始的時候我們設(shè)置兩個中斷(為了保證必要的速度最好設(shè)置在兩個不同的中斷號中),一個是VS中斷,一個是HS中斷,并且配置DMA(建立外設(shè)和內(nèi)存的搬運(yùn)過程,搬運(yùn)次數(shù),觸發(fā)方式)觸發(fā)采用PCLK,并且使能VS中斷,失能掉HS和DMA

15、中斷。 (1)當(dāng)一幀圖像開始傳輸時VS觸發(fā)中斷(這里不判斷奇偶場),在中斷中我們初始化一些行計(jì)數(shù)之類的變量,并且失能VS開啟HS中斷。 (2)當(dāng)VS之后的第一個HS的到來表示第一行觸發(fā)HS中斷,在此你就要判斷這一行的數(shù)據(jù)你是否需要(如果我們把一幅圖像的所有數(shù)據(jù)都讀進(jìn)來RAM不夠吧)。之后沒來一個HS觸發(fā)一次中斷判斷這一行你是否需要,如果需要就使能DMA傳輸和中斷。當(dāng)判斷行計(jì)數(shù)大于你要的行數(shù)后,失能HS,來一個標(biāo)志位說明一幀圖像已經(jīng)接收完畢。 (3)DMA中斷中其實(shí)很簡單,開啟一次DMA的傳輸和中斷后,攝像頭每來一個PCLK就會搬運(yùn)一次數(shù)據(jù)到指定的RAM中,當(dāng)一次搬運(yùn)完你所設(shè)置的搬運(yùn)次數(shù)后進(jìn)入D

16、MA中斷,在中斷中你要及時的將RAM中的數(shù)據(jù)移走,防止被覆蓋,這里需要注意一下為了盡可能的快速移走數(shù)據(jù)你要好好考慮下你要搬運(yùn)的次數(shù)。 (4)上面提到的那個標(biāo)志位就要用在主函數(shù)中,當(dāng)判斷標(biāo)志位被標(biāo)志后,我們要開始進(jìn)行處理,濾波、黑線的判斷、十字路口、停車是必不可少的。 濾波和黑線的判斷我們可以使用自帶的DSP內(nèi)核來完成,關(guān)于cortex-M4中的dsp內(nèi)核,可以登入arm的官網(wǎng)下載相關(guān)資料 HYPERLINK /cmsis/download/ t _blank /cmsis/download/ 里面的庫提供很豐富的處理方法。雖然在四川省賽中未能順利完成決賽比賽,但驗(yàn)證了我們的策略讓攝像頭跑上3M

17、基本應(yīng)該沒問題。#include smartcar.hvoid main() 軟硬件系統(tǒng)初始化(); for(;) if(圖像采樣完成) 邊沿檢測法提取左右黑線(); 數(shù)據(jù)濾波消除十字錯誤數(shù)據(jù)(); 十字和反光斷線補(bǔ)線();/反光補(bǔ)線非常不穩(wěn)定 根據(jù)面積和斜率計(jì)算方向和速度控制量(); 方向控制(); 速度控制(); /*說明:圖像采集采用等距采樣,從30310行跳行采。前瞻150CM,速度控制周期2毫秒,方向控制周期20毫秒。請高手不吝賜教,若方便,指出結(jié)構(gòu)問題。同時也愿車友共同進(jìn)步,愿智能車技術(shù)蒸蒸日上!首先要明確DMA采集圖像的優(yōu)點(diǎn),就是能夠在不占用CPU的前提下,實(shí)現(xiàn)高速采集。對于同樣

18、的控制策略,圖像信息完整肯定能夠跑的更快。對于DMA采集,野火針對于K60已經(jīng)拿出了很多資料,還推出了一款鷹眼攝像頭。這款攝像頭不但實(shí)現(xiàn)硬件二值化,還實(shí)現(xiàn)了移位寄存,降低了采樣頻率。但是存在一個缺點(diǎn),就是需要接太多線。因此我們經(jīng)過分析發(fā)現(xiàn),鷹眼攝像頭內(nèi)部電路可以適當(dāng)修改。硬件二值化后,直接將結(jié)果(一根信號線)接到K支持SPI觸發(fā)DMA的MCU的MISO口,進(jìn)行采集,頻率根據(jù)攝像頭的設(shè)置適當(dāng)修改,經(jīng)過試驗(yàn),可以采集到240*320的完整圖像。而對于不支持SPI觸發(fā)DMA的單片機(jī),同樣提出一種方案。比如MCF5225X,它不支持SPI觸發(fā),但是支持DMA定時器觸發(fā)。同樣將二值化后的數(shù)據(jù)線拉倒單片機(jī)

19、附近,經(jīng)過串行轉(zhuǎn)并(電路可參考鷹眼),接到單片機(jī)的某個端口。進(jìn)過試驗(yàn),同樣采集到了240*320的圖像。以上方案支持所有硬件二值化的攝像頭,對于數(shù)字?jǐn)z像頭的硬件二值化,可以試試對高3位邏輯組合,來輸出高低,有的攝像頭甚至直接可以選用最高位作為二值化的結(jié)果(野火哥,你懂得)。先寫到這里,感興趣的就留言吧。if(Line132&Line200&Line0 & y10 & x10 & y10 & x1(img_size(2)+1) yy(y1,x1) = l1; xx(y1,x1) = l2; error(l1,l1) = err; counter(y1,x1)=counter(y1,x1)+1;

20、img_undist(l1,l2) = img_origin(y1, x1); end endend復(fù)制代碼可以這樣理解:點(diǎn)是通過函數(shù)對應(yīng),那么久一點(diǎn)一點(diǎn)的解算出校正以后的點(diǎn)在原圖上的位置,搬運(yùn)過來。函數(shù)對應(yīng)關(guān)系:這樣子,可以把圖像校正以后做結(jié)算,用標(biāo)定的方法算出黑線的真實(shí)距離,用真實(shí)的斜率來控制。標(biāo)定的完整matlab代碼:最重要的過程便是程序的調(diào)試了。斷點(diǎn)的設(shè)置是關(guān)鍵,位置設(shè)置合適的斷點(diǎn)可以幫你理清程序流程,找出錯誤。如下我在main.c里面設(shè)置了3個斷點(diǎn),在isr.c里面設(shè)置了2個,都是關(guān)鍵的位置。按順序分別記為1,2,3,4,5號斷點(diǎn)。圖一,main.c里的斷點(diǎn)圖二,isr.c里的斷點(diǎn)程序從上電啟動開始運(yùn)行crt0.s到進(jìn)入main.c這是一個固定的流程,然后運(yùn)行到1號斷點(diǎn),停止。隨后將進(jìn)入攝像頭的初始化和設(shè)置語句。從1號斷點(diǎn)到2號斷點(diǎn)之間是完成ov7620初始化和工作模式設(shè)置的過程。在此過程中由于沒有開中斷(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論