APP下载

基于STM32F407的图像采集系统设计*

2016-07-13任志敏

山西电子技术 2016年3期
关键词:图像采集

任志敏

(常州纺织服装职业技术学院机电工程系,江苏 常州 213164)



基于STM32F407的图像采集系统设计*

任志敏

(常州纺织服装职业技术学院机电工程系,江苏 常州 213164)

摘要:为了解决工业产品表面缺陷检测等需求,需要设计一款低成本的,具有普遍使用价值的数字图像采集系统。以Cortex-M4为内核的STM32F407VG控制器以其特有的DCMI接口无缝连接OV7725图像传感器,采集的图像源数据通过USB接口传输到PC等上位机。

关键词:图像采集;STM32F407;OV7725;USB

随着互联网+技术和工业4.0技术的不断推进,对于自动化技术,工业机器人技术的要求越来越高,需求越来越多。对于一些工业产品的检测,比如产品表面是否有缺陷,传统的做法通常是人工检测,在现有条件下,设计出一款高效,低成本,可靠性有保障的自动检测系统替代人工检测系统具有现实的需求。要实现自动检测系统,首先要解决的就是图像的采集和识别,本文正是基于这一需求尝试解决和实现一款低成本的,有益的,具有普遍使用价值的图像采集系统。

1总体结构设计

本文的设计需求是下位机采集摄像头的像素信号,通过USB接口传送到PC端上位机显示并处理。单从需求的角度出发,首先需要选择目前主流使用的控制器和图像感光元件,使之符合低成本、具有普遍使用价值等特点。

通过比较研究,控制器使用基于Cortex-M4内核的ST公司的STM32F407VG。32位的Cortex-M4内核处理器除了具备低功耗、低成本和易于使用的优点外,还强化了运算能力,增加了浮点、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接口发起采集信号,然后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无效时电平信号状态。

DCMI的DMA传输初始化设置DMA的参数,主要是把DMA存储地址设置成图像数据存储数组的首地址。所有初始化工作完成后就等待上位机发出开始采集的命令。

下位机第二部分程序是通过USB接口接收上位机命令,以及传输图像采集数据到PC端。STM32F407VG支持USB主机和从机功能,完全符合USB2.0规范的On-The-Go补充标准,主机支持LS(低速)和FS(全速)收发器,从机支持FS(全速)收发器,本文把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内核需要使用的的各种变量、状态和缓存等,所有有关USB的操作都需要用到这个句柄实例。

USB_OTG_FS_CORE_ID:决定该USB是高速还是全速设备。

USR_desc:USB设备描述列表

CAM_cb:USB通信的回调函数。

USR_cb:用于处理USB连接,断开等操作时用户处理的额外信息。

初始化USB后,USB收发过程中会调用CAM_cb中定义的回调函数,由于本文采用USB控制传输,因此USB通信通过ep0收发数据。根据USB的规范,控制端传输主要是由一个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是根据请求来决定下一阶段发送数据的长度,在设备描述符里面设定为64字节。根据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规范的USB操作API开源库,即用户程序可以通过调用libusb-win32的API来调用操作系统内核的底层即可[3]。

libusb-win32几乎支持所有的windows操作系统,其后续版本支持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发出对应的命令值,控制下位机配置OV7725是YUV还是RGB Raw Bayer格式输出;配置完成后,再次发出采集命令等待接收一帧图像数据,最后显示。PC端程序的窗口截图如图5所示。

图5 PC端上位机程序窗口截图

通过USB监控采集的数据看,控制断点传输1 024个字节需要时间大约是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

基金项目:常州纺织服装职业技术学院科研基金资助项目(CFK201505)

作者简介:任志敏(1981- ),男,江苏常州人,讲师,工程师,硕士,研究方向:机器视觉,嵌入式系统。

文章编号:1674- 4578(2016)03- 0061- 03

中图分类号:TP393.11

文献标识码:A

猜你喜欢

图像采集
基于WSN的分布式太阳能杀虫灯远程控制系统研究与设计
车牌识别系统的设计与实现
基于FPGA+DSP实时图像采集处理系统设计
基于ARM—Linux的网络视频监控系统的设计
视觉导航系统中图像采集及处理技术综述
基于LabVIEW和USB摄像头的图像采集与处理
交通肇事车辆快速视觉定位系统的设计与实现