3、图像传感器接口协议(一):OV5640/MT9V034等常见CMOS传感器介绍、SCCB/I2C配置总线详解、寄存器配置实战
3.1 为什么先聊传感器?
做图像采集,传感器就是眼睛。眼睛不好使,后面算法再牛也白搭。
我刚开始做FPGA图像项目时,踩过一个坑:选了个不熟悉的传感器,结果花了三周才把图像调出来。后来我学乖了,先花两天把传感器手册吃透,反而更快。
所以这一章,咱们把常见的CMOS传感器聊透。重点讲OV5640和MT9V034,顺便说说SCCB/I2C总线怎么玩。
3.2 常见CMOS传感器对比
先看一张表,心里有个底。
| 型号 | 分辨率 | 像素尺寸 | 帧率 | 接口 | 典型应用 |
|---|---|---|---|---|---|
| OV5640 | 500万 (2592x1944) | 1.4μm | 15fps@全分辨率 | DVP/MIPI | 手机、监控 |
| MT9V034 | 30万 (752x480) | 6μm | 60fps@全分辨率 | DVP | 工业、机器视觉 |
| OV7670 | 30万 (640x480) | 3.6μm | 30fps | DVP | 入门学习 |
| IMX219 | 800万 (3280x2464) | 1.12μm | 30fps@1080p | MIPI | 树莓派摄像头 |
我个人习惯:做工业项目首选MT9V034。为什么?像素大,感光好,抗噪能力强。你想想看,工厂环境光线复杂,小像素传感器很容易出噪点。
核心观点:选传感器不是越贵越好,也不是像素越高越好。要看你的应用场景。
- 做监控:选OV5640,分辨率高,细节丰富
- 做工业检测:选MT9V034,全局快门,无拖影
- 做入门学习:选OV7670,便宜,资料多
3.3 OV5640 深度解析
OV5640是OmniVision的明星产品。500万像素,支持DVP和MIPI两种接口。我在项目中用过它做车牌识别,效果不错。
关键特性:
- 支持自动曝光、自动白平衡
- 内置ISP,可以输出RGB565、YUV422等格式
- 最大帧率:15fps@2592x1944,90fps@VGA
- 工作电压:核心1.5V,IO 1.8V/2.8V
注意:OV5640的MIPI接口是4-lane的,FPGA选型时要注意。低端FPGA可能没有MIPI硬核,只能用DVP接口。
3.4 MT9V034 深度解析
MT9V034是Aptina(现属安森美)的工业级传感器。30万像素,但每个像素有6μm大。说白了,就是每个像素点能收集更多光。
为什么工业项目爱用它?
- 全局快门:拍运动物体不会变形
- 高动态范围:能同时看清亮区和暗区
- 帧率灵活:可以跑到120fps@VGA
我记得有一次做流水线检测,产品跑得很快。用OV5640拍出来全是拖影,换成MT9V034就清晰了。这就是全局快门的优势。
3.5 SCCB/I2C 配置总线详解
传感器需要配置才能工作。比如设置分辨率、帧率、曝光时间等。这些配置通过SCCB或I2C总线完成。
SCCB vs I2C:
| 特性 | SCCB | I2C |
|---|---|---|
| 协议 | OmniVision私有 | 标准协议 |
| 数据线 | SIOC + SIOD | SCL + SDA |
| 从机地址 | 7位 | 7位或10位 |
| 写操作 | ID地址 + 寄存器地址 + 数据 | ID地址 + 寄存器地址 + 数据 |
| 读操作 | 需要两次传输 | 需要两次传输 |
其实SCCB和I2C非常像。OV5640用的是SCCB,但FPGA可以直接用I2C控制器驱动它。我试过,完全兼容。
3.6 寄存器配置实战
光说不练假把式。咱们直接上手配置OV5640。
配置流程:
- 上电复位,等待至少20ms
- 初始化I2C控制器
- 写入传感器ID寄存器,验证通信
- 写入配置序列
- 等待传感器稳定输出
下面是一段典型的配置代码(Verilog风格):
// OV5640 初始化配置序列(部分)
// 格式:{寄存器地址, 数据}
reg [15:0] ov5640_init_seq[] = {
16'h3103, 16'h11, // 软复位
16'h3008, 16'h82, // 进入待机模式
16'h3035, 16'h21, // PLL配置
16'h3036, 16'h46, // PLL倍频
16'h371C, 16'h03, // 模拟电路配置
16'h3630, 16'h36, // 传感器配置
16'h3808, 16'h05, // 输出宽度高字节
16'h3809, 16'h10, // 输出宽度低字节 (1296)
16'h380A, 16'h03, // 输出高度高字节
16'h380B, 16'hC0, // 输出高度低字节 (960)
16'h3008, 16'h02 // 退出待机模式
};
避坑指南:我曾经在配置OV5640时,忘了等软复位完成就写寄存器,结果传感器一直没反应。后来加了20ms延时,问题解决。记住:传感器需要时间稳定。
3.7 知识体系结构图
下面这张图,帮你理清本章的知识脉络。
3.8 避坑总结
最后,分享几个我踩过的坑:
- 上电时序:传感器需要稳定的电源和时钟。我曾经用开发板的3.3V直接供电,结果纹波太大,图像全是条纹。后来加了LDO稳压,问题解决。
- I2C速率:OV5640的SCCB最高支持400kHz。我一开始用1MHz去配,结果通信不稳定。降速到200kHz后,稳如老狗。
- 寄存器手册:一定要看最新版的手册。我遇到过手册版本不对,寄存器地址都变了,折腾了两天。
嗯,这一章就到这里。传感器是图像采集的第一步,走稳了,后面就顺了。
一句话总结:选传感器看场景,配总线看时序,写寄存器看手册。三者缺一不可。