大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
前言:
摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D[1] (模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再传输给其他显示硬件就可以显示看到图像了
我要讲解的是0V7725摄像头,带FIFO缓存,以及通过STM32F103MCU进行控制,在采用ILI9341控制器芯片的液晶屏(分辨率240*320)上显示。
我会分两大板块介绍:
第一是摄像头图像数据采集的过程
第二是图像数据在液晶屏上显示的过程
摄像头图像数据采集
以下是要讲的几个小点:
0.OV7725的摄像头结构
1.摄像头(实际上是图像传感器在采集)采集图像获得图像数据(是怎么样获得彩色信息数据的呀这个我比较关心与好奇)是怎样的一个过程。
2.摄像头(从硬件电路上讲是0V7725芯片在传输数据)将数据传输给FIFO(起数据缓冲的作用)的过程是个什么样的过程。
3.(由数字电路基础知,硬件电路上传输数据是需要时钟的)通过什么时序,该时序又是什么样的。
5.然后根据程序讲解,引脚间的连接与配置。
6.然后根据程序讲解ov7725的芯片初始化过程。
0>OV7725摄像头的结构:
晶振、板载电路、镜头、FIFO存储器(AL422B芯片)、CMOS数字图像传感器(Ov7725CMOS感光芯片)、DSP数字算法处理芯片(用于处理采集到的图像数据)
结构功能介绍:
CMOS图像传感器:首先什么是CMOS图像传感器,CMOS图像传感器通常由像敏单元阵列、行驱动器、列驱动器、时序控制逻辑、AD转换器、数据总线输出接口、控制接口等几部分组成,这几部分通常都被集成在同一块硅片上。其工作过程一般可分为复位、光电转换、积分、读出几部分。
我们采用的该Ov7725图像传感器的像素30万,分辨率:480*640支持使用 VGA 时序输出图像数据,也支持QVGA时序输出240*320(本实验为了妥协FIFO的存储量,只能存储一帧该分辨率大小的图形,而且我们的屏幕也是240*320的显示分辨率),输出图像的数据格式支持 YUV(422/420)(这个后面会介绍)、 YCbCr422(这个后面会介绍) 以及 RGB565 格式。它还可以对采集得到的图像进行补偿,支持伽玛曲线、 白平衡、饱和度、色度等基础处理(这些处理为什么明明不懂我还要说,因为程序配置时你会发现一些莫名其妙的配置,我们虽然不用,但是我们要配成不用,所以那些莫名其妙的程序就是对此的配置)
DSP数字算法处理芯片:这个部分就是OV7725芯片中的结构,单独提出来知识为了便于我们对结构的理解。
FIFO存储器:接收图像传感器传过来的图像数据。
Ov7725芯片内部结构(注:FIFO不属于OV7725内部元件)
此处本有图片(可以从我的评论中下载资源,下述提到的图片我都会打包发评论)
(1) 控制寄存器——控制接口
标号处的是 OV7725 的控制寄存器,它根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过 SCL 和 SDA 引脚写入的, SCL 与 SDA 使用的通讯协议 SCCB 跟 I2C 十分类似,在 STM32 中我们完全可以直接用 I2C 硬件外设来控制。
(2) 通信、控制信号及时钟——时序控制逻辑
标号处包含了 OV7725 的通信、控制信号及外部时钟,其中 PCLK、 HREF 及VSYNC分别是像素同步时钟、行同步信号以及帧同步信号,这与液晶屏控制中的VGA 信号是很类似的。 RSTB 引脚为低电平时,用于复位整个传感器芯片,PWDN 用于控制芯片进入低功耗模式。注意最后的一个 XCLK 引脚,它跟 PCLK是完全不同的, XCLK 是用于驱动整个传感器芯片的时钟信号,是外部输入到OV7725 的信号;而 PCLK 是 OV7725 输出数据时的同步信号,它是由 OV7725 输出的信号。 XCLK 可以外接晶振或由外部控制器提供,若要类比 XCLK 之于OV7725 就相当于 HSE 时钟输入引脚与 STM32 芯片的关系, PCLK 引脚可类比
STM32 的 I2C 外设的 SCL 引脚。
(3) 感光矩阵,应该就是传感器的像敏单元阵列(这个就见名知义了)标号处的是感光矩阵,光信号在这里转化成电信号,经过各种处理,这些信号存储成由一个个像素点表示的数字图像。
(4) 数据输出信号
标号处包含了 DSP 处理单元,它会根据控制寄存器的配置做一些基本的图像处理运算。这部分还包含了图像格式转换单元及压缩单元,转换出的数据最终通过D0-D9 引脚输出,一般来说我们使用 8 根据数据线来传输,这时仅使用 D2-D9 引脚。
图像信息的采集
外界图像透过镜头,经过一个感光矩阵(一个阵列),即传感器的像敏单元阵列,其上我的理解就是一些感光元件,每个感光元件对应于图像传感器的一个像点,这些感光单元的核心元件就是感光二极管,该二极管接受光照后能产生电流(也可能是电压,总之是模拟信号),对应的电流强度对应于相应的光的强度。注意CMOS传感器的每一个感光单元上都已经集成了信号放大器(一个感光单元产生的电流肯定是极其微弱的)和A/D转换器,所以由感光单元输出的就是直接是数字信号,然后所有的每个感光单元的数字信号整合后传给DSP芯片做一些处理(可做的处理上面已经介绍了,当然这了解仅仅只是为了科普)。
好,至此我们已经理解了摄像头是如何采集的光的强度的,所以说科技真是神奇。只有不知道,没有事物是绝对神奇的。那么有人会问了,那只是采集了光的强度信息而已啊,到底是怎么采集彩色信息的我还是不知道啊?嗯,的确,没有色彩的世界你跟我说X啊。下面我就来介绍。
cmos图像传感器通过感光元件上的彩色滤光片来区分色彩的,其实液晶显示也用到了彩色滤光片来显示色彩。理论上:我们以R\G\B三种滤光片分别覆盖三个感光元件(即像点),这样由三个像点产生一个彩色像素。这三个像点的数字信号就是一个彩色像素的数据。所以可知产生一个彩色像素数据的感光单元是由3个上述的感光元件,且每个元件上分别有R/G/B滤光片所组成的。(这个应该是可以理解了)
一个摄像头上的所有感光元件一起产生的数字信号构成一幅图像的数据,如此一幅图像采集完毕。
采集到的信息传输给FIFO芯片AL422B
即ov7725芯片将它采集到的图像数据传递给FIFO.当然了,ov7725芯片怎么知道啥时候要传输数据,FIFO又怎么知道要写入数据呢?这个时候就是时序在起作用了,本质就是一些已拟定成规的时钟。Stm32通过写入指令即配置好ov7725的寄存器,将相应的寄存器的相应的位进行置位或清除达到写入指令配置的目的。OV7725芯片的配置涉及到SCCB时序,而将数据传给FIFO涉及到FIFO的相应写入时序(到时读出数据又涉及到读时序,总之进行特定的操作前都要有特定的时钟形式,想想数电中的0和1数据是怎么传的理解下)。
从科普的角度知道是怎么传(到时候后面还要从程序及硬件的角度讲)的,然后再来讲讲数据传输格式。Stm32控制 OV7725 时采用 SCCB 协议读写其寄存器,配置它的传输时序,而它输出图像时则使用 VGA 或QVGA 时序, 其中 VGA 在输出图像分辨率为 480*640 时采用, QVGA 是 Quarter VGA, 其输出分辨率为 240*320,这些时序跟控制液晶屏输出图像数据时十分类似。OV7725传感器输出图像时,一帧帧(一帧即一幅图像,也可理解为一场,也不知准确不)地输出,在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。
同时,对FIFO的写入时序是ov7725芯片自动产生的,stm32可以通过一个与非门控制FIFO的写使能引脚。(而且产生的是QVGA的时序,这个是通过对OV7725芯片的寄存器配置实现的)
所以我们知道了,根据我们所采用的液晶屏分辨率为240*320大小的,显然我们要采用QVGA格式的。又因为一个像素的大小RGB565为16位的,而0V7725与FIFO间的数据传输线只有8根,故OV7725向FIFO发送一个像素的信息时每次只能发8位,共需发两次,当然PCLK(pixelclock)时钟也就需要两个了,需要时钟推动两次嘛,见时序参考)。
请参考以下时序图理解:当 HREF 为高电平时, 像素数据依次传输,每传输完一行数据时,行同步信号 HREF 会输出一个电平跳变信号间隔开当前行和下一行的数据;一帧的图像由 N 行数据组成, 当 VSYNC 为低电平时,各行的像素数据依次传输, 每传输完一帧图像时,VSYNC 会输出一个电平跳变信号(这句话特别注意,有大用途)
此处是像素同步时序图与QVGA帧像素同步时序图(见评论)
对于时序我的理解拿到该手册,照着它的时钟高低变化拉高或者拉低相应引脚的电平就是了。怎么拉高拉低同样又是配置寄存器,GPIOx->ODR,英文名见名知义,数据输出寄存器,OutputDataRegister,该寄存器的功能见下图
(此处本该是寄存器的图,见评论)
端口输出数据,其实也就是输出0,1嘛然后就是相应的拉高或是拉低电平,只不过在逻辑电路里,从高电平到低电平是需要一定的时间的。
所以当我们连接好引脚后,在配置或是初始化了相应的引脚后,需要什么操作时,根据它的时序对相应的引脚进行相应的拉高或是拉低。在程序上到底是怎么执行的后面我们在讲,这里权当科普。
那怎么才算传输一幅图像数据结束呢?我们要知道什么时候采集的数据传输至FIFO结束了,然后这个时候可以开始传输了呀是吧?由于使用中断的方式来检测 VSYNC 的信号,所以要把相应的引脚初始化并为它配置为EXTI 中断,由于 VSYNC 出现两次下降沿,才表示 FIFO 保存了一幅图像,所以在检测 VSYNC 下降沿的中断服务函数中,使用一个变Ov7725_vsync作为标志。 Ov7725_vsync标志的初始值为 0,当检测到第一次上升沿时,控制 FIFO 的相应 GPIO 引脚,允许 OV7725 向 FIFO 写入图像数据,并把标志值设置为 1;检测到第二次上升沿时,禁止 OV7725 写 FIFO,把标志设置为 2,而我们将会在 main函数的循环中对该标志进行判断,当 Ov7725_vsync=2时,STM32 开始从 FIFO 读取数据并显示,读取完毕后把 Ov7725_vsync 标置复位为 0,重新开始下一幅图像的采集
SCCB时序、像素传输时序、QVGA帧同步时序、FIFO读、写时序
SCCB时序已经提到过了,是stm32与ov7725通讯的时序,配置它的工作模式。外部控制器对 OV7725 寄存器的配置参数是通过 SCCB 总线传输过去的,而 SCCB 总线跟 I2C十分类似,所以在 STM32驱动中可以直接使用片上 I2C外设与它通讯。
想具体了解,请看我上传的的pdf文档。
这里还需要说一点就是,
这里我就结合我的理解简单介绍一下。(其实是野火哥的用户手册啦)
起始信号与停止信号的时钟
起始信号: 在 SCL(图中为 SIO_C) 为高电平时, SDA(图中为 SIO_D)出现一个下降沿,则 SCCB 开始传输。
停止信号:在 SCL 为高电平时, SDA 出现一个上升沿,则 SCCB 停止传输。
数据有效性:除了开始和停止状态, 在数据传输过程中,当 SCL 为高电平时,必须保证 SDA 上的数据稳定,也就是说, SDA 上的电平变换只能发生在 SCL 为低电平的时候, SDA 的信号在 SCL 为高电平时被采集。
那么我的理解就是,起始就是传输数据开始了,停止就是传输数据停止了。看图然后拉高或是拉低相应的引脚电平就行了,怎么拉,配置GPIOx_ODR,已经讲过了的哟。数据有效性能看懂了吧。
像素传输时序:
(此处是像素同步(传输)时序图,见评论)
(然后这里说下我的理解就是像素同步时序应该是与FIFO写时序相同,然后这个时序是由ov7725芯片实现的)
(此处是QVGA帧像素同步时序图,见评论)
(就是OV7725传输给FIFO的一帧图像数据时所用到的时序,会产生行同步信号与场信号)
(此处是FIFO写时序图,见评论)
下图是我根据原理图画的草图:表示出了OV7725将数据传输给FIFO的硬件电路内部连接,所以从图中可以看出FIFO的写时序(QVGA)是通过OV7725自动产生的,跟我们对OV7725芯片的配置有关,由此可以想到,改变配置就会改变OV7725与FIFO间的像素传输时序,由此改变传输的像素数据。后面结合程序配置讲解时会在提到。
其实弄懂了原理,基本上就是根据手册翻译成程序语言就行了,所以说自己完成一个设备的驱动程序的编写完全是没有问题的。
(OV7725与FIFO的连接图草图)
产生FIFO的读时序的时钟就是由stm32来完成的了,通过拉高或者拉低相应引脚的电平来实现。怎么拉的我前面说过了。
(此处是FIFO的读时序图,见评论)
重申一遍就是,时序就是几个特定形式的时钟,在电平跳变处(可能是上升沿也可能是下降沿),具有相应的功效,能进行相应的数据操作,这个数据可以是指令数据也可以是用户需要的数据。
在提示一遍,我所讲解的硬件结构是,OV7725芯片的摄像头,有FIFO存储器芯片AL422B.## OV7725摄像头的彩色图像采集原理与液晶显示《一》 ##
后续的程序配置相继贴出。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193634.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...