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