你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6568|回复: 0

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第四十一章 摄像头实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-4-1 23:13:36 | 显示全部楼层 |阅读模式
  
<div style="layout-grid:  15.6pt 0pt">
<a name="_Toc342394320">41.1 OV7670简介

OV7670是OV(OmniVision)公司生产的一颗1/6寸的CMOS VGA图像传感器。该传感器体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、度、色度等都可以通过SCCB接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
OV7670的特点有:
l 高灵敏度、低电压适合嵌入式应用
l 标准的SCCB接口,兼容IIC接口
l 支持RawRGB、RGB(GBR4:2:2,RGB565/RGB555/RGB444),YUV(4:2:2)和YCbCr(4:2:2)输出格式
l 支持VGA、CIF,和从CIF到40*30的各种尺寸输出
l 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
l 支持闪光灯
l 支持图像缩放
OV7670的功能框图图如图41.1.1所示:

图41.1.1 OV7670功能框图

       OV7670传感器包括如下一些功能模块。
       1.感光整列(Image Array
OV7670总共有656*488个像素,其中640*480个有效(即有效像素为30W)。
       2.时序发生器(Video Timing Generator
时序发生器具有的功能包括:整列控制和帧率发生(7种不同格式输出)、内部信号发生器和分布、帧率时序、自动曝光控制、输出外部时序(VSYNC、HREF/HSYNC和PCLK)。
3.模拟信号处理(Analog Processing
模拟信号处理所有模拟功能,并包括:自动增益(AGC)和自动白平衡(AWB)。
4.A/D 转换(A/D
原始的信号经过模拟处理器模块之后 ,分G和BR两路进入一个10 位的A/D 转换器,A/D 转换器工作在12M频率,与像素频率完全同步(转换的频率和帧率有关)。
除A/D转换器外,该模块还有以下三个功能:
l 黑电平校正(BLC)
l U/V通道延迟
l A/D范围控制
A/D范围乘积和A/D的范围控制共同设置A/D的范围和最大值,允许用户根据应用调整图片的亮度。
5.测试图案发生器(Test Pattern Generator
测试图案发生器功能包括:八色彩色条图案、渐变至黑白彩色条图案和输出脚移位“1”。
6.数字处理器(DSP
这个部分控制由原始信号插值到RGB 信号的过程,并控制一些图像质量:
l 边缘锐化(二维高通滤波器)
l 颜色空间转换( 原始信号到RGB 或者YUV/YCbYCr)
l RGB色彩矩阵以消除串扰
l 色相和饱和度的控制
l 黑/白点补偿
l 降噪
l 镜头补偿
l 可编程的伽玛
l 十位到八位数据转换
7.缩放功能(Image Scaler
这个模块按照预先设置的要求输出数据格式,能将YUV/RGB信号从VGA缩小到CIF以下的任何尺寸。
8.数字视频接口(Digital Video Port
通过寄存器COM2[1:0],调节IOL/IOH的驱动电流,以适应用户的负载。
9.SCCB接口(SCCB Interface
SCCB接口控制图像传感器芯片的运行,详细使用方法参照光盘的《OmniVision Technologies Seril Camera Control Bus(SCCB) Specification》这个文档
10.LED和闪光灯的输出控制(LED and Storbe Flash Control Output
OV7670有闪光灯模式,可以控制外接闪光灯或闪光LED的工作。
OV7670的寄存器通过SCCB时序访问并设置,SCCB时序和IIC时序十分类似,在本章我们不做介绍,请大家参考光盘的相关文档。
接下来我们介绍一下OV7670的图像数据输出格式。首先我们简单介绍几个定义:
VGA,即分辨率为640*480的输出模式;
QVGA,即分辨率为320*240的输出格式,也就是本章我们需要用到的格式;
QQVGA,即分辨率为160*120的输出格式;
PCLK,即像素时钟,一个PCLK时钟,输出一个像素(或半个像素)。
VSYNC,即帧同步信号。
HREF /HSYNC,即行同步信号。
OV7670的图像数据输出(通过D[7:0])就是在PCLK,VSYNC和HREF/ HSYNC的控制下进行的。首先看看行输出时序,如图41.1.2所示:

图41.1.2 OV7670行输出时序

从上图可以看出,图像数据在HREF为高的时候输出,当HREF变高后,每一个PCLK时钟,输出一个字节数据。比如我们采用VGA时序,RGB565格式输出,每2个字节组成一个像素的颜色(高字节在前,低字节在后),这样每行输出总共有640*2个PCLK周期,输出640*2个字节。
再来看看帧时序(VGA模式),如图41.1.3所示:

图41.1.3 OV7670帧时序

上图清楚的表示了OV7670在VGA模式下的数据输出,注意,图中的HSYNC和HREF其实是同一个引脚产生的信号,只是在不同场合下面,使用不同的信号方式,我们本章用到的是HREF。
因为OV7670的像素时钟(PCLK)最高可达24Mhz,我们用STM32F103ZET6的IO口直接抓取,是非常困难的,也十分占耗CPU(可以通过降低PCLK输出频率,来实现IO口抓取,但是不推荐)。所以,本章我们并不是采取直接抓取来自OV7670的数据,而是通过FIFO读取,ALIENTEK OV7670摄像头模块自带了一个FIFO芯片,用于暂存图像数据,有了这个芯片,我们就可以很方便的获取图像数据了,而不再需要单片机具有高速IO,也不会耗费多少CPU,可以说,只要是个单片机,都可以通过ALIENTEK OV7670摄像头模块实现拍照的功能。
接下来我们介绍一下ALIENTEK OV7670摄像头模块。该模块的外观如图41.1.4:

图41.1.4 ALIENTEK OV7670摄像头模块外观图模块原理图如图41.1.5所示:

图41.1.5 ALIENTEK OV7670摄像头模块原理图

       从上图可以看出,ALIENTEK OV7670摄像头模块自带了有源晶振,用于产生12M时钟作为OV7670的XCLK输入。同时自带了稳压芯片,用于提供OV7670稳定的2.8V工作电压,并带有一个FIFO芯片(AL422B),该FIFO芯片的容量是384K字节,足够存储2帧QVGA的图像数据。模块通过一个2*9的双排排针(P1)与外部通信,与外部的通信信号如表41.1.1所示:
            
信号

            
            
作用描述

            
            
信号

            
            
作用描述

            
            
VCC3.3

            
            
模块供电脚,接3.3V电源

            
            
FIFO_WEN

            
            
FIFO写使能

            
            
GND

            
            
模块地线

            
            
FIFO_WRST

            
            
FIFO写指针复位

            
            
OV_SCL

            
            
SCCB通信时钟信号

            
            
FIFO_RRST

            
            
FIFO读指针复位

            
            
OV_SDA

            
            
SCCB通信数据信号

            
            
FIFO_OE

            
            
FIFO输出使能(片选)

            
            
FIFO_D[7:0]

            
            
FIFO输出数据(8位)

            
            
OV_VSYNC

            
            
OV7670帧同步信号

            
            
FIFO_RCLK

            
            
读FIFO时钟

            
            
 

            
            
 

            

表41.1.1 OV7670模块信号及其作用描述

       下面我们来看看如何使用ALIENTEK OV7670摄像头模块(以QVGA模式,RGB565格式为例)。对于该模块,我们只关心两点:1,如何存储图像数据;2,如何读取图像数据。
       首先,我们来看如何存储图像数据。
       ALIENTEK OV7670摄像头模块存储图像数据的过程为:等待OV7670同步信号àFIFO写指针复位àFIFO写使能à等待第二个OV7670同步信号àFIFO写禁止。通过以上5个步骤,我们就完成了1帧图像数据的存储。
       接下来,我们来看看如何读取图像数据。
     在存储完一帧图像以后,我们就可以开始读取图像数据了。读取过程为:FIFO读指针复位à给FIFO读时钟(FIFO_RCLK)à读取第一个像素高字节à给FIFO读时钟à读取第一个像素低字节à给FIFO读时钟à读取第二个像素高字节à循环读取剩余像素à结束。
       可以看出,ALIENTEK OV7670摄像头模块数据的读取也是十分简单,比如QVGA模式,RGB565格式,我们总共循环读取320*240*2次,就可以读取1帧图像数据,把这些数据写入LCD模块,我们就可以看到摄像头捕捉到的画面了。
       OV7670还可以对输出图像进行各种设置,详见光盘《OV7670 中文数据手册1.01》和《OV7670 software application note》这两个文档,对AL422B的操作时序,请大家参考AL422B的数据手册。
       了解了OV7670模块的数据存储和读取,我们就可以开始设计代码了,本章,我们用一个外部中断,来捕捉帧同步信号(VSYNC),然后在中断里面启动OV7670模块的图像数据存储,等待下一次VSHNC信号到来,我们就关闭数据存储,然后一帧数据就存储完成了,在主函数里面就可以慢慢的将这一帧数据读出来,放到LCD即可显示了,同时开始第二帧数据的存储,如此循环,实现摄像头功能。
本章,我们将使用摄像头模块的QVGA输出(320*240),刚好和战舰STM32开发板使用的LCD模块分辨率一样,一帧输出就是一屏数据,提高速度的同时也不浪费资源。注意:ALIENTEK OV7670摄像头模块自带的FIFO是没办法缓存一帧的VGA图像的,如果使用VGA输出,那么你必须在FIFO写满之前开始读FIFO数据,保证数据不被覆盖。
      
<a name="_Toc342394322">41.3 软件设计
打开上一章的工程,首先在HARDWARE文件夹下新建一个OV7670的文件夹。然后新建如下文件:ov7670.c、sccb.c、ov7670.h、sccb.h、ov7670cfg.h等5个文件,将他们保存在OV7670文件夹下,并将这个文件夹加入头文件包含路径。
       本章总共新增了5个文件,代码比较多,我们就不一一列出了,仅挑两个重要的地方进行讲解。首先,我们来看ov7670.c里面的OV7670_Init函数,该函数代码如下:
u8 OV7670_Init(void)
{
       u8 temp; u16 i=0;  
       //设置IO
       RCC->APB2ENR|=1CRL|=0X03000000;       
      GPIOD->ODR|=1CRH|=0X33000000;         
       GPIOG->ODR=7

《STM32开发指南》第四十一章 摄像头实验.rar

下载

874.29 KB, 下载次数: 44, 下载积分: ST金币 -1

实验36 摄像头实验.rar

下载

185.03 KB, 下载次数: 50, 下载积分: ST金币 -1

回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版