<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 無線圖像傳輸系統(tǒng)ARM9+Atmega16+OV7620+

          無線圖像傳輸系統(tǒng)ARM9+Atmega16+OV7620+

          作者: 時(shí)間:2012-09-25 來源:網(wǎng)絡(luò) 收藏

          很多人可能會這樣驚訝的問道,況且,直到現(xiàn)在我也不能確定能不能傳輸視頻,我本人覺得估計(jì)也有點(diǎn)吃力!!!不過現(xiàn)在已經(jīng)完成了圖片的傳輸,從傳輸時(shí)間來看還是漫長的讓人接受不了,一張320*240圖片的傳輸大概需要10s(后面會詳述為什么會有這么長時(shí)間和可以改進(jìn)的地方),但是,一張完整圖片經(jīng)過無線發(fā)射完只需1.2s(去除發(fā)送等待時(shí)間大概只需720ms)左右的時(shí)間,大部分時(shí)間還是消耗在采集端的發(fā)送延時(shí)等待(目前還沒有用中斷,下一步改成中斷處理)以及上位機(jī)()驅(qū)動(dòng)中的數(shù)據(jù)復(fù)制(copy to usr,用mmap方式應(yīng)該會快一點(diǎn)(引用別人的結(jié)論——用mmap方法就不會造成CPU的CACHE頻繁失效,從而大大節(jié)約時(shí)間——Ethan的《copy_to_user與mmap的工作原理》),這也是下一步的計(jì)劃),并且這些數(shù)據(jù)都是沒有經(jīng)過任何處理的原始RGB BAYER PATTERN。為什么要做這個(gè)平臺呢??原因在于目前參加了一個(gè)省競賽,關(guān)于《都市開心農(nóng)場》(QQ農(nóng)場的實(shí)例版),考慮到植物生長的相對靜態(tài)性,不需要實(shí)時(shí)的圖像采集,并且考慮到這個(gè)項(xiàng)目要和物聯(lián)網(wǎng)或是無線傳感網(wǎng)有關(guān)聯(lián),所以就采用了這個(gè)無線傳輸方案。先不說可行性了,關(guān)鍵在于學(xué)習(xí),這20天中,也學(xué)習(xí)了不少東西,ARM驅(qū)動(dòng)開發(fā)、圖像的格式,顯示以及液晶屏framebuffer的使用。下面就一步步敘述整個(gè)開發(fā)過程吧。

          先來說說目前已經(jīng)達(dá)到的效果,通過Atmega16+OV7620+nrf24l01采集圖像,圖像格式可以設(shè)為YUV422,RGB RAW16,RGB8bit,前兩種目前只能顯示為灰度圖像(OV7620的UV管腳沒有用,只能通過Y通道獲取數(shù)據(jù))并且對圖像這塊也不了解,GB8bit支持彩色顯示,可以在4.3 16bpp LCD上顯示(圖像質(zhì)量還可以),并且可以通過網(wǎng)絡(luò)傳到上位機(jī)(電腦),不過,這塊還沒有做好,只能接收到數(shù)據(jù),還沒有顯示出來(這也是后面的工作了)。ARM+nrf24l01作為目前的終端(這個(gè)也只是作為我一個(gè)項(xiàng)目中的網(wǎng)關(guān),所以先熟悉了再說,不過到時(shí)候可不是nrf24了)。基本上已經(jīng)完成了圖像的采集、傳輸、處理(顯示)整個(gè)流程,最后要做的也是最困難的——優(yōu)化。

          作為開發(fā)記錄文檔, 我想分為4個(gè)部分分別描述整個(gè)過程的關(guān)鍵之處:

          nrf24l01無線射頻模塊

          OV7620圖像傳感器

          nrf24l01 在ARM上的驅(qū)動(dòng)

          圖像在lcd中顯示

          首先,nrf24l01無線收發(fā)模塊之前從未接觸過,用過的也都是TI 早期的CC1000,CC1101模塊,為什么要選它呢??可能是因?yàn)樗僮骱唵伟?競賽有時(shí)間限制啊),也可能是因?yàn)樗袃煞N傳輸速率1M、2M(目前用的是1M,期待2M有所改善),而那些用于ZIGBEE的速率也都在250kbps左右,即選之則安之。微控制器采用的是Atmega16,時(shí)鐘采用外部晶振7.3728MHz(暈,為什么用這么一個(gè)頻率呢?!!)。nrf24l01通過Atmega16通用IO模擬出的SPI連接(第一個(gè)瓶頸)。那么首先來說說IO模擬SPI問題,Atmega16 SPI總線頻率最高可達(dá)到時(shí)鐘頻率的一半(主機(jī)方式),而nrf24l01 datasheet上標(biāo)注了SPI 頻率可以支持到8MHz,所以當(dāng)初應(yīng)該選擇主頻更高的晶振。在本平臺中沒有使用SPI接口,而是用IO模擬的SPI時(shí)序(因?yàn)檫@樣的程序網(wǎng)上到處都是),后來才發(fā)現(xiàn),IO模擬的SPI速率是很慢的(具體慢多少我也不清楚),所以下一步打算直接用SPI接口操作好了。下面貼出部分程序段;

          /*SPI 寫,返回狀態(tài)值。模擬SPI 先MSB(DORD=0) 、SCK空閑時(shí)為低電平(CPOL=0)、起始沿采樣,下降沿設(shè)置(CPHA=0)*/

          char SPI_RW(char data)

          {

          char i,temp=0;

          for(i=0;i8;i++) // output 8-bit

          {

          if(data 0x80)

          {

          PORTB |= (1 PB5) ;

          }

          else

          {

          PORTB = ~(1 PB5);

          }

          data = (data 1);

          temp=1;

          PORTB |= (1 PB7);

          if(PINB (1 PB5))temp++;

          PORTB = ~(1 PB7);

          }

          return(temp);

          }

          //SPI READ

          char SPI_Read(char reg)

          {

          char reg_val;

          PORTB = ~(1 PB4); // CSN low, initialize SPI communICation...

          SPI_RW(reg); // Select register to read from..

          reg_val = SPI_RW(0); // read registervalue

          PORTB |= (1 PB4); // CSN high, terminate SPI communication

          return(reg_val);

          }

          其他的函數(shù)都可以由這兩個(gè)函數(shù)演變。還有個(gè)問題就是軟件延時(shí)的問題,這也是今天才發(fā)現(xiàn)的問題,比如在時(shí)鐘頻率為7.3728M時(shí),循環(huán)for(i=0;i254;i++)執(zhí)行時(shí)間大概為138us,一個(gè)for循環(huán)的執(zhí)行次數(shù)為4*N+4.下面這個(gè)毫秒級延時(shí)函數(shù)則比較經(jīng)典:

          void delay_1ms(void)

          {

          unsigned int i;

          for(i=1;i(unsigned int)(xtal*143-2_;i++)

          ;

          }

          在上式中,xtal為晶振頻率,單位為MHz.

          OK,今天就寫到這里。

          此文僅作為開發(fā)記錄文檔,錯(cuò)誤在所難免!


          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();