图像传感器基础:CMOS传感器工作原理、Bayer Pattern详解、Sensor驱动与初始化流程
各位同学,咱们今天聊聊图像传感器。说白了,它就是相机的“视网膜”。没有它,ISP 再牛也白搭。
我入行那会儿,用的还是 CCD 传感器。后来 CMOS 一出来,功耗低、集成度高,很快就成了主流。现在市面上 99% 的嵌入式摄像头,都是 CMOS 的。所以咱们重点讲它。
CMOS 传感器工作原理
CMOS 传感器怎么把光变成电信号的?我习惯把它拆成三步:
- 光电转换:每个像素点里有个光电二极管。光子打上去,产生电子。光越强,电子越多。
- 电荷转电压:电子积累到一定程度,通过一个晶体管转换成电压信号。
- 读出与放大:行选通、列选通,把每个像素的电压读出来,再经过放大器送出去。
你想想看,这个过程其实很快。一秒钟几千万次。但有个问题——每个像素的响应曲线不是完全线性的。我在项目中遇到过,暗光下噪点特别多,就是因为信号太弱,放大器把噪声也一起放大了。
核心指标:量子效率(QE)、满阱容量(FWC)、读出噪声。这三个参数直接决定了传感器的动态范围和低光性能。
Bayer Pattern 详解
CMOS 传感器本身是“色盲”的。它只能感知光的强度,分不清颜色。那彩色照片怎么来的?
答案就是 Bayer Pattern。在传感器表面覆盖一层滤光片阵列。每个像素只允许一种颜色的光通过。
最常见的格式是 RGGB。为什么绿色有两个?因为人眼对绿色最敏感。多一个绿色像素,能提升视觉分辨率。
| 像素位置 | 滤光片颜色 | 作用 |
|---|---|---|
| (0,0) | R(红) | 采集红色分量 |
| (0,1) | G(绿) | 采集绿色分量 |
| (1,0) | G(绿) | 采集绿色分量 |
| (1,1) | B(蓝) | 采集蓝色分量 |
每个像素只记录一种颜色。那其他颜色怎么办?靠插值。这就是 ISP 里 Demosaic 模块干的事。嗯,这里要注意:插值算法好坏,直接影响画面边缘的锯齿和伪色。
我曾经调过一款 sensor,Bayer 排列是 RCCB——两个透明像素。这种设计进光量大,但颜色还原特别难搞。后来花了整整两周才把白平衡调稳。
小技巧:拿到一款新 sensor,第一件事就是确认它的 Bayer 排列顺序。搞错了,整个图像颜色都是乱的。
Sensor 驱动与初始化流程
驱动 sensor,其实就是通过 I2C 或 SPI 总线,往它的寄存器里写值。每个 sensor 都有自己的寄存器表,几百个甚至上千个。
初始化流程,我一般按这个顺序来:
- 硬件复位:拉低复位引脚,保持至少 1ms,再拉高。
- 时钟配置:设置主时钟频率,确认 PLL 锁定。
- I2C 通信验证:读取 sensor ID 寄存器,确认通信正常。
- 初始化寄存器序列:写入厂商提供的初始化数组。
- 输出格式设置:分辨率、帧率、数据格式(RAW8/RAW10/RAW12)。
- 启动视频流:设置寄存器 0x0100 为 0x01,开始输出数据。
下面是一个简化的初始化代码示例:
// 伪代码:CMOS Sensor 初始化
int sensor_init(void) {
// 1. 硬件复位
gpio_set_level(SENSOR_RESET_PIN, 0);
delay_ms(2);
gpio_set_level(SENSOR_RESET_PIN, 1);
delay_ms(10);
// 2. 验证通信
uint16_t id = i2c_read_reg(SENSOR_ADDR, 0x0000);
if (id != EXPECTED_ID) {
printf("Error: Sensor ID mismatch\n");
return -1;
}
// 3. 写入初始化序列
for (int i = 0; i < init_table_size; i++) {
i2c_write_reg(SENSOR_ADDR,
init_table[i].reg,
init_table[i].val);
}
// 4. 启动流
i2c_write_reg(SENSOR_ADDR, 0x0100, 0x01);
return 0;
}
避坑指南:我曾经遇到过 sensor 初始化后不出图。查了两天,发现是复位时序不对。有些 sensor 要求复位后必须等待 PLL 锁定,否则寄存器写不进去。一定要看 datasheet 里的 timing diagram。
知识结构图:CMOS Sensor 工作流程
下面这张图,把 sensor 从光信号到数字输出的完整链路画出来了。你对照着看,思路会更清晰。
常见 Sensor 接口对比
实际项目中,sensor 和 ISP 之间怎么传数据?我列个表,你一看就明白。
| 接口类型 | 最大带宽 | 传输距离 | 典型应用 |
|---|---|---|---|
| DVP(并行) | ~100 Mbps | 短(<10cm) | 低分辨率、老平台 |
| MIPI CSI-2(串行) | ~4 Gbps(4 Lane) | 中(<30cm) | 主流手机、嵌入式 |
| LVDS | ~1 Gbps | 长(<10m) | 工业相机、车载 |
我个人习惯,新项目一律用 MIPI。DVP 信号线太多,容易受干扰。LVDS 虽然抗干扰强,但成本高。