第二讲:摄像头传感器基础
各位同学,今天我们来聊聊摄像头传感器的那些事儿。做多摄像头同步,不懂传感器基础,后面会踩很多坑。我自己在项目里就吃过不少亏,今天把这些经验分享给你们。
一、CMOS与CCD传感器:到底选哪个?
先说结论:现在市面上99%的嵌入式摄像头方案,用的都是CMOS。CCD基本退出了消费级市场。为什么?我给你们分析分析。
1. CCD传感器
CCD的全称是电荷耦合器件。它的工作原理,说白了就是把光信号转成电荷,然后整块芯片上的电荷像传送带一样,一个像素一个像素地往外搬。
- 优点:图像质量好,噪声低,动态范围大
- 缺点:功耗高、速度慢、成本高、不能做片上处理
我记得十年前做工业相机时,还用过CCD方案。那时候为了低噪声,不得不忍受它那蜗牛般的帧率。现在想想,真是折磨。
2. CMOS传感器
CMOS就灵活多了。每个像素旁边都带着自己的放大器,甚至还有模数转换器。每个像素独立工作,想读哪个就读哪个。
- 优点:功耗低、速度快、集成度高、成本低
- 缺点:噪声相对大一些(但这些年进步很大)
做多摄像头同步,我强烈建议用CMOS。为什么?因为CMOS支持灵活的读出控制,你可以精确控制每一帧的曝光和读出时刻。CCD那种全局传输的方式,做同步太痛苦了。
关键区别:CMOS是每个像素独立读出,CCD是整行整列传输。这个差异直接决定了同步方案的复杂度。
二、MIPI CSI-2接口协议
MIPI CSI-2,这是摄像头和处理器之间的通信协议。说白了,就是摄像头怎么把图像数据传给主控芯片。
我刚开始接触MIPI时,被那些D-PHY、C-PHY、Lane、Data Type搞得一头雾水。后来做多了才发现,其实核心就几个概念。
1. 物理层:D-PHY
目前最常用的是D-PHY。它用差分信号传输,一对线叫一个Lane。一个摄像头通常用1到4个Lane。
| Lane数量 | 最大带宽(每Lane) | 典型分辨率 |
|---|---|---|
| 1 Lane | 1 Gbps | VGA ~ 720p |
| 2 Lane | 2 Gbps | 1080p @ 30fps |
| 4 Lane | 4 Gbps | 4K @ 30fps |
嗯,这里要注意:带宽不是简单的加法。实际有效带宽还要考虑协议开销,大概打个八折。
2. 协议层:CSI-2
CSI-2定义了数据怎么打包。它把图像数据分成一个个包,每个包有包头、数据、包尾。
// CSI-2 数据包结构示例
// 短包(控制信息)
0x00 0x01 0x02 0x03 // 帧开始
0x00 0x01 0x02 0x03 // 行开始
// 长包(图像数据)
0x2B 0x00 0x00 0x00 // 数据标识符
0x00 0x10 0x00 0x00 // 数据长度(4096字节)
[图像数据...] // 实际像素数据
0x00 0x00 0x00 0x00 // 校验和
我个人习惯把CSI-2协议分成三层理解:
- 应用层:图像格式、像素排列
- 协议层:包结构、数据类型
- 物理层:电气特性、时钟同步
实战技巧:调试MIPI时,先用示波器看时钟和数据线的眼图。眼图清晰了,协议层的问题就好排查。我曾经花了两天查一个图像花屏的问题,最后发现是PCB走线阻抗不匹配。
三、帧同步信号:VSYNC和HSYNC
做多摄像头同步,这两个信号是命根子。VSYNC是帧同步,HSYNC是行同步。它们告诉处理器:一帧开始了、一行结束了。
1. VSYNC(垂直同步)
VSYNC信号每帧触发一次。高电平表示一帧有效数据开始传输。
// VSYNC时序示例
// 假设帧率为30fps,每帧33.3ms
// 有效数据时间:30ms
// 消隐时间:3.3ms
VSYNC: __|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|__________
|<-- 有效数据 -->|<-- 消隐 -->|
|<------ 33.3ms ------>|
做多摄像头同步时,我一般把主摄像头的VSYNC作为基准,其他摄像头都跟着它走。说白了,就是让所有摄像头在同一时刻开始曝光。
2. HSYNC(水平同步)
HSYNC每行触发一次。高电平表示一行有效数据开始传输。
// HSYNC时序示例
// 假设分辨率为1920x1080
// 每行有效像素:1920
// 每行总像素:2200(含消隐)
HSYNC: _|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|_____________
|<-- 有效像素 -->|<-- 消隐 -->|
|<--- 2200像素 --->|
你想想看,如果两个摄像头的HSYNC相位差了一点点,那图像数据就会错位。做双目视觉时,这种错位会导致深度计算完全错误。
避坑指南:我曾经遇到过一个坑——两个摄像头虽然VSYNC对齐了,但HSYNC差了半个像素周期。结果图像看起来没问题,但做立体匹配时怎么都对不上。后来用示波器一量,才发现是PCB走线长度不一致导致的延迟。
3. 同步方案实战
做多摄像头同步,我推荐两种方案:
- 硬件同步:用FPGA或CPLD产生统一的VSYNC和HSYNC信号,分发给所有摄像头。精度最高,延迟最小。
- 软件同步:通过I2C配置摄像头寄存器,让它们工作在同一个帧率。精度稍差,但实现简单。
我个人偏好硬件同步。虽然成本高一点,但省心。软件同步总会有漂移,时间长了帧就错开了。
核心要点:多摄像头同步的本质,就是让所有摄像头的VSYNC上升沿对齐。对齐了,后面的数据处理才有意义。
四、总结
这一讲我们聊了三个核心知识点:
- CMOS vs CCD:选CMOS,没毛病
- MIPI CSI-2:理解D-PHY和包结构
- VSYNC/HSYNC:同步的命根子
下一讲,我们会深入摄像头模组的硬件设计,包括电源、时钟、复位这些细节。到时候我会分享一个我踩过的坑——电源纹波导致图像闪烁的问题。嗯,那故事挺有意思的。
今天就到这里。有问题随时问我。