大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
近日入手了一块正点原子家的OV7725摄像头模块,秉着小白尽可能学得透彻些的想法,选择了野火家的相同摄像头教学视频。链接如下:【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili
现对PPT和火哥所授内容进行整理:
在各类传感器获取信息中,图像包含有最丰富的信息。但是摄像头模块仅用于获取输出图像,像利用摄像头进行人脸识别,图像识别之类功能,主要是依赖于识别算法,这是另外的技术。
分类:
摄像头按输出信号分类可分为模拟摄像头和数字摄像头,而数字摄像头又可以根据图像传感器材料分为CCD和CMOS两类。
接口类型:
数字摄像头有USB接口、IEE1394火线接口、千兆网接口。输出数字信号。
模拟摄像头多采用AV视频端子或S-VIDEO。输出标准的模拟信号。
分辨率:
现在的数字摄像头分辨率一般从数十万到上千万;模拟摄像头的分辨率维持在41万左右,但由于输出的是模拟量,可以直接输入至电视或监视器,所以依据实际情况可以但没必要做那么高。
成像材料:
CCD是“电荷耦合器件”(Charge Coupled Device)的简称;
CMOS是“互补金属氧化物半导体”(Complementary Metal Oxide Semiconductor)的简称。
功耗:
CCD取像系统除了要多个电源外,其外设电路也会消耗相当大的功率。有的需要2~5W的功率;
CMOS光电传感器耗电量非常小,仅为CCD的1/8~1/10,有的只消耗20~50mW的功率。
现在主流的单反相机、智能手机都已普遍采用CMOS传感器。
OV7725摄像头
镜头部件包含一个镜头座和一个可旋转调节距离的凸透镜,通过旋转可以调节焦距,正常使用时,镜头座覆盖在电路板上遮光,光线只能经过镜头传输到正中央的图像传感器,它采集光线信号,采集得的数据被缓存到摄像头背面的FIFO缓存中,然后外部器件通过下方的信号引脚获取拍摄得到的图像数据。若拆开摄像头座,在摄像头的正下方可看到PCB板上的一个方形器件,它是摄像头的核心部件,型号为OV7725的CMOS类型数字图像传感器。(勿触碰到,会影响成像质量)该传感器支持输出最大为30万像素的图像(640×480分辨率),它的体积小,工作电压低,支持使用VGA时序输出图像数据,输出图像的数据格式支持YUV(422/420)、YCbCr422以及RGB565格式。它还可以对采集得的图像进行补偿,支持伽玛曲线、白平衡、饱和度、色度等基础处理。
OV7725引脚图
OV7725传感器采用BGA封装(引脚在背面),引脚的分布如下:
图中的非彩色部分是电源相关的引脚,彩色部分是主要的信号引脚;
管脚名称 | 管脚类型 | 管脚描述 |
---|---|---|
RSTB | 输入 | 系统复位管脚,低电平有效 |
PWDN | 输入 | 掉电/省电模式(高电平有效) |
HREF | 输出 | 行同步信号 |
VSYNC | 输出 | 场同步信号 |
PCLK | 输出 | 像素时钟 |
XCLK | 输入 | 系统时钟输入端口 |
SCL | 输入 | SCCB总线的时钟线 |
SDA | I/O | SCCB总线的数据线 |
D0…D9 | 输出 | 像素数据端口 |
所谓的SCCB总线,跟IIC基本一致(实际上SCCB总线也支持突发读写,所以可以说完全一致);
D0~D9,一般只取8根用来在VGA时序下每个时钟输出一个字节;
VGA时序输出:由HREF、VSYNC、PCLK和D0~D9数据线共同组成;
XCLK:系统时钟输入接口,摄像头内部自带有一个晶振。
OV7725功能框图
控制寄存器——标号①处的是OV7725的控制寄存器,它根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过SCL和SDA引脚写入的,SCL与SDA使用的通讯协议SCCB跟I2C十分类似,在STM32中我们完全可以直接用I2C硬件外设来控制。
关于寄存器配置——于OV7725_datasheet文档中的Register Set(寄存器组)部分。最重要的是COM7寄存器,可负责配置输出分辨率等。
野火家将配置分辨率过程封装成了一个函数,可通过修改函数配置方便地修改分辨率。而且,生产OV7725的公司对寄存器组的文档描述并不完善,野火对寄存器的配置也都是部分来自网上流传、部分来自厂家。如果自己修改了某个寄存器的配置,可能会影响很大,但是并未在文档中记录。
所以建议如果不是特别感兴趣,没有必要去看寄存器组部分文档。
文档 OV7725 Software Application 也提供了许多寄存器的配置。后面讲解火哥不会介绍为什么往某个寄存器写入某个值,想探究的话自己找对应寄存器的描述(虽然可能找不到)自行理解。
通信、控制信号及时钟——标号②处包含了OV7725的通信、控制信号及外部时钟,其中PCLK、HREF及VSYNC分别是像素同步时钟、行同步信号以及帧同步信号,这与液晶屏控制中的VGA信号是很类似的。RSTB引脚为低电平时,用于复位整个传感器芯片,PWDN用于控制芯片进入低功耗模式。注意最后的一个XCLK引脚,它跟PCLK是完全不同的,XCLK是用于驱动整个传感器芯片的时钟信号,是外部输入到OV7725的信号;而PCLK是OV7725输出数据时的同步信号,它是由OV7725输出的信号。XCLK可以外接晶振或由外部控制器提供,若要类比XCLK之于OV7725就相当于HSE时钟输入引脚与STM32芯片的关系,PCLK引脚可类比STM32的I2C外设的SCL引脚。
感光矩阵——标号③处的是感光矩阵,光信号在这里转化成电信号,经过各种处理,这些信号存储成由一个个像素点表示的数字图像。
数据输出信号——标号④处包含了DSP处理单元,它会根据控制寄存器的配置做一些基本的图像处理运算(如白平衡、色度、饱和度等等)。这部分还包含了图像格式转换单元及压缩单元,转换出的数据最终通过 DO-D9引脚输出,一般来说我们使用8根据数据线来传输,这时仅使用D2-D9引脚。④区的FIFO是芯片内部的,相当于stm32的SARM芯片,用于缓存一些东西。而整个OV7725芯片还外接了一个FIFO缓存芯片。两者不同。
SCCB时序——外部控制器对OV7725寄存器的配置参数是通过SCCB总线传输过去的,而SCCB总线跟I2C十分类似(基本一致),所以在STM32驱动中可直接使用片上I2C外设与它通讯。
SCCB的三步写操作 “发设备地址”—>“发寄存器地址”—>“发数据” 与I2C的写操作一样;
SCCB的两步写操作和两步读操作配合使用 “发设备地址”—>“发寄存器地址”—>“再次发送设备地址”—>“读数据” 与I2C的读操作一样。
像素输出时序——主控制器控制OV7725时采用SCCB协议读写其寄存器,而它输出图像时则用VGA或QVGA时序,其中VGA在输出图像分辨率为480*640时采用,QVGA是Quarter(四分之一) VGA,其输出分辨率为240*320,这些时序跟控制液晶屏输出图像数据时十分类似。且QVGA的输出分辨率刚好与4.3寸的TFTLCD屏分辨率一致,故在实验中采用QVGA时序输出像素。后面的时序讲解也为QVGA时序。
(像素输出不用SCCB是因为SCCB只有一根数据线,输出太慢。用D0~D9作为数据线会快得多)
OV7725输出图像时,一帧帧地输出,在帧内的数据一般从左往右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。
若使用D2~D9数据线,图像格式设置为RGB565,进行数据输出时,D2~D9数据线会在1个像素同步时钟PCLK的驱动下发送1字节的数据信号,所以2个PCLK时钟可发送1个RGB565格式的像素数据。像素数据依次传输,每传输完一行数据时,行同步信号HREF会输出一个电平跳变信号,每传输完一帧图像时,VSYNC会输出一个电平跳变信号。
理解时序图:
HREF为低电平的时候,传输的电平无效,只有HREF为高电平时才有效。用D2~D9传输数据,每个像素同步时钟PCLK传输一个字节数据。所以根据RGB565(5+6+5=16bit=2byte),两个PCLK时钟能够传输一个像素点。
PCLK由低变高时,D2~D9传输数据;PCLK由高变低时,D2~D9可以改变将要传输的数据。
HREF用于控制(外接)FIFO,可以用来指示哪些信息是有效的。因为PCLK是一直不停跑的,所以D2~D9数据线中的数据也一直被发出。那么外部的控制器如何判断这些电平是否有效呢?总不可以全部数据都接收吧!因为数据无效期间HREF处于低电平,这样外部控制器可以在读取数据前先判断HREF是否为高电平,不是的话就不接收数据。
每传输完一行数据时,行同步信号HREF会输出一个电平跳变信号,240*320的话,传输一帧图像数据,HREF会进行240次跳变。
每传输完一帧图像时,VSYNC会输出一个电平跳变信号。VSYNC在低电平时有效。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190246.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...