OV7670使用说明和程序讲解
OV7670带FIFO的CMOS摄像头使用说明
OV7670带FIFO的CMOS摄像头使用说明OV7670是一款带有FIFO的CMOS摄像头芯片,广泛应用于各种嵌入式系统中。
它具有低功耗、高灵敏度和高图像质量等特点,适合于图像采集和处理应用。
以下是OV7670带FIFO的CMOS摄像头的使用说明。
一、硬件连接1.连接供电:将模块的VCC引脚连接到3.3V的电源,GND引脚连接到地。
2.数据传输:-使用I2C协议进行配置:将模块的SDA引脚连接到主控芯片的SDA 引脚,SCL引脚连接到主控芯片的SCL引脚。
-使用FIFO模式进行数据传输:将模块的FIFO_WR引脚连接到主控芯片的写使能引脚,FIFO_RD引脚连接到主控芯片的读使能引脚,FIFO_WE 引脚连接到主控芯片的写时钟引脚,FIFO_OE引脚连接到主控芯片的读时钟引脚,FIFO_RST引脚连接到主控芯片的复位引脚,DATA引脚连接到主控芯片的数据引脚。
二、软件配置1.I2C配置:通过I2C协议对OV7670进行配置。
首先初始化I2C总线,然后发送配置指令给OV7670的I2C地址,通过写入特定的寄存器来配置图像参数,如分辨率、亮度、对比度等。
2.FIFO配置:通过FIFO模式进行数据传输。
首先对OV7670进行FIFO模式的配置,设置FIFO的像素格式、帧率等参数。
然后初始化主控芯片的访问FIFO的接口,设置读写使能信号并根据需要配置写时钟和读时钟。
最后,在读取FIFO数据之前,先进行FIFO的复位以确保数据的正确读取。
三、数据采集和处理1.数据采集:通过FIFO模式进行数据采集,将摄像头拍摄到的图像数据存储到FIFO缓存中。
2. 数据处理:从FIFO缓存中读取图像数据,并进行相关的图像处理操作,如图像解码、颜色空间转换、图像滤波等。
可以使用各种图像处理算法和库来实现不同的功能,如OpenCV等。
四、常见问题和解决方案1.图像质量问题:如果发现图像质量差,可以尝试调整摄像头的参数,如增加亮度、对比度等,或者使用图像后处理算法进行图像增强。
OV使用说明和程序讲解
OV使用说明和程序讲解OV是一个非常强大的开源计算机视觉库,用于图像处理、目标检测、分割和识别等任务。
它的使用说明和程序讲解将围绕以下几个方面展开:安装、导入、基本功能、目标检测和图像分割。
一、安装要使用OV,首先需要安装它的Python库。
可以使用pip命令来安装:```pythonpip install opencv-python```安装完成后,可以导入ov库开始使用。
二、导入导入OV库的语法如下:```pythonimport cv2 as ov```这样就可以开始使用OV库的所有功能。
三、基本功能OV提供了许多基本图像处理功能,包括读取和显示图像、调整大小、旋转和翻转等。
1.读取图像:```pythonimage = ov.imread('image.jpg')```2.显示图像:```pythonov.imshow('Image', image)ov.waitKey(0)```3.调整大小:```pythonresized_image = ov.resize(image, (new_width, new_height)) ```4.旋转图像:```pythonrotation_matrix = ov.getRotationMatrix2D((image_width / 2, image_height / 2), rotation_angle, scale)rotated_image = ov.warpAffine(image, rotation_matrix, (image_width, image_height))```5.翻转图像:```pythonflipped_image = ov.flip(image, flip_code)```四、目标检测OV还提供了目标检测的功能,可以在图像中检测出特定目标的位置和边界框。
1.加载目标检测器:```pythondetector = ov.CascadeClassifier('cascade.xml')```2.检测目标:```pythonobjects = detector.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)for (x, y, width, height) in objects:ov.rectangle(image, (x, y), (x + width, y + height), (0, 255, 0), 2)```五、图像分割OV还可以进行图像分割,将图像分成多个区域,以便进一步分析和处理。
OV7670的SCCB波形记录
OV7670的SCCB波形记录OV7670是一种具有SCCB(Serial Camera Control Bus)接口的图像传感器。
SCCB是一种串行的、双向的、主从模式下的总线协议,用于控制和配置摄像头的相关参数。
本文将记录OV7670的SCCB波形,分析不同控制命令的传输过程。
OV7670的SCCB总线使用两条线进行传输,即SDA(Serial Data Line)和SCL(Serial Clock Line)。
SDA负责数据的传输,而SCL则提供时钟信号。
SCCB的通信过程包括起始条件、地址传输、数据传输和停止条件。
首先,我们记录起始条件的波形。
起始条件是指在传输数据之前首先发送一个低电平到高电平的跳变来表示传输开始。
在波形上可以看到SCL在高电平状态,而SDA发生从高电平到低电平的跳变。
这个跳变表示起始条件的建立。
接下来是地址传输的波形。
地址传输用于确定要访问的寄存器或摄像头的内存地址。
先发送设备地址,然后发送寄存器地址。
设备地址是通过SDA线传输的,而时钟信号由SCL提供。
通过观察SCL和SDA信号的变化,我们可以找到传输过程中的起始、终止和数据位。
然后是数据传输的波形。
数据传输用于读取或写入寄存器的内容。
在读取时,先发送设备地址和寄存器地址,然后摄像头返回数据。
在写入时,先发送设备地址和寄存器地址,然后发送要写入的数据。
我们可以通过观察SCL和SDA信号的变化来确定传输过程中的数据位。
最后是停止条件的波形。
停止条件是指在传输数据之后发送一个高电平到低电平的跳变来表示传输结束。
在波形上可以看到SCL在高电平状态,而SDA发生从低电平到高电平的跳变。
这个跳变表示停止条件的建立。
通过对OV7670的SCCB波形的记录和分析,我们可以了解SCCB协议的传输过程。
这对于理解OV7670的工作原理和调试可能的问题很有帮助。
而具体的SCCB波形记录由于篇幅限制无法在此详述,请参考相关的技术文档和资料。
OV7670调试
OV7670 的SCCB (I2C)调试1.几个基本概念A)在数据传输阶段,SDA的变化只能在SCK为低电平的时候,如果在SCK高电平的时候有SDA的变化,则可能表示的是I2C的Start或者StopB)Start:当SCK为高时,SDA从高跳变到低表示I2C总线的StartC)Stop:当SCK为高时,SDA从低跳变到高表示总线的StopD)ACK:每次传输8个bit以后,接收方都会有一个回应,如果为低表示ACK,表示OK,如果为高表示NACK,但不表示就有问题,比如Master接收Slave的数据的过程中不想接收了,就可以发送NACKE)地址 Address:在寻址段,在7位格式的地址中,发送的8位数据前七位为地址,如下图中的0x42, 最后一位表示此次发起的是读还是写,读为高电平,写为低电平。
F)子地址 SubAddress:这个东东在I2C的规范里面其实是没有的,不过很多厂家都喜欢整这个,其实就是地址段后面的一个或者两个自己的数据(一般使用写入R/W=0)。
比如俺们以前的BB没有这个概率,现在新的BB有了这个概念,还支持8位和16位。
1.一个写时序下面是一个写的地址段,加两个数据段的波形,先发送芯片ID,0x42和R/W=0, 然后发送两个写入的数据:0x32,0xb6。
1.一个写加一个读先写一个地址段,0x42,然后写入(RW=0)subaddress 0x0B。
然后重新启动一次传输,发送地址段,0x42, 读取之前写入的subaddress里面的值,读出的值为0x76,因为Master此时为receiver,要终止传输了,所以Master给Salve的回应为NACK。
也就是SCCB规范里面的一个2-phase write加一个2-phase read.4.最后来一个总线上没有设备的波形,上拉很弱。
OV7670的SCCB波形记录
OV7670的SCCB波形记录OV7670是一款基于SCCB(串行摄像头控制总线)协议的摄像头模块,它可以通过SCCB协议与主控设备进行通信和控制。
在本文中,我将为你记录OV7670的SCCB波形,以便更好地理解其通信原理和工作机制。
SCCB协议是一种针对摄像头模块的串行通信协议,类似于I2C协议。
它通过两根信号线(SIOC和SIOD)实现主控设备与摄像头模块之间的数据传输和控制。
下面是一份OV7670的SCCB波形记录:1.启动信号:在开始进行SCCB通信之前,主控设备需要发送一个启动信号,以表明接下来要进行SCCB通信。
启动信号由SIOC引脚拉低,SIOD引脚先拉高再拉低构成。
2.设备地址:主控设备需要发送一个设备地址,以指定要控制的摄像头模块。
设备地址由SIOC引脚拉高,SIOD引脚先拉高再拉低构成。
3.寄存器地址:主控设备需要发送一个寄存器地址,以指定要写入或读取的寄存器。
寄存器地址由SIOC引脚拉高,SIOD引脚先拉高再拉低构成。
4.写入数据:主控设备将要写入的数据发送给摄像头模块。
写入数据由SIOC引脚拉高,SIOD引脚的高低电平表示二进制数据的1和0。
5.等待应答:主控设备在发送完写入数据后,需要等待摄像头模块发送应答信号。
应答信号由摄像头模块通过SIOD引脚拉低来表示。
6.读取数据:主控设备需要读取摄像头模块的数据时,向摄像头模块发送一个读取命令。
读取命令由SIOC引脚拉高,SIOD引脚先拉低再拉高构成。
7.读取数据应答:摄像头模块在收到读取命令后,会发送要读取的数据给主控设备。
读取的数据由SIOC引脚拉高,SIOD引脚的高低电平表示二进制数据的1和0。
以上是OV7670的SCCB通信过程中的一些重要波形记录。
通过这些波形,我们可以清楚地了解到每个步骤的具体控制信号和数据传输情况。
这有助于我们更好地理解OV7670和SCCB协议的工作原理,并可以根据需要进行相关的控制和操作。
总结起来,OV7670的SCCB波形记录包括启动信号、设备地址、寄存器地址、写入数据、等待应答、读取数据和读取数据应答等几个重要步骤的信号和数据情况。
OV7670摄像头彻底解读
4 / 23
2013‐2‐21
[艾曼电子技术文档 HTTP:// ]
二、 OV7670 摄像头怎么用
1. 摄像头硬件电路
数据传输的终止
图 8 SCCB 终止信号 tPSC 是 SCCB——E 上升沿,SIO_D 保持逻辑高电平的时间,最小为 15ns; tPSA 是 SIO_D 上升沿,SCCB_E 必须保持低电平的时间,最小为 0ns。
2.3 SCCB 写时序
写时序由 3 相构成。先写设备地址,再写寄存器地址,最后写寄存器的值,即 ID‐Address + SUB‐Address + W‐Data。OV7670 的设备地址为 0x42,最后一位用来判断读写,即读的时候为 0x43。
2 / 23
2013‐2‐21
[艾曼电子技术文档 HTTP:// ]
15
DVDD
Power
Power supply (VDD-C= 1.8 VDC + 10%) for digital output drive
16
HREF
Output
HREF output
Power Down Mode Selection - active high, internal
U1
A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 D1 D2 E1 E2 E3 E4 E5 F1 F2 F3 F4 F5
AVDD SIO_D SIO_C D1 D3 PWDN VREF2 AGND D0 D2 DVDD VREF1 VSYNC HREF PCLK STROBE XCLK D7 D5 DOVDD RESET# DOGND D6 D4
OV7670照相模组硬件应用指南1.01 OVT
O
V
Co
修改日期:2007-12-12 版本: 1.06
nf
OmniVision 公司机密
id e
nt
ia l
OV7670 照相模组硬件应用指南
Table of Contents
1. OV7670 模组参考设计................................................................................................................... 3 注:...................................................................................................................................................... 3 1.PWDN 和 RESET 不用时,应接地.................................................................................................3 2. OV7670 模组接口参考设计........................................................................................................... 4 2.1 引脚定义...............................................................................................................................
OV7670摄像头彻底解读
4 / 23
2013‐2‐21
[艾曼电子技术文档 HTTP:// ]
二、 OV7670 摄像头怎么用
1. 摄像头硬件电路
13
Y7
Output
14 DOVDD
Power
功能定义 Output bit[0] - LSB for 10-bit RGB only
Output bit[1] - for 10-bit RGB only Output bit[4] Output bit[3] Output bit[5]
Output bit[2] - LSB for 8-bit YUV Output bit[6]
END <= 0;
end
//Start
6'd1 : begin
SCLK <= 1;
I2C_BIT <= 1;
ACKW1 <= 1; ACKW2 <= 1; ACKW3 <= 1;
END <= 0;
end
6'd2 : I2C_BIT <= 0;
//I2C_SDAT = 0
6'd3 : SCLK <= 0;
6'd8 : I2C_BIT <= I2C_WDATA[19]; //Bit4
6'd9 : I2C_BIT <= I2C_WDATA[18]; //Bit3
6'd10 : I2C_BIT <= I2C_WDATA[17]; //Bit2
6'd11 : I2C_BIT <= I2C_WDATA[16]; //Bit1
OV7670带FIFO的CMOS摄像头使用说明
OV7670-CMOS摄像头使用说 明2014.2.10 参赛平台1.OV7670带FIFO 模块1.简介:OV7670带FIFO 模块,是针对慢速的MCU 能够实现图像采集控制推出的带有缓冲存储空间的一种模块。
这种模块增加了一个FIFO (先进先出)存储芯片,同样包含30w 像素的CMOS 图像感光芯片,3.6mm 焦距的镜头和镜头座,板载CMOS 芯片所需要的各种不同电源(电源要求详见芯片的数据文件),板子同时引出控制管脚和数据管脚,方便操作和使用。
图1.OV7670带FIFO模块 2.管脚定义:参赛平台如图,控制传感器所需的管脚定义如下:3V3-----输入电源电压(推荐使用3.3,5V 也可,但不推荐)GDN-----接地点SIO_C---SCCB 接口的控制时钟(注意:部分低级单片机需要上拉控制,和I2C 接口类似)SIO_D---SCCB 接口的串行数据输入(出)端(注意:部分低级单片机需要上拉控制,和I2C 接口类似) VSYNC---帧同步信号(输出信号)HREF----行同步信号(输出信号)PCLK----像素时钟(输出信号)XCLCK---时钟信号(输入信号)D0-D7---数据端口(输出信号)RESTE---复位端口(正常使用拉高)PWDN----功耗选择模式(正常使用拉低)STROBE—拍照闪光控制端口(正常使用可以不需要)FIFO_RCK---FIFO 内存读取时钟控制端FIFO_WR_CTR----FIFO 写控制端(1为允许CMOS 写入到FIFO,0为禁止) FIFO_OE----FIFO 关断控制FIFO_WRST—FIFO 写指针服务端FIFO_RRST—FIFO 读指针复位端 参赛平台图7.FIFO摄像头接口定义3.控制方式说明由于采用了FIFO 做为数据缓冲,数据采集大大简便,用户只需要关心是如何读取即可,不需要关心具体数据是如何采集到的,这样可减小甚至不用关心CMOS 的控制以及时序关系,就能够实现图像的采集。
ov7670在it液晶屏上的程序
用STM32F207 的DCMI接口驱动OV7670摄像头,目前我已经获取了摄像头图像,速度也很不错,图像也清晰,但是不知道为什么我的图像会一直走动,如图(原文件名:Catch(09-09-14-49-12).jpg)整个屏幕的图像会一直往下走,如此循环反复。
但是图像又是动态的,比如手在摄像头前晃动,图像里面的手也会动的,只是图像没有固定住,一直走动,请问下高手,这是什么原因啊?LCD驱动是ST官方的ili9320,摄像头的是在官方的9655驱动上改动初始化代码的。
DCMI 接口代码如下:/******************************************************************************** @函数名称DCMI_Config* @函数说明DCMI接口配置* @输入参数无* @输出参数无* @返回参数无*******************************************************************************/ void DCMI_Config(void){DCMI_InitTypeDef DCMI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitStructure;//使能DAMI 的GPIO时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);//使能DCMI时钟RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);//连接DCMI管脚到AF13功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_DCMI);// DCMI GPIO 配置// D0..D4(PC6/7/8/9/11)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;GPIO_Init(GPIOC, &GPIO_InitStructure);// D5..D7(PB6/8/9), VSYNC(PB7)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_Init(GPIOB, &GPIO_InitStructure);// PCLK(PA6) HSYNC(PA4)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// DCMI 配置DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b;DCMI_Init(&DCMI_InitStructure);// 配置DMA2 传输数据从DCMI 到LCD// 使能DMA2 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//DMA2 Stream1 配置DMA_DeInit(DMA2_Stream1);DMA_InitStructure.DMA_Channel = DMA_Channel_1;DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;DMA_InitStructure.DMA_Memory0BaseAddr = FSMC_LCD_ADDRESS;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream1, &DMA_InitStructure);}摄像头的初始化数组,移植的是网友的,稍微动了以下。
ov7670寄存器配置调试总结
废话后面说,先直接上OV7670寄存器的配置部分const uint8_t OV7670_Reg[][2]={//Frame Rate Adjustment for 24Mhz input clock//30fps PCLK=24MHz{0x11, 0x80},//软件应用手册上设置的是0x80,例程设置的是0x00{0x6b, 0x0a},//PLL控制,软件应用手册上设置的是0x0a,例程设置的是0x40,将PLL调高的话就会产生花屏{0x2a, 0x00},{0x2b, 0x00},{0x92, 0x00},{0x93, 0x00},{0x3b, 0x0a},//Output format{0x12, 0x14},//QVGA(320*240)、RGB//RGB555/565 option(must set COM7[2] = 1 and COM7[0] = 0){0x40, 0x10},//RGB565,effective only when RGB444[1] is low{0x8c, 0x00},//Special effects - 特效//normal{0x3a, 0x04},{0x67, 0xc0},{0x68, 0x80},//Mirror/VFlip Enable - 水平镜像/竖直翻转使能{0x1e, 0x37},//修改配置值将产生图像显示上下或左右颠倒//Banding Filter Setting for 24Mhz Input Clock - 条纹滤波器//30fps for 60Hz light frequency//{0x13, 0xe7},//banding filer enable//{0x9d, 0x98},//50Hz banding filer//{0x9e, 0x7f},//60Hz banding filer//{0xa5, 0x02},//3 step for 50Hz//{0xab, 0x03},//4 step for 60Hz//{0x3b, 0x02},//select 60Hz banding filer//Simple White Balance - 白平衡//{0x13, 0xe7},//AWB、AGC、AGC Enable and ...//{0x6f, 0x9f},//simple AWB//AWBC - 自动白平衡控制(Automatic white balance control)//{0x43, 0x14},//用户手册里这些寄存器的值都是保留(Reserved),不用设置的呀?//{0x44, 0xf0},//{0x45, 0x34},//{0x46, 0x58},//{0x47, 0x28},//{0x48, 0x3a},//AWB Control//{0x59, 0x88},//用户手册连寄存器都是保留,初始值都没提供//{0x5a, 0x88},//{0x5b, 0x44},//{0x5c, 0x67},//{0x5d, 0x49},//{0x5e, 0x0e},//AWB Control//{0x6c, 0x0a},//{0x6d, 0x55},//{0x6e, 0x11},//{0x6f, 0x9f},//AGC/AEC - Automatic Gain Control自动增益补偿/Automatic exposure Control自动曝光控制//{0x00, 0x00},//{0x14, 0x20},//{0x24, 0x75},//{0x25, 0x63},//{0x26, 0xA5},//AEC algorithm selection - AEC公式选择//{0xaa, 0x94},//基于平均值的AEC算法Average-based AEC algorithm/基于直方图的AEC算法Histogram-based AEC algorithm//基于直方图的AGC/AEC的控制//{0x9f, 0x78},//{0xa0, 0x68},//{0xa6, 0xdf},//{0xa7, 0xdf},//{0xa8, 0xf0},//{0xa9, 0x90},//Fix Gain Control - 固定增益控制//{0x69, 0x5d},//Fix gain for Gr channel/for Gb channel/for R channel/for B channel//Color saturation 颜色饱和度+ 0//{0x4f, 0x80},//{0x50, 0x80},//{0x51, 0x00},//{0x52, 0x22},//{0x53, 0x5e},//{0x54, 0x80},//{0x58, 0x9e},//Brightness - 亮度+ 0//{0x55, 0x00},//Contrast - 对比度+ 0//{0x56, 0x40},//Gamma Curve - 伽马曲线//{0x7a, 0x20},//{0x7b, 0x1c},//{0x7c, 0x28},//{0x7d, 0x3c},//{0x7e, 0x55},//{0x7f, 0x68},//{0x80, 0x76},//{0x81, 0x80},//{0x82, 0x88},//{0x83, 0x8f},//{0x84, 0x96},//{0x85, 0xa3},//{0x86, 0xaf},//{0x87, 0xc4},//{0x88, 0xd7},//{0x89, 0xe8},//Matrix Coefficient - 色彩矩阵系数//{0x4f, 0x80},//{0x50, 0x80},//{0x51, 0x00},//{0x52, 0x22},//{0x53, 0x5e},//{0x54, 0x80},//Lens Correction Option - 镜头补偿选项 //{0x62, 0x00},//{0x63, 0x00},//{0x64, 0x04},//{0x65, 0x20},//{0x66, 0x05},//{0x94, 0x04},//effective only when LCC5[2] is high//{0x95, 0x08},//effective only when LCC5[2] is high//注释这些配置的话,就倾斜显示,并显示多块,这到底是控制什么的?跟时序图有关?{0x17, 0x16},//行频Horizontal Frame开始高八位(低三位在HREF[2:0]){0x18, 0x04},//行频Horizontal Frame结束高八位(低三位在HREF[5:3]){0x19, 0x02},//场频Vertical Frame开始高八位(低二位在VREF[1:0]){0x1a, 0x7b},//场频Vertical Frame结束高八位(低二位在VREF[3:2]){0x32, 0x80},//HREF{0x03, 0x06},//VREF//注释这个配置的话,就显示花屏了{0x15, 0x02},//配置PCLK、HREF、VSYNC相关//Automatic black Level Compensation - 自动黑电平校正{0xb0, 0x84},//调试时注释这项配置时,颜色显示不正常了,红色练绿色,绿色变红色,但用户手册对这寄存器是保留RSVD//{0xb1, 0x0c},//{0xb2, 0x0e},//{0xb3, 0x82},//{0xb8, 0x0a},//SCALING_xx寄存器//{0x70, 0x00},//{0x71, 0x00},//{0x72, 0x11},//{0x73, 0x08},//{0x3e, 0x00},//ADC//{0x37, 0x1d},//ADC控制ADC Control//{0x38, 0x71},//ADC和模拟共模控制ADC and Analog Common Mode Control//{0x39, 0x2a},//ADC偏移控制ADC Offset Control//零杂的寄存器//{0x92, 0x00},//空行低八位Dummy Line low 8 bits//{0xa2, 0x02},//像素时钟延时//{0x0c, 0x0c},//{0x10, 0x00},//{0x0d, 0x01},//{0x0f, 0x4b},//{0x3c, 0x78},//{0x74, 0x19},//用户手册里这几个寄存器都是保留RSVD//{0x0e, 0x61},//{0x16, 0x02},//{0x21, 0x02},//{0x22, 0x91},//{0x29, 0x07},//{0x33, 0x0b},//{0x35, 0x0b},//{0x4d, 0x40},//{0x4e, 0x20},//{0x8d, 0x4f},//{0x8e, 0x00},//{0x8f, 0x00},//{0x90, 0x00},//{0x91, 0x00},//{0x96, 0x00},//{0x9a, 0x80},};刚开始学OV7670摄像头,我想大家跟我一样心里很毛躁吧,一个模块需要你配置100多个寄存器,但用户手册对寄存器的介绍却草草的一笔带过,自己无从下手啊,只能看开发板给的例程和上网找一些大虾的帖子了。
OV7670摄像头 入门基础知识
颜色空间指不同波长的电磁波谱与不同物质相互作用所构成的色谱空间。
颜色空间也称色彩模型(又称彩色空间或彩色系统),它的用途是在某些标准下用通常可接受的方式对彩色加以说明。
色彩模型是描述使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。
本质上,色彩模型是坐标系统和子空间的阐述。
通俗地说,自然界的多彩空间是复杂变换的,在不同的应用领域人们在这个复杂的色彩空间中采用的色彩范围或者说是选取的色彩范围有所不同或者是表述方法不同。
因此就出现了多种多样的空间色彩描述方法,即不同的颜色空间。
颜色空间有许多种,常用有RGB,CMY,YUV,HSV,HSI等。
RGB颜色空间根据三基色原理,用基色光单位来表示光的量,则在RGB颜色空间,任意色光F都可以用R、G、B三色不同分量的相加混合而成:F=r [ R ] + g [ G ] + b [ B ]RGB颜色空间还可以用一个三维的立方体来描述,如下图。
这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
实际应用中RGB存在系列标准。
RAW RGBSensor的感光原理是通过一个一个的感光点对光进行采样和量化,但,在Sensor中,每一个感光点只能感光RGB中的一种颜色。
所以,通常所说的30万像素或130万像素等,指的是有30万或130万个感光点。
每一个感光点只能感光一种颜色。
但是,要还原一个真正图像,需要每一个点都有RGB三种颜色,所以,对于CCIR601或656的格式,在Sensor模组的内部会有一个ISP 模块,会将Sensor采集到的数据进行插值和特效处理,例如:如果一个感光点感应的颜色是R,那么,ISP模块就会根据这个感光点周围的G、B感光点的数值来计算出此点的G、B值,那么,这一点的RGB值就被还原了,然后在编码成601或656的格式传送给Host。
而RAW RGB格式的Sensor则是将没个感光点感应到的RGB数值直接传送给Host,由Host来进行插值和特效处理。
OV7670 中文版数据手册_30p
功能
● ● ● ●
● ● ●
● ● ● ● ● ● ● ●
高灵敏度适合低照度应用 低电压适合嵌入式应用 标准的 SCCB 接口,兼容 I2C 接口 RawRGB,RGB(GRB4:2:2,RGB565/555/444),YUV (4:2:2)和 YCbCr(4:2:2)输出格式 支持 VGA,CIF,和从 CIF 到 40x30 的各种尺寸 VarioPixel 子采样方式 自动影响控制功能包括:自动曝光控制、自 动增益控制、自动白平衡,自动消除灯光条 纹、自动黑电平校准.图像质量控制包括色饱 和度、色相、伽玛、锐度和 ANTI_BLOOM ISP 具有消除噪声和坏点补偿功能 支持闪光灯:LED 灯和氙灯 支持图像缩放 镜头失光补偿 50/60Hz 自动检测 饱和度自动调节(UV 调整) 边缘增强自动调节 降噪自动调节
5
1.4 版 2006年 8 月 21 日
版 所有
OV7670/OV7171 CMOS VGA(OmniPixel ®)CAMERACHIPTM 图像传感器
表4
符号
功能和交流特性(-30°C<TA<70°C)
参数
最小值
典型值
最大值
单位
功能特性 A/D 微分非线性 A/D 积分非线性 AGC 范围 红/蓝 调整范围 输入(PWDN,CLK,RESET#) fCLK tCLK tCLK:DC tS:RESET tS:REG 输入时钟频率 输入时钟周期 时钟占空比 软件/硬件复位后稳定时间 寄存器改变后稳定时间(需要 10 场) 10 21 45 24 42 50 48 100 55 1 300 MHz ns % ms ms ±1/2 ±1 30 12 LSB LSB dB dB
ov7670寄存器配置调试总结
废话后面说,先直接上OV7670寄存器的配置部分const uint8_t OV7670_Reg[][2]={//Frame Rate Adjustment for 24Mhz input clock//30fps PCLK=24MHz{0x11, 0x80},//软件应用手册上设置的是0x80,例程设置的是0x00{0x6b, 0x0a},//PLL控制,软件应用手册上设置的是0x0a,例程设置的是0x40,将PLL调高的话就会产生花屏{0x2a, 0x00},{0x2b, 0x00},{0x92, 0x00},{0x93, 0x00},{0x3b, 0x0a},//Output format{0x12, 0x14},//QVGA(320*240)、RGB//RGB555/565 option(must set COM7[2] = 1 and COM7[0] = 0){0x40, 0x10},//RGB565,effective only when RGB444[1] is low{0x8c, 0x00},//Special effects - 特效//normal{0x3a, 0x04},{0x67, 0xc0},{0x68, 0x80},//Mirror/VFlip Enable - 水平镜像/竖直翻转使能{0x1e, 0x37},//修改配置值将产生图像显示上下或左右颠倒//Banding Filter Setting for 24Mhz Input Clock - 条纹滤波器//30fps for 60Hz light frequency//{0x13, 0xe7},//banding filer enable//{0x9d, 0x98},//50Hz banding filer//{0x9e, 0x7f},//60Hz banding filer//{0xa5, 0x02},//3 step for 50Hz//{0xab, 0x03},//4 step for 60Hz//{0x3b, 0x02},//select 60Hz banding filer//Simple White Balance - 白平衡//{0x13, 0xe7},//AWB、AGC、AGC Enable and ...//{0x6f, 0x9f},//simple AWB//AWBC - 自动白平衡控制(Automatic white balance control)//{0x43, 0x14},//用户手册里这些寄存器的值都是保留(Reserved),不用设置的呀?//{0x44, 0xf0},//{0x45, 0x34},//{0x46, 0x58},//{0x47, 0x28},//{0x48, 0x3a},//AWB Control//{0x59, 0x88},//用户手册连寄存器都是保留,初始值都没提供//{0x5a, 0x88},//{0x5b, 0x44},//{0x5c, 0x67},//{0x5d, 0x49},//{0x5e, 0x0e},//AWB Control//{0x6c, 0x0a},//{0x6d, 0x55},//{0x6e, 0x11},//{0x6f, 0x9f},//AGC/AEC - Automatic Gain Control自动增益补偿/Automatic exposure Control自动曝光控制//{0x00, 0x00},//{0x14, 0x20},//{0x24, 0x75},//{0x25, 0x63},//{0x26, 0xA5},//AEC algorithm selection - AEC公式选择//{0xaa, 0x94},//基于平均值的AEC算法Average-based AEC algorithm/基于直方图的AEC算法Histogram-based AEC algorithm//基于直方图的AGC/AEC的控制//{0x9f, 0x78},//{0xa0, 0x68},//{0xa6, 0xdf},//{0xa7, 0xdf},//{0xa8, 0xf0},//{0xa9, 0x90},//Fix Gain Control - 固定增益控制//{0x69, 0x5d},//Fix gain for Gr channel/for Gb channel/for R channel/for B channel//Color saturation 颜色饱和度+ 0//{0x4f, 0x80},//{0x50, 0x80},//{0x51, 0x00},//{0x52, 0x22},//{0x53, 0x5e},//{0x54, 0x80},//{0x58, 0x9e},//Brightness - 亮度+ 0//{0x55, 0x00},//Contrast - 对比度+ 0//{0x56, 0x40},//Gamma Curve - 伽马曲线//{0x7a, 0x20},//{0x7b, 0x1c},//{0x7c, 0x28},//{0x7d, 0x3c},//{0x7e, 0x55},//{0x7f, 0x68},//{0x80, 0x76},//{0x81, 0x80},//{0x82, 0x88},//{0x83, 0x8f},//{0x84, 0x96},//{0x85, 0xa3},//{0x86, 0xaf},//{0x87, 0xc4},//{0x88, 0xd7},//{0x89, 0xe8},//Matrix Coefficient - 色彩矩阵系数//{0x4f, 0x80},//{0x50, 0x80},//{0x51, 0x00},//{0x52, 0x22},//{0x53, 0x5e},//{0x54, 0x80},//Lens Correction Option - 镜头补偿选项 //{0x62, 0x00},//{0x63, 0x00},//{0x64, 0x04},//{0x65, 0x20},//{0x66, 0x05},//{0x94, 0x04},//effective only when LCC5[2] is high//{0x95, 0x08},//effective only when LCC5[2] is high//注释这些配置的话,就倾斜显示,并显示多块,这到底是控制什么的?跟时序图有关?{0x17, 0x16},//行频Horizontal Frame开始高八位(低三位在HREF[2:0]){0x18, 0x04},//行频Horizontal Frame结束高八位(低三位在HREF[5:3]){0x19, 0x02},//场频Vertical Frame开始高八位(低二位在VREF[1:0]){0x1a, 0x7b},//场频Vertical Frame结束高八位(低二位在VREF[3:2]){0x32, 0x80},//HREF{0x03, 0x06},//VREF//注释这个配置的话,就显示花屏了{0x15, 0x02},//配置PCLK、HREF、VSYNC相关//Automatic black Level Compensation - 自动黑电平校正{0xb0, 0x84},//调试时注释这项配置时,颜色显示不正常了,红色练绿色,绿色变红色,但用户手册对这寄存器是保留RSVD//{0xb1, 0x0c},//{0xb2, 0x0e},//{0xb3, 0x82},//{0xb8, 0x0a},//SCALING_xx寄存器//{0x70, 0x00},//{0x71, 0x00},//{0x72, 0x11},//{0x73, 0x08},//{0x3e, 0x00},//ADC//{0x37, 0x1d},//ADC控制ADC Control//{0x38, 0x71},//ADC和模拟共模控制ADC and Analog Common Mode Control//{0x39, 0x2a},//ADC偏移控制ADC Offset Control//零杂的寄存器//{0x92, 0x00},//空行低八位Dummy Line low 8 bits//{0xa2, 0x02},//像素时钟延时//{0x0c, 0x0c},//{0x10, 0x00},//{0x0d, 0x01},//{0x0f, 0x4b},//{0x3c, 0x78},//{0x74, 0x19},//用户手册里这几个寄存器都是保留RSVD//{0x0e, 0x61},//{0x16, 0x02},//{0x21, 0x02},//{0x22, 0x91},//{0x29, 0x07},//{0x33, 0x0b},//{0x35, 0x0b},//{0x4d, 0x40},//{0x4e, 0x20},//{0x8d, 0x4f},//{0x8e, 0x00},//{0x8f, 0x00},//{0x90, 0x00},//{0x91, 0x00},//{0x96, 0x00},//{0x9a, 0x80},};刚开始学OV7670摄像头,我想大家跟我一样心里很毛躁吧,一个模块需要你配置100多个寄存器,但用户手册对寄存器的介绍却草草的一笔带过,自己无从下手啊,只能看开发板给的例程和上网找一些大虾的帖子了。
OV7670摄像头驱动及VGA显示
end
6'd2 : I2C_BIT <= 0;//I2C_SDAT = 0
6'd3 : SCLK <= 0;//I2C_SCLK = 0
//SLAVE ADDR--ACK1
6'd4 : I2C_BIT <= I2C_WDATA[23];//Bit8
6'd5 : I2C_BIT <= I2C_WDATA[22];//Bit7
6'd12 : I2C_BIT <= 0;//High-Z, Input
6'd13 : ACKW1<= I2C_SDAT;//ACK1
6'd14 : I2C_BIT <= 0;//Delay
//SUB ADDR--ACK2
6'd15 : I2C_BIT <= I2C_WDATA[15];//Bit8
另外,在图像处理的实时性方面,一般的所用的PC软件或MCU软件方法已不能满足要求,究其原因就是因为其本质是顺序执行指令,不能做并行处理,而一般采集的图像数据量较大,运算量也比较大.另一方面,现今的图像处理应用也向嵌入式小型化方向发展.因此,现场可编程门阵列FPGA以其较高的并行处理能力,丰富的内部资源和较大的灵活性,在视频频图像方面,显现出独特的优势.
6'd8 : I2C_BIT <= I2C_WDATA[19];//Bit4
6'd9 : I2C_BIT <= I2C_WDATA[18];//Bit3
6'd10 : I2C_BIT <= I2C_WDATA[17];//Bit2
6'd11 : I2C_BIT <= I2C_WDATA[16];//Bit1
摄像头模块使用_AN1202
图 1.4 ALIENTEK OV7670 摄像头模块外观图
2012-11-02
ALIENTEK MiniSTM32开发板
模块原理图如图 1.5 所示:
AN1202
图 1.5 ALIENTEK OV7670 摄像头模块原理图
从上图可以看出,ALIENTEK OV7670 摄像头模块自带了有源晶振,用于产生 12M 时
WEN VSYNC
MiniSTM32 开发板
2、硬件连接
通过前面的介绍,我们知道,ALIENTEK OV7670 摄像头模块与 MCU 连接需要 16 根
信号线,以及 2 根电源线。这 16 根信号线与 ALIENTEK MiniSTM32 开发板的连接关系如
表 2.1 所示:
摄像头模块与开发板连接关系
OV7670 摄像头模块
D0~D7
SCL SDA WRST RCLK RRST OE
2012-11-02
ALIENTEK MiniSTM32开发板
AN1202
图 1.3 OV7670 帧时序 上图清楚的表示了 OV7670 在 VGA 模式下的数据输出,注意,图中的 HSYNC 和 HREF 其实是同一个引脚产生的信号,只是在不同场合下面,使用不同的信号方式,这里我们用到 的是 HREF。 因为 OV7670 的像素时钟(PCLK)最高可达 24Mhz,我们用 STM32F103RBT6 的 IO 口直接抓取,是非常困难的,也十分占耗 CPU(可以通过降低 PCLK 输出频率,来实现 IO 口抓取,但是不推荐)。所以,这里我们并不是采取直接抓取来自 OV7670 的数据,而是通 过 FIFO 读取,ALIENTEK OV7670 摄像头模块自带了一个 FIFO 芯片,用于暂存图像数据, 有了这个芯片,我们就可以很方便的获取图像数据了,而不再需要单片机具有高速 IO,也 不会耗费多少 CPU,可以说,只要是个单片机,都可以通过 ALIENTEK OV7670 摄像头模 块实现拍照的功能。 接下来我们介绍一下 ALIENTEK OV7670 摄像头模块。该模块的外观如图 1.4:
OV7670 中文版数据手册1.01
OV7670/OV7171CM OS VGA(O m niPixel®)CAMERAC 简介功能●●●●●●●●●●●●●●●1 OV7670/OV7171管脚图(俯视OV7670/OV7171 CMOS VGA 图像传感器数据手册数据手册. OmniPixel,VarioPixel,OmniVision图标已注册为功能简介图2 描述的是OV7670/OV7171图像传感器的功能模块,包括:●感光阵列(共有656x488个像素,其中在YUV的模式中,有效像素为640x480个)●模拟信号处理●A/D转换●测试图案发生器●数字信号处理器●图像缩放●时序发生器●数字视频端口●SCCB接口●LED和闪光灯输出控制图 2 功能框Note1: DSP*(镜头校正、去噪声、黑白点补偿、自动白平衡等) 7670CSP_DS_002测试图案发生器测试图案发生器有如下功能:●八色彩色条图案●渐变至黑白彩色条图案●输出脚移位“1”数字处理器(DSP)这个模块控制由原始信号插值到RGB 信号的过程,并控制一些图像质量:●边缘锐化(二维高通滤波器)●颜色空间转换(原始信号到RGB 或者YUV/YCbYCr)●RGB 色彩矩阵以消除串扰●色相和饱和度的控制●黑/白点补偿●降噪●镜头补偿●可编程的伽玛●十位到八位数据转换缩放功能这个模块按照预先设置的要求输出数据格式,能将YUV/RGB 信号从VGA 缩小到CIF 以下的任何尺寸。
数字视频接口寄存器COM2[1:0]调节IOL/IOH 的驱动电流,以适应用户的负载。
SCCB 接口SCCB 接口控制图像传感器芯片的运行,详细使用方法参照OmniVision Te ch nolo g ies Seril Camera Control B u s(SCCB) Spe c ifi c ation LED 和闪光灯的输出控制OV7670/OV7171有闪光灯模式,控制外接闪光灯或闪光LED 的工作。
0.OV7670_中文版数据手册1.01介绍
-
1.7
See Notea
See NoteC
10+8b 1
IDDB-PWDN
10
VIH
输入高电平
CMOS
0.7xVDD-IO
VIL
输入低电平
VOH
输出高电平
CMOS
0.9xVDD-IO
VOL
输出低电平
IOH
高电平输出电流
See Noteb 8
IOL
低电平输出电流
15
IL
输入/输出漏电流
GND 到 VDD-IO
像素面积 3.6 µm x 3.6 µm
暗电流 12 mV/s at 60℃
Well capacity 17Ke
影响区域 2.36mmx1.76mm
封装尺寸 3785umx4235um
a. 如果使用内部 LDO 给核供电(1.8V),I/O 电压应该
是 2.45V 或更高,否则必须使用外部 1.8V 给核供电。
版 所有
OV7670/OV7171 CMOS VGA(OmniPixel®)CAMERACHIPTM图像传感器
表 4 功能和交流特性(-30°C<TA<70°C)
符号
参数
最小值
功能特性
A/D 微分非线性
A/D 积分非线性
AGC 范围
红/蓝 调整范围
输入(PWDN,CLK,RESET#)
fCLK
输入时钟频率
图 3 显示图像传感器的剖面图。
测试图案发生器
测试图案发生器有如下功能: ● 八色彩色条图案 ● 渐变至黑白彩色条图案 ● 输出脚移位“1”
数字处理器(DSP)
这个模块控制由原始信号插值到 RGB 信号的过程,并
OV7670使用说明和程序讲解
图 38.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)
图 38.1.2 OV7670 行输出时序 从上图可以看出,图像数据在 HREF 为高的时候输出,当 HREF 变高后,每一个 PCLK 时钟,输出一个字节数据。比如我们采用 VGA 时序,RGB565 格式输出,每 2 个字节组成 一个像素的颜色(高字节在前,低字节在后) ,这样每行输出总共有 640*2 个 PCLK 周期, 输出 640*2 个字节。 再来看看帧时序(VGA 模式) ,如图 38.1.3 所示:
本实验用到的硬件资源有: 1) 指示灯 DS0 2) KEY0/KEY1/KEY_UP 和 TPAD 按键 3) 串口 4) TFTLCD 模块 5) 摄像头模块 ALIENTEK OV7670 摄像头模块在 38.1 节已经有详细介绍过,这里我们主要介绍该模 块与 ALIETEK 精英 STM32 开发板的连接。 在开发板的左下角的 2*9 的 P6 排座, 是摄像头模块/OLED 模块共用接口, 在第十七章, 我们曾简单介绍过这个接口。本章,我们只需要将 ALIENTEK OV7670 摄像头模块插入这 个接口(P4)即可,该接口与 STM32 的连接关系如图 38.2.1 所示:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
38.1 OV7670 简介
OV7670 是 OV(OmniVision)公司生产的一颗 1/6 寸的 CMOS VGA 图像传感器。该传 感器体积小、工作电压低,提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总 线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影像数据。该产品 VGA 图像最高达到 30 帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理 功能过程包括伽玛曲线、白平衡、度、色度等都可以通过 SCCB 接口编程。OmmiVision 图 像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、 浮散等,提高图像质量,得到清晰的稳定的彩色图像。
第三十八章 摄像头实验
ALIENTEK 精英 STM32 开发板板载了一个摄像头接口(P6),该接口可以用来连接 ALIENTEK OV7670 摄像头模块。本章,我们将使用 STM32 驱动 ALIENTEK OV7670 摄像头 模块,实现摄像头功能。本章分为如下几个部分:
38.1 OV7670 简介 38.2 硬件设计 38.3 软件设计 38.4 下载验证
图 38.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 摄像头模
模拟信号处理所有模拟功能,并包括:自动增益(AGC)和自动白平衡(AWB)。 4.A/D 转换(A/D) 原始的信号经过模拟处理器模块之后 ,分 G 和 BR 两路进入一个 10 位的 A/D 转换器, A/D 转换器工作在 12M 频率,与像素频率完全同步(转换的频率和帧率有关)。 除 A/D 转换器外,该模块还有以下三个功能: 黑电平校正(BLC) U/V 通道延迟 A/D 范围控制 A/D 范围乘积和 A/D 的范围控制共同设置 A/D 的范围和最大值,允许用户根据应用调 整图片的亮度。 5.测试图案发生器(Test Pattern Generator) 测试图案发生器功能包括:八色彩色条图案、渐变至黑白彩色条图案和输出脚移位“1”。 6.数字处理器(DSP) 这个部分控制由原始信号插值到 RGB 信号的过程,并控制一些图像质量: 边缘锐化(二维高通滤波器) 颜色空间转换( 原始信号到 RGB 或者 YUV/YCbYCr) RGB 色彩矩阵以消除串扰 色相和饱和度的控制 黑/白点补偿 降噪 镜头补偿 可编程的伽玛 十位到八位数据转换 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 的控 制下进行的。首先看看行输出时序,如图 38.1.2 所示:
校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。 支持闪光灯 支持图像缩放 OV7670 的功能框图图如图 38.1.1 所示:
图 38.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)
OV7670 的特点有: 高灵敏度、低电压适合嵌入式应用 标准的 SCCB 接口,兼容 IIC 接口 支持 RawRGB、RGB(GBR4:2:2,RGB565/RGB555/RGB444),YUV(4:2:2)和 YCbCr
(4:2:2)输出格式 支持 VGA、CIF,和从 CIF 到 40*30 的各种尺寸输出 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平
图 38.1.2 OV7670 行输出时序 从上图可以看出,图像数据在 HREF 为高的时候输出,当 HREF 变高后,每一个 PCLK 时钟,输出一个字节数据。比如我们采用 VGA 时序,RGB565 格式输出,每 2 个字节组成 一个像素的颜色(高字节在前,低字节在后),这样每行输出总共有 640*2 个 PCLK 周期, 输出 640*2 个字节。 再来看看帧时序(VGA 模式),如图 38.1.3 所示: