ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建

1、ov5640摄像头介绍

1.1 ov5640简介

OV5640 是一款 1/4 英寸单芯片图像传感器,其感光阵列达到 25921944(即 500W 像素),能实现最快 15fps QSXVGA(25921944)或者 90fps VGA(640*480)分辨率的图像采集。传感器采用 OmniVision推出的OmniBSI(背面照度)技术,使传感器达到更高的性能,如高灵敏度、低串扰和低噪声。传感器内部集成了图像处理的功能,包括自动曝光控制(AEC)、自动白平衡(AWB)等。同时该传感器支持 LED补光、MIPI(移动产业处理器接口)输出接口和 DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及 AFC(自动聚焦控制)等功能。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第1张图片
SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由 OV(OmniVision 的简称)公司定义和发展的三线式串行总线,该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以及图像处理参数等。OV 公司为了减少传感器引脚的封装,现在 SCCB 总线大多采用两线式接口总线。OV5640 使用的是两线式 SCCB 接口总线,是用 16 位(两个字节)表示寄存器地址。OV5640 SCCB 的写传输协议如下图所示:
在这里插入图片描述
上图中的 ID ADDRESS 是由 7 位器件地址和 1 位读写控制位构成(0:写 1:读),OV5640 的器件地址为 7’h3c,所以在写传输协议中,ID Address(W)= 8’h78(器件地址左移 1 位,低位补 0);Sub-address(H)为高 8 位寄存器地址,Sub-address(L)为低 8 位寄存器地址,在 OV5640 众多寄存器中,有些寄存器是可改写的,有些是只读的,只有可改写的寄存器才能正确写入;Write Data 为 8 位写数据,每一个寄存器地址对应 8 位的配置数据。
在 OV5640 正常工作之前,必须先对传感器进行初始化,即通过配置寄存器使其工作在预期的工作模式,以及得到较好画质的图像。因为 SCCB 的写传输协议和 IIC 几乎相同,因此我们可以直接使用 IIC 的驱动程序来配置摄像头。当然这么多寄存器也并非都需要配置,很多寄存器可以采用默认的值。

1.2 ov5640输出图像参数设置

ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第2张图片
ISP 输入窗口设置(ISP Input Size)允许用户设置整个传感器显示区域(physical pixel size,26321951,其中 25921944 像素是有效的),开窗范围从 00~26321951 都可以任意设置。也就是上图中的 X_ADDR_ST(寄存器地址 0x3800、0x3801)、Y_ADDR_ST(寄存器地址 0x38020x3803)、X_ADDR_END(寄存器地址 0x3804、0x3805)和 Y_ADDR_END(寄存器地址 0x3806、0x3807)寄存器。该窗口设置范围中的像素数据将进入 ISP 进行图像处理。
预缩放窗口设置(pre-scaling size)允许用户在 ISP 输入窗口的基础上进行裁剪,用于设置将进行缩放的窗口大小,该设置仅在 ISP 输入窗口内进行 X/Y 方向的偏移。可以通过 X_OFFSET(寄存器地址 0x3810、0x3811)和 Y_OFFSET(寄存器地址 0x3812、0x3813)进行配置。
输出大小窗口设置(data output size)是在预缩放窗口的基础上,经过内部 DSP 进行缩放处理,并将处理后的数据输出给外部的图像窗口,图像窗口控制着最终的图像输出尺寸。可以通过 X_OUTPUT_SIZE(寄存器地0x3808、0x3809)和 Y_OUTPUT_SIZE(寄存器地址 0x380A、0x380B)进行配置。注意:当输出大小窗口与预缩放窗口比例不一致时,图像将进行缩放处理(图像变形),仅当两者比例一致时,输出比例才是 1:1(正常图像)。

1.3 ov5640输出图像像素格式

OV5640 支持多种不同的数据像素格式,包括 YUV(亮度参量和色度参量分开表示的像素格式)、RGB(其中 RGB 格式包含 RGB565、RGB555 等)以及 RAW(原始图像数据),通过寄存器地址 0x4300 配置成不同的数据像素格式。
由于数据像素格式常用 RGB565,我们这里也将 ov5640 配置为 RGB565 格式。由上表(表 22.1.1)可 知,将寄存器 0x4300 寄存器的 Bit[7:4]设置成 0x6 即可。OV5640 支持调节 RGB565 输出格式中各颜色变量的顺序,对于我们常见的应用来说,一般是使用 RGB 或 BGR 序列。本章我们将 OV5640 输出的 RGB565的颜色顺序寄存器 0x4300 的 Bit[3:0]设置成 0x1。

1.4 ov5640输出时序

QSXGA,这里指:分辨率为 25921944 的输出格式,类似的还有:QXGA(20481536)、UXGA(16001200)、SXGA(12801024)、WXGA(1440900)、WXGA(1280800)、XGA(1024768)、SVGA(800600)、VGA(640480)、QVGA(320240)和 QQVGA(160120)等。
PCLK:像素时钟,一个 PCLK 时钟输出一个像素或者半个像素(像素数据的高 8 位或者低 8 位)。
VSYNC:帧同步信号。
HREF/HSYNC:行同步信号。
D[9:0]:像素数据,在 RGB565 格式中,只有高 8 位是有效的。
tPclk:一个时钟周期 。
tp:一个像素点的周期,在 RGB565 和 YUV422 输出格式下,tp=2
tPclk;Raw 输出格式下,tp=tPclk。
下图为 OV5640 输出图像数据的行时序图。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第3张图片
从上图可以看出,传感器在 HREF 为高电平的时候输出图像数据,当 HREF 变高后,每一个 PCLK 时钟,输出一个 8 位或者 10 位像素数据。比如我们采用 QSXGA 时序,RGB565 格式输出,tp=2tPclk,每 2个字节组成一个像素的颜色,这样每行总共输出 25922 个 PCLK,也就是 2592*2 个字节。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第4张图片
由上图可知,VSYNC 的上升沿作为一帧的开始,高电平同步脉冲的时间为 5688tp,紧接着等待 48276tp时间后,HREF 开始拉高,此时输出有效据;HREF 由 2592tp 个高电平和 252tp 个低电平构成;最后一行图像数据输出完成之后等待 14544tp 时间,一帧数据传输结束。所以输出一帧图像的时间实际上是 tFrame = 5596992tp。

2、ov5640摄像头显示工程搭建

2.1 工程整体框图

这边手画了工程的框图,有点丑哈哈。主要包含了这么几个模块,ps端就配置DDR和串口,开启GP和HP接口,设置输出时钟频率100MHz;pl端首先是ov5640_dri驱动模块配置和采集ov5640的图像数据,之后将数据送入video_in模块,video_in模块将数据送入VDMA,VDMA与ps端通过HP接口将数据存入DDR中,这便是数据读通道;数据写通道VDMA把数据从DDR中读出来,通过video_out模块将数据输出到rgb2dvi中,rgb2dvi负责将数据转换成hdmi可以显示的格式。VTC是hdmi显示时序产生模块,pll负责提供时钟。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第5张图片

2.2 工程读通道搭建

前面说到读通道主要包括了摄像头采集ov5640_dri模块、video_in模块、VDMA模块如下图所示。其中摄像头采集模块是自己编写和封装的,video_in是vivado自带的ip,配置成RGB输入即可。需要注意的是VDMA模块需要同时开启读通道和写通道,然后设置帧缓存为3。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第6张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第7张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第8张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第9张图片

2.3 工程写通道搭建

工程的写通道主要包含了video_out模块和rgb2dvi模块,video_out模块负责将数据从VDMA中读出并转换成数据流格式,然后送到rgb2dvi模块。这两个模块如下图所示,video_out是vivado自带的,配置成RGB格式就好,rgb2dvi网上有现成的ip,当然也可以自己封装都是可以的。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第10张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第11张图片

2.4 显示时序控制和时钟模块

显示时序是由VTC模块产生的,时钟信号由锁相环产生。这两个模块分别如下图所示,这两个模块都是vivado自带的ip核,VTC模块配置成1024×768与你自己的屏幕相对应,PLL输入时钟100M,输出时钟是65M和325M。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第12张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第13张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第14张图片
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第15张图片

2.5 工程block design

整个工程的block design在添加核配置了所有的模块后,完成连线即可,这边可以参照下图进行连线。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第16张图片

3、SDK设计和效果演示

将整个工程综合实现后生成比特流,之后将其导出,打开vivado的sdk设计,新建工程添加下述的代码。整个代码很简单,就是将VDMA进行初始化,让他一直进行读和写就可以了。

#include 
#include 
#include 
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "vdma_api/vdma_api.h"

//宏定义
#define VDMA_ID          XPAR_AXIVDMA_0_DEVICE_ID
//frame buffer的起始地址
unsigned int const frame_buffer_addr =0x03000000;
//驱动实例
XAxiVdma     vdma;


int main(void)
{
	//配置VDMA
	run_vdma_frame_buffer(&vdma, VDMA_ID,1024,768,frame_buffer_addr,0,0,BOTH);

    return 0;
}
 

最后给出ov5640在hdmi屏幕上的显示效果图,可以看到是可以正常显示RGB图案的。到此为止,图像处理初期摄像头+hdmi的环境就配置完成了,有不懂或者遇到困难的小伙伴也可以和我交流呀!忙活了三天算是搭建完了工程,也有很多需要改进的地方:比如可以加入动态时钟来兼容不同的显示屏,我这里是直接用锁相环输出时钟了;其次还可以在ps端写摄像头的驱动程序,pl端用状态机完成也挺麻烦的hhh。
ZYNQ图像处理(2)——ov5640_hdmi显示环境搭建_第17张图片

你可能感兴趣的:(图像处理,单片机,人工智能)