張興武,趙慶志,張林華,夏汝巖,王政皓,孫小飛
(1.山東理工大學(xué) 機(jī)械工程學(xué)院,山東 淄博 255049;2.山東新華醫(yī)療器械股份有限公司,山東 淄博 255086)
傳統(tǒng)的基于PCI圖像采集卡的圖像采集系統(tǒng)存在硬件成本高、體積大、開發(fā)周期長、不利于后續(xù)改造和拓展等問題[1].而傳統(tǒng)的基于FPGA圖像采集系統(tǒng)需要根據(jù)特定應(yīng)用環(huán)境設(shè)計特定算法和硬件實現(xiàn),開發(fā)難度大,不利于拓展和移植[2].嵌入式微處理器和TFT LCD的結(jié)合及應(yīng)用[3-6]為解決上述問題提供了可能.為此,本文設(shè)計一種嵌入式圖像采集系統(tǒng),該系統(tǒng)以STM32F103VET6(簡稱STM32F103)為主控制器,以O(shè)V7725為圖像采集傳感器,以ILI9341為液晶控制器,通過I2C總線和FSMC總線分別控制OV7725和ILI9341,實現(xiàn)圖像傳感器及液晶控制器與單片機(jī)的通信,最終實現(xiàn)圖像的采集、顯示與保存,并應(yīng)用于可視門鈴及其他應(yīng)用領(lǐng)域.
以ST公司基于ARM Cortex-M3內(nèi)核架構(gòu)的STM32F103VET6[7]芯片為控制平臺,供電電壓2.0~3.6 V,CPU最高主頻72 MHz,支持8080模式LCD并行接口.采用ILI9341液晶控制器芯片顯示圖像信息,該液晶芯片自帶172.8 KB顯存,可保存兩幀RGB圖像數(shù)據(jù).采用Omni Vision公司基于COMOS VGA的圖像傳感器OV7725采集圖像信息,最大輸出30萬像素圖像(分辨率640×480),自帶有源晶振和穩(wěn)壓芯片,并帶有FIFO幀緩存芯片AL422B,該芯片內(nèi)含384 K的FLASH,可緩存兩幀QVGA圖像數(shù)據(jù).該圖像傳感器將采集的圖像數(shù)據(jù)保存成RGB565格式存入FIFO緩存.STM32讀取緩存中的圖像數(shù)據(jù)經(jīng)RGB接口輸出至液晶面板.系統(tǒng)硬件結(jié)構(gòu)如圖1所示.
圖1 系統(tǒng)硬件結(jié)構(gòu)Fig.1 Hardware structure of the system
1)液晶面板與ILI9341通信接口.液晶面板與ILI9341采用RGB接口,液晶面板含28根信號線,其中:RGB信號線各8根,CLK同步時鐘信號線1根,H/YSYNC水平/垂直同步信號線各1根, DE數(shù)據(jù)使能信號線1根.
2)ILI9341與STM32F103通信接口.ILI9341配置為8080接口通信(由STM32F103的FSMC實現(xiàn)8080接口時序),使用16根數(shù)據(jù)線按RGB565數(shù)據(jù)格式傳輸圖像數(shù)據(jù).此外還有:CSX片選信號線、RESX復(fù)位信號線、R/WDX讀寫信號線各1根,以及SCL/SDA總線時鐘/信號線.
3)OV7725與STM32F103通信接口.由STM32F103的I2C接口完成與OV7725的通信.OV7725共引出20跟引腳,主要引腳有:D0~D9像素數(shù)據(jù)端口,XCLK/PCLK系統(tǒng)輸入時鐘/像素同步時鐘,HREF/VSYNC行/場同步信號.
為提高系統(tǒng)的可移植性和方便調(diào)試,系統(tǒng)采用模塊化設(shè)計.主要模塊為:圖像數(shù)據(jù)采集模塊、圖像顯示模塊和圖像保存模塊.程序運(yùn)行流程如圖2所示.
圖2 程序運(yùn)行流程Fig.2 Program running process
本設(shè)計以可視門鈴為應(yīng)用背景,通過兩個按鍵中斷實現(xiàn)系統(tǒng)級功能:Key1中斷啟動程序,對板載各個設(shè)備初始化,系統(tǒng)就緒,開啟液晶屏顯示門外彩色圖像;Key2中斷實現(xiàn)截屏保存功能,系統(tǒng)將截屏圖像保存至SD卡內(nèi).硬件操作圖如圖3所示.SD卡內(nèi)移植了FatFs R0.11a版文件系統(tǒng),STM32可對SD卡內(nèi)保存的文件圖像進(jìn)行后期處理.
圖3 硬件操作圖Fig.3 Hardware operation picture
OV7725帶有標(biāo)準(zhǔn)SCCB總線接口,而SCCB總線與I2C總線十分類似,因此STM32可直接使用片上外設(shè)I2C與OV7725通信,實現(xiàn)對OV7725寄存器的參數(shù)配置,進(jìn)而實現(xiàn)圖像數(shù)據(jù)采集.相關(guān)配置參數(shù)可從OV7725數(shù)據(jù)手冊[8]中查詢.配置OV7725寄存器的主要代碼如下:
/*向OV7725寄存器COM7寫入數(shù)據(jù)0x80,
進(jìn)行復(fù)位操作*/
if(0==SCCB_WriteByte(0x12,0x80))
{return ERROR;}
/*從VER寄存器讀取OV7725芯片ID,
以確定OV7725是否處于正常工作狀態(tài)*/
if(0==SCCB_ReadByte(&Sensor_IDCode,1,0x0b)
{return ERROR;}
if(Sensor_IDCode==OV7725_ID)
{/*利用for循環(huán)向OV7725各寄存器寫入
配置參數(shù)*/
for(i=0;i {/*Sensor_Config[i].Address是各寄存器地址,Sensor_Config[i].Value是相應(yīng)寄存器參數(shù)*/ if(0==SCCB_WriteByte(Sensor_Config[i]. Address,Sensor_Config[i].Value)) {return ERROR;} } } OV7725自帶的FIFO幀緩存芯片AL422B解決了OV7725與STM32F103之間傳輸速率不一致的問題.OV7725將采集的圖像數(shù)據(jù)緩存至AL422B后,STM32F103讀取數(shù)據(jù)至ILI9341顯存緩存起來,再傳輸給液晶屏顯示.當(dāng)檢測到攝像頭VSYNC引腳的幀結(jié)束信號時,說明OV7725已經(jīng)輸出一幀圖像至幀緩存,STM32即可調(diào)用Imag_Display()函數(shù)將圖像數(shù)據(jù)輸出至液晶屏.該函數(shù)主要代碼如下: /*在液晶屏上輸出以sx,sy為起點(diǎn), 以width,height為寬高的矩形圖像*/ void Imag_Display(uint16_t sx,uint16_t sy, uint16_t width,uint16_t height) {uint16_t i,j; uint16_t Camera_Data;//RGB565像素值 /*液晶屏顯示窗口設(shè)置*/ ILI9341_OpenWindow(sx,sy,width,height); /*向液晶屏發(fā)送填充像素命令*/ ILI9341_Write_Cmd(CMD_SetPixel); for(i=0;i {for(j=0;j {/*循環(huán)讀取幀緩存數(shù)據(jù),循環(huán)次數(shù)即每 幀像素個數(shù)*/ READ_FIFO_PIXEL(Camera_Data); /*將讀取的數(shù)據(jù)顯示在LCD上*/ ILI9341_Write_Data(Camera_Data); } } } 當(dāng)按下Key2鍵后,當(dāng)前畫面定格1s,并將截屏圖像以BMP格式文件存儲至SD卡.SD卡內(nèi)移植了FatFs R0.11a版文件系統(tǒng),STM32F103就可以調(diào)用FatFs提供的API對截屏文件進(jìn)行讀寫操作.SD卡支持SPI和SDIO兩種模式,SDIO模式存取速度快,適合大吞吐量的數(shù)據(jù)存儲,本系統(tǒng)選擇SDIO通信模式,其與SD卡的數(shù)據(jù)傳輸由DMA完成.關(guān)于SD卡的SDIO通信建立與FatFs文件系統(tǒng)的移植此處不再詳述,請參閱文獻(xiàn)[9-10].BMP圖片保存代碼由Screen_Capture()函數(shù)實現(xiàn),主要代碼如下: int Screen_Capture(uint16_t x,uint16_t y, uint16_t Width, uint16_t Height, char * filename) { /*初始化BMP文件頭*/ unsigned char header[54]= {0x42,0x4d,0,0,0,0,……}; …… /*設(shè)定BMP文件大小*/ file_size=(long)Width*(long)Height*3+ Height*(Width%4)+54; /*新建一個BMP文件*/ bmpres=f_open(&bmpfsrc,(char*)filename, FA_CREATE_ALWAYS|FA_WRITE); f_close(&bmpfsrc);//先關(guān)閉再寫入 bmpres=f_open(&bmpfsrc,(char*)filename, FA_OPEN_EXISTING|FA_WRITE); if(bmpres==FR_OK) {/*將BMP頭部信息寫入文件*/ bmpres=f_write(&bmpfsrc,header,sizeof(unsigned char)*54,&mybw); for(i=0;i {for(j=0;j {read_data=ILI9341_GetPointPixel( x+j,y+Height-1-i); r=GETR_FROM_RGB16(read_data); g=GETG_FROM_RGB16(read_data); b=GETB_FROM_RGB16(read_data); bmpres=f_write(&bmpfsrc,&b,sizeof(unsigned char),&mybw); bmpres=f_write(&bmpfsrc,&g,sizeof(unsigned char),&mybw); bmpres=f_write(&bmpfsrc,&r,sizeof(unsigned char),&mybw);} if(ucAlign ) bmpres=f_write(&bmpfsrc,kk,sizeof(unsigned char)*(ucAlign),&mybw); }/*自此截屏完畢*/ f_close(&bmpfsrc); return 0; } } 字符顯示測試結(jié)果如圖4所示,應(yīng)用于可視門鈴的圖像顯示測試結(jié)果如圖5所示,SD卡保存的BMP圖片如圖6所示.測試過程中圖像輸出(分辨率320×240)達(dá)20幀/s,輸出圖像較為流暢.由于本實驗攝像頭模塊較為低端,因此更換攝像頭將會得到更加清晰的圖像. 圖4 字符顯示Fig.4 Character display 圖5 可視門鈴顯示圖像測試Fig.5 Visual doorbell display image test 圖6 保存的BMP圖片F(xiàn)ig.6 Saved BMP image 經(jīng)實驗驗證,本文所設(shè)計的嵌入式圖像采集系統(tǒng)可實現(xiàn)對靜態(tài)字符和動態(tài)圖像的流暢顯示,系統(tǒng)穩(wěn)定、可靠,且成本低、功耗低、體積小、可拓展性強(qiáng),可應(yīng)用于家庭可視門鈴、公共安防監(jiān)控、無人或高危工業(yè)現(xiàn)場的實時監(jiān)控.2.2 圖像顯示模塊
2.3 圖像保存模塊
3 實驗結(jié)果與分析
4 結(jié)束語