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(自动聚焦控制)等功能。

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输出图像参数设置


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 输出图像数据的行时序图。

从上图可以看出,传感器在 HREF 为高电平的时候输出图像数据,当 HREF 变高后,每一个 PCLK 时钟,输出一个 8 位或者 10 位像素数据。比如我们采用 QSXGA 时序,RGB565 格式输出,tp=2tPclk,每 2个字节组成一个像素的颜色,这样每行总共输出 25922 个 PCLK,也就是 2592*2 个字节。

由上图可知,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负责提供时钟。

2.2 工程读通道搭建

前面说到读通道主要包括了摄像头采集ov5640_dri模块、video_in模块、VDMA模块如下图所示。其中摄像头采集模块是自己编写和封装的,video_in是vivado自带的ip,配置成RGB输入即可。需要注意的是VDMA模块需要同时开启读通道和写通道,然后设置帧缓存为3。



2.3 工程写通道搭建

工程的写通道主要包含了video_out模块和rgb2dvi模块,video_out模块负责将数据从VDMA中读出并转换成数据流格式,然后送到rgb2dvi模块。这两个模块如下图所示,video_out是vivado自带的,配置成RGB格式就好,rgb2dvi网上有现成的ip,当然也可以自己封装都是可以的。

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

显示时序是由VTC模块产生的,时钟信号由锁相环产生。这两个模块分别如下图所示,这两个模块都是vivado自带的ip核,VTC模块配置成1024×768与你自己的屏幕相对应,PLL输入时钟100M,输出时钟是65M和325M。



2.5 工程block design

整个工程的block design在添加核配置了所有的模块后,完成连线即可,这边可以参照下图进行连线。

3、SDK设计和效果演示

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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)
{//配置VDMArun_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显示环境搭建相关推荐

  1. ZYNQ图像处理(1)——vdma_hdmi显示环境搭建

    1.引言 FPGA是一种现场可编程逻辑门阵列,其并行的特点让其在图像处理.数字通信等领域有广泛的应用.FPGA缺点是不擅长流程控制,对于IIC.SPI等通信方式,往往需要用到状态机.ZYNQ7000是 ...

  2. Python opencv图像处理基础总结(一) 环境搭建 基础操作

    学过的知识,会过时.会遗忘,但在努力过程中学会的处事态度和做事习惯,都会留在骨子里,变成我们的一部分. Open Source Computer Vision Library,OpenCV于 1999 ...

  3. Python3与OpenCV3.3 图像处理(一)--环境搭建与简单DEMO

    https://blog.csdn.net/qq_32811489/article/details/78636049 https://blog.csdn.net/gangzhucoll/article ...

  4. Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)

    操作系统:Ubuntu14.04.5 LTS 64bit OpenCV:OpenCV 3.1.0.opencv_contrib gcc:gcc version 4.8.4 (Ubuntu 4.8.4- ...

  5. OpenCV图像处理--Qt+OpenCV环境搭建

    LinuxQt+Opencv 环境搭建参照 LinuxQT+第三方库配置 WindowsQt+OpenCV环境搭建 一.下载opencv环境 opencv环境下载 2.Qt+OpenCV环境测试 新建 ...

  6. ZYNQ图像处理(4)——灰度图像转二值化图像

    1.二值化图像简介 前面已经完成了摄像头图像的采集和显示,以及RGB图像转灰度图.二值化图像在图像处理领域同样有广泛的应用,本节介绍如何用FPGA实现灰度转二值化图形.灰度实现二值化的原理很简单,只需 ...

  7. python环境安装opencv,Python环境搭建之OpenCV的步骤方法

    一.openCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于 ...

  8. 图像识别DM8127开发攻略——开发环境搭建

    经过两年多的爆炸性出货(针对我们这种小公司),目前稍微停顿了一下,现在难得有点时间继续写自己的博客,其实自己一直想静下心来做点东西,可惜做TI DAVINCI(ARM+DSP)这方面的人不太好招,本人 ...

  9. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...

  10. Python环境搭建之OpenCV(转载)

    转自https://www.cnblogs.com/lclblack/p/6377710.html 一.openCV介绍 Open Source Computer Vision Library.Ope ...

最新文章

  1. AI Time|企业AutoML旨在流程自动化,可解释是人机交互的必经之路
  2. http常见状态码详解
  3. 调整xfce中的鼠标大小到48以上-目前还没有完成
  4. Maven常用的构建命令
  5. APPLE STORE
  6. python中八进制_在Python中以八进制格式输入数字
  7. mysql replace 不区分大小写_mysql 不区分大小写的解决
  8. [你必须知道的异步编程]——基于任务的异步模式
  9. SpringBoot整合Shiro框架
  10. 数据结构课程设计之简单计算器的实现
  11. Opengl入门基础-基础知识
  12. ATtiny85 制作迷你小游戏机
  13. 微信oauth MySQL_微信OAuth2网页授权登陆接口PHP实例下载
  14. 为什么使用对象指针而不是使用对象本身?
  15. Vue.js下载与安装
  16. FineBI中tomcat服务器部署
  17. ssdt函数索引号_技术分享 - 32位系统上获取SSDT表地址以及从中获取指定SSDT函数的地址...
  18. Python + PIL 处理支付宝AR红包
  19. ASP.NET Core 和 EF Core系列教程——CRUD
  20. 多目标优化算法(四)NSGA3(NSGAIII)论文复现以及matlab和python的代码

热门文章

  1. Java获取字符串长度(length())
  2. IDEA 运行 Tomcat 中文乱码的各种问题
  3. 解决idea工具下tomcat中文乱码问题
  4. 最全 Yaml 语法详解
  5. linux系统双网卡不能同时启动,针对RHEL中双网卡IP不能同时被访问的解决方法
  6. LCS算法 文本对比的实现
  7. Off-line Programming 离线编程 简明教程
  8. 基于STM32的手势识别检测
  9. 等保之——等级保护2.0要求及所需设备清单
  10. 腾讯云短信申请与使用