任志敏
(常州紡織服裝職業(yè)技術學院機電工程系,江蘇 常州 213164)
?
基于STM32F407的圖像采集系統設計*
任志敏
(常州紡織服裝職業(yè)技術學院機電工程系,江蘇 常州 213164)
摘要:為了解決工業(yè)產品表面缺陷檢測等需求,需要設計一款低成本的,具有普遍使用價值的數字圖像采集系統。以Cortex-M4為內核的STM32F407VG控制器以其特有的DCMI接口無縫連接OV7725圖像傳感器,采集的圖像源數據通過USB接口傳輸到PC等上位機。
關鍵詞:圖像采集;STM32F407;OV7725;USB
隨著互聯網+技術和工業(yè)4.0技術的不斷推進,對于自動化技術,工業(yè)機器人技術的要求越來越高,需求越來越多。對于一些工業(yè)產品的檢測,比如產品表面是否有缺陷,傳統的做法通常是人工檢測,在現有條件下,設計出一款高效,低成本,可靠性有保障的自動檢測系統替代人工檢測系統具有現實的需求。要實現自動檢測系統,首先要解決的就是圖像的采集和識別,本文正是基于這一需求嘗試解決和實現一款低成本的,有益的,具有普遍使用價值的圖像采集系統。
1總體結構設計
本文的設計需求是下位機采集攝像頭的像素信號,通過USB接口傳送到PC端上位機顯示并處理。單從需求的角度出發(fā),首先需要選擇目前主流使用的控制器和圖像感光元件,使之符合低成本、具有普遍使用價值等特點。
通過比較研究,控制器使用基于Cortex-M4內核的ST公司的STM32F407VG。32位的Cortex-M4內核處理器除了具備低功耗、低成本和易于使用的優(yōu)點外,還強化了運算能力,增加了浮點、DSP、并行計算等,用于滿足控制和信號處理混合處理的需求。STM32F407VG控制器是有ST(意法半導體)公司推出的基于Cortex-M4內存的32位嵌入式CPU,其最高主頻可達168 MHz,集成1 024 KByte的Flash,192 Kbyte的SRAM,具有DCMI(數字攝像頭接口)和USB OTG FS接口[2]。
OV7725是Omnivision(美國豪威)公司生產的CMOS感光芯片,其最大分辨率為640×480,30萬像,可以設置不同分辨率。OV7725支持YUV,RGB等不同圖像格式的數據輸出。OV7725主要有三類引腳:一是D0~D9十個數字信號輸出引腳,本文使用D9~D2八個數字信號引腳;二是VSYNC(幀輸出),HREF(行輸出),PCLK(像素信號輸出)三個控制引腳;三是SCCB_D,SCCB_C兩個寄存器配置引腳[1]。
不管是STM32F407VG還是OV7725都是目前主流使用的控制器和圖像傳感器,而且STM32F407集成了DCMI接口、I2C接口和USB接口,DCMI接口可以無縫對接OV7725的數據和控制引腳,I2C接口可以用來連接OV7725的SCCB引腳,USB接口可以作為與PC上位機通信的接口。因此結合需求和選型,本文設計了如圖1所示的總體設計方案。
2軟件設計
2.1軟件構思
整個圖像采集系統的數據流程是PC端上位機程序通過USB接口發(fā)起采集信號,然后STM32F407VG控制OV7725獲取一幀圖像數據,最后通過USB接口傳輸回PC端并顯示。
軟件設計主要分成三個部分:一是STM32F407VG通過DCMI接口采集OV7725的圖像信號;二是采集的信號通過USB傳輸到PC端;三是PC端上位機程序控制和顯示程序。
圖像采集首先需要考慮的問題是輸出數據的格式和分辨率大小。為了使得本圖像采集系統更具有通用性,因此PC端上位機程序設計接收YUV和RGB Raw Bayer兩種圖像格式數據輸出。輸出圖像分辨率的大小由需求和STM32F407VG本身的SRAM大小決定。STM32F407VG的SRAM由可供所有AHB主控總線訪問的(112+16)Kbyte和只供CPU通過數據總線訪問的64 Kbyte組成,結合實際需求,本文設計的OV7725一幀圖像數據輸出分辨率大小為128×120。OV7725 YUV輸出的格式之一是Y U Y V Y U Y V…,RGB Raw Bayer輸出格式為R G R G…,G B G B…,因此一幀YUV數據占據128×120×2=30 720 Byte內存空間,而一幀RGB Raw Bayer數據占據128×120=15 360 Byte內存空間。
2.2下位機程序設計
STM32F407VG通過DCMI接口采集OV7725圖像信號比較簡單,主要就是配置和設置等初始化工作,程序流程如圖2所示。
如前文所述,一幀YUV數據的存儲空間需要30 720 Byte,因此首先聲明一個全局數組用于存放圖像數據,需要注意的是,這個全局數組需要用4個對齊的方式聲明:
__align(4) u8 rawpixel[30720];
SCCB初始化用到STM32F407VG的PB10和PB11兩個引腳,可以用通用IO模擬SCCB時序和STM32F407VG I2C自帶的庫函數實現SCCB兩種方式與OV7725寄存器配置引腳通信。OV7725寄存器配置主要包括配置YUV和RGB Raw Bayer格式輸出,以及分辨率設置。配置成YUV,輸出順序為Y U Y V…的寄存器配置是:
SCCB_WriteReg(0x12,0x40);
SCCB_WriteReg(0x0C,0x10);
配置成RGB Raw Bayer的寄存器配置是:
SCCB_WriteReg(0x12,0x43);
配置分辨率為128x120輸出的寄存器配置是:
// ((int)0x20 << 2) | (0x00 & 0x03) = 128
SCCB_WriteReg(0x29,0x20);
// ((int)0x3C << 1) | ( (0x00 & 0x04) >> 2) = 120
SCCB_WriteReg(0x2C,0x3C);
SCCB_WriteReg(0x2A,0x00);
根據OV7725的說明文檔,圖像寬度輸出的像素大小是由0x29號寄存器值左移兩位與0x2A號寄存器值的低兩位進行位或運算,圖像高度輸出的像素值是由0x0C號寄存器值左移一位與0x2A號寄存器值的第2位進行位或運算。
DCMI接口初始化主要是把STM32F407VG連接OV7725的引腳設置成數字和控制引腳功能,需要特別注意的是默認情況下,OV7725的幀信號VSYNC是低電平有效,行信號HREF是高電平有效,但是在DCMI初始化時,要求設置的是VSYNC和HREF無效時電平信號狀態(tài)。
DCMI的DMA傳輸初始化設置DMA的參數,主要是把DMA存儲地址設置成圖像數據存儲數組的首地址。所有初始化工作完成后就等待上位機發(fā)出開始采集的命令。
下位機第二部分程序是通過USB接口接收上位機命令,以及傳輸圖像采集數據到PC端。STM32F407VG支持USB主機和從機功能,完全符合USB2.0規(guī)范的On-The-Go補充標準,主機支持LS(低速)和FS(全速)收發(fā)器,從機支持FS(全速)收發(fā)器,本文把STM32F407VG的USB接口設置成USB從機功能,接受PC端USB主機控制。STM32F407VG支持控制、大塊數據、中斷和同步四種傳輸方式??紤]到本文一幀圖像數據量不是很大,因此文本USB采用控制傳輸方式。雖然ST公司提供的豐富的USB驅動庫函數,程序設計時調用相應的庫函數即可,但是需要用戶自定義USB參數,包括USB設備描述,配置描述,接口描述和端點描述,主要需要設置PID,VID,控制端點包長度等。設置好參數以后,直接調用USB初始化函數:
USBD_Init(&USB_OTG_dev,
USB_OTG_FS_CORE_ID,&USR_desc,
&CAM_cb, &USR_cb);
這五個參數的含義分別是:
USB_OTG_dev: 申明一個USB的全局句柄實例,用于存儲USB通信中USB內核需要使用的的各種變量、狀態(tài)和緩存等,所有有關USB的操作都需要用到這個句柄實例。
USB_OTG_FS_CORE_ID:決定該USB是高速還是全速設備。
USR_desc:USB設備描述列表
CAM_cb:USB通信的回調函數。
USR_cb:用于處理USB連接,斷開等操作時用戶處理的額外信息。
初始化USB后,USB收發(fā)過程中會調用CAM_cb中定義的回調函數,由于本文采用USB控制傳輸,因此USB通信通過ep0收發(fā)數據。根據USB的規(guī)范,控制端傳輸主要是由一個setup包組成,其C語言定義結構如下:
typedef struct usb_setup_req {
uint8_t bmRequest;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
} USB_SETUP_REQ;
其中bmRequest描述了USB數據傳輸方向,請求類型等參數,本文采用類請求;bRequest是描述符的請求類型,包括標準請求類型和用戶自定義請求類型;wValue是根據不同的請求而設置不同的值,一般用于傳送參數;wIndex是根據不同的請求而設置不同的值。一般用來說明端點號或者說明接口標識;wLength是根據請求來決定下一階段發(fā)送數據的長度,在設備描述符里面設定為64字節(jié)。根據USB的setup包描述,本文設定了表1的USB通信請求。
其中bRequest值為01,03,04為USB傳輸的OUT方向,即從PC到STM32F407VG,02為USB傳輸的IN方向,即從STM32F407VG到PC。
表1 USB通信請求
2.3上位機程序
PC端上位機的USB驅動程序采用libusb-win32開源USB驅動程序庫,上位機采用VC6編譯器,通過調用libusb-win32的API實現與STM32F407VG的USB接口通信。
libusb-win32是由libusb衍生出來的,提供了一系列符合USB規(guī)范的USB操作API開源庫,即用戶程序可以通過調用libusb-win32的API來調用操作系統內核的底層即可[3]。
libusb-win32幾乎支持所有的windows操作系統,其后續(xù)版本支持32位和64位win7/8/10,本文使用的是1.1.6.0版本,PC端的USB驅動程序和上位機程序在win7 32/64和win10 64位系統通過測試。PC端USB驅動程序可以很方便利用libusb-win32提供的inf-wizard工具生成。如圖3所示。
圖3 libusb-win32驅動程序生成工具截圖
只要填入和下位機設置一樣的VID和PID就可以生成與PC平臺相符合的驅動程序。PC端程序的程序流程圖如圖4所示。
圖4 PC端程序流程圖
打開USB設備就是調用libusb-win32的API初始化usb接口,通過VID和PID查找到對應的USB設備,打開并配置好接口;接下來根據表1發(fā)出對應的命令值,控制下位機配置OV7725是YUV還是RGB Raw Bayer格式輸出;配置完成后,再次發(fā)出采集命令等待接收一幀圖像數據,最后顯示。PC端程序的窗口截圖如圖5所示。
圖5 PC端上位機程序窗口截圖
通過USB監(jiān)控采集的數據看,控制斷點傳輸1 024個字節(jié)需要時間大約是19.95 ms,即通信速率約410 Kbps。
3結束語
本文以目前主流使用的STM32F4系列控制器和OV7725圖像傳感器,實現了通過USB的控制事務通道傳輸圖像Raw數據的圖像采集系統,在以后的設計中,可以嘗試通過USB的大塊數據事務通道傳輸圖像數據,加快數據傳輸速率。
參考文獻
[1]Ommvision.OV7725 Datasheet [EB/OL].(2007-12-17).http://www.zhopper.narod.ru/mobile/ov7725_full.pdf
[2]ST.STM32F407VG Datasheet.[EB/OL].(2012-1).http://pdf1.alldatasheet.com/datasheet-pdf/view/504999/STMICROELECTRONICS/STM32F407VG.html.
[3]Libusb.[EB/OL].(2014-06-01).http://www.libusb.org/wiki/libusb-win32.
A Design of Image Capture System
Ren Zhimin
(DepartmentofElectromechanicalEngineering,ChangzhouTextileGarmentInstitute,ChangzhouJiangsu213164,China)
Abstract:In order to detect the surface flaw of industrial products, it is necessary to design a low-cost and useful digital image capture system. With the Cortex-M4 core, the STM32F407VG controller seamlessly connects OV7725 image sensor by DCMI interface. The image raw data is transferred from the controller to PC and other hosts through USB.
Key words:image capture; STM32F407; OV7725; USB
收稿日期:2016-01-16
基金項目:常州紡織服裝職業(yè)技術學院科研基金資助項目(CFK201505)
作者簡介:任志敏(1981- ),男,江蘇常州人,講師,工程師,碩士,研究方向:機器視覺,嵌入式系統。
文章編號:1674- 4578(2016)03- 0061- 03
中圖分類號:TP393.11
文獻標識碼:A