003、CMOS 图像传感器工作原理

发布时间:2026/10/25 7:47:26
003、CMOS 图像传感器工作原理

从一根“鬼影”亮带说起

那年调一块手机主摄,模组厂送样后顺手拍了一张灯箱,画面中央偏下有一道若隐若现的横向亮带。换了好几版驱动,甚至怀疑是镜头脏污,最后在RAW图上看才发现——那条亮带对应的正好是sensor行读出的某个时间段,噪声地板高了几个DN。这事儿让我意识到,不懂CMOS像素内部怎么干活,光靠调ISP参数就是隔靴搔痒。

今天这篇笔记,咱们把CMOS图像传感器从一颗像素到一帧画面的路子捋一遍。不按教科书目录讲,就按我调试时脑子里过的那些事来写。

一颗像素的“家底”

每个像素不是简单的光电二极管,它是一个微型模拟电路。常见结构是4T(四晶体管)像素:光电二极管(PD)、传输管(TX)、复位管(RST)、源跟随器(SF)、行选管(RS)。名字听着多,实际干活就两步骤:攒电荷、送电荷。

  • PD把光变成电子,存在自己的结电容里。光越强,电子越多,这就是“积光”。
  • TX打开,把PD里的电子倒到浮动扩散节点(FD)。FD上电压会随电子数量变化,这就成了可测量的信号。
  • SF是个缓冲级,不参与电荷存储,只负责把FD的高阻抗电压转成低阻抗输出,方便后面电路读取。
  • RST用来把FD复位到已知电平,每次读之前先清一次场子。
  • RS是开关,这一行轮到它就开始往列总线送电压。

调试时最容易忽略的是PD到FD的电荷转移效率。如果TX脉宽太短,或者时钟交叉没配好,电荷没倒干净,就会出现残像——上一帧的影子叠在当前帧上。别迷信寄存器手册里的典型值,不同电压、不同温度下最优值会漂。

我贴一段曾经用过的配置代码(伪代码),注释里全是泪:

// 设置TX高电平时间,单位是sensor主时钟周期 tx_width = 12; // 这里踩过坑,原来用8,残像重得吓人 // RST脉冲,得在TX关断之后再拉高,防止注入噪声 rst_offset = 30; // 调整一下列放大器偏置,改善暗部噪声 col_amp_bias = 0x2F; // 别照搬默认值,不同批次差异很大

曝光到底在干什么

曝光也叫积分。卷帘快门(rolling shutter)下,每一行像素的积分起点和终点是错开的。比如第一行先复位,等待曝光时间后读出,然后下一行才开始复位——这样逐行进行,组成一帧。好处是工艺简单成本低,坏处是拍快速运动的物体,画面会倾斜或者“果冻”。

全局快门(global shutter)让所有行同时复位、同时停光,这需要每个像素额外一块存储区(通常是个电容或者另一个浮栅),把电荷先存在sensor内部,再逐行读出。咱们手机、平板里的CMOS基本都是卷帘快门(部分高端相机用堆叠式全局快门,那是另一套打法)。

卷帘快门调试时最恶心的就是人工光源下的条纹。LED灯虽然肉眼看着亮,实际是几百赫兹的波动。sensor行曝光起始点不同,每行感受到的光强度就有差异,画面上出现一条条亮暗带,俗称“水波纹”。解决办法是调整曝光时间,让它等于光源周期的整数倍,或者打开sensor的闪烁检测(anti-banding)功能,自动把曝光时间约束到50Hz或60Hz的倍数附近。

读出链路:从像素到数字

像素按行扫描,一行一行地选通RS。每列底下有一个采样保持电路,趁RS打开期间,先后采两个点:

  1. FD被复位后的电压(复位信号,简写R)
  2. TX打开、电荷转移完后的电压(信号,简写S)

这两个值做差,就是光产生的净信号。这个操作叫相关双采样(CDS),能干掉复位噪声和一部分固定模式噪声(FPN)。你要是嫌画质差,先看看CDS有没有真正开着。某些sensor为了省功耗,默认CDS不使能,输出的图暗部全是横纹。

接下来列信号经过可编程增益放大器(PGA),再送到ADC量化。ADC位数决定灰阶,10bit还是12bit,对应动态范围直接差两档。这里有个容易犯的错:增益调太高,暗部噪声跟着放大,亮部早就溢出。调试时要监控噪声随增益的变化趋势,别只看亮度够不够。

读出时序用一行一行来理解最直观:

// 假设每帧总行数 VTS,每行总像素时钟数 HTS // 这行代码是设置消隐时间,留太长会降低帧率,留太短ADC来不及转换 hts = 2860; // 之前设过2400,结果行尾出现竖条纹,教训 vts = 2200; // 曝光时间由寄存器 EXP 控制,单位是行周期 exp = 1200; // 注意:exp = 0 或很大时,sensor行为诡异,要加保护逻辑

噪声:每个DN都得记账

CMOS图像传感器的噪声主要分两拨:

  • 时序上相关的,比如复位噪声、闪烁噪声(1/f噪声)。CDS能消掉一部分,但不能全消。尤其低频部分,CDS窗口太长时会漏进来。
  • 空间上固定的,比如像素间的灵敏度差异、暗电流差异。这部分叫固定模式噪声(FPN),看起来像网格状。好的sensor内部有校正逻辑,但拿到裸片时你还是得自己做黑电平校准和坏点校正。

暗电流是个烦人货。温度每升高7°C,暗电流大概翻一倍。暗电流越强,画面暗角越容易发紫发绿,尤其长曝光或者手机发热时。调sensor时,如果发现暗部颜色偏了,先测一组不同曝光时间下的全黑图,看黑电平随时间的漂移量。

还有光子散粒噪声,这是量子性质,没法消掉。只能通过提高满阱容量来降低相对噪声。满阱容量(FWC)就是PD能存的最多电子数。电子数越多,信号越平滑。这正是大像素的优势所在。

关键参数,调试时可别只盯着分辨率

  • 量子效率(QE):光电转换的能力。QE越高,同样光强下信号越大,但太高也容易过曝。
  • 满阱容量(FWC):决定单像素最大信号量。FWC和读出噪声的比值,就是动态范围。一般用dB表示,手机sensor在60~70dB之间。
  • 灵敏度:单位光强产生的电压(或DN)。灵敏度高了暗处好,但亮处容易饱和。
  • 暗电流非均匀性(DCNU):暗电流在不同像素间的差异,成像就是固定雪花点。这个数值在长曝光调试中是第一杀手。

我调试时会先抓一张全黑长曝光的RAW,直接看暗电流分布。如果噪点分布均匀,那sensor基础素质没问题;如果一片区域偏亮,可能受到电源干扰或温度不均,别急着怪sensor。

时序控制里的坑

sensor的外同步寄存器组总是让人眼花缭乱。帧同步(VSYNC)和行同步(HSYNC)的极性反了,图像会上下颠倒或者中间位移。我记得有一回把MASTER_CLK配成了模拟电源域,结果图像有条纹像磁带一样。后来老老实实按硬件配置表检查时钟域。

曝光时间寄存器别看是线性写值,很多sensor内部会做映射,甚至要写到两个拆分字段里。写不对,曝光就会跳变。驱动里如果直接用公式换算,要考虑消隐时间的影响。公式大概是:

曝光行数 = (曝光时间 × 主时钟频率) / (HTS × VTS)

但HTS/VTS改了,曝光行数也得跟着变。有些工程师为了省事直接设固定曝光行数,结果调帧率时画面亮度跟着变,那就是消隐时间也变了。

写在最后的话

如果你刚接触CMOS sensor,建议先别碰ISP三A算法,先学会读RAW图。买一张信誉良好的sensor扩展板,配上开源驱动,自己抓raw出来分析。动手之前先搞懂寄存器手册里的那一页“时序图”,哪怕只是理解HS/VS是干嘛的,后面能少走很多弯路。

真到了现场调试,手边备个示波器,量一下MCLK和PCLK是否干净,看I2C波形有没有毛刺,很多诡异问题不是sensor坏,是板上信号烂。

其实CMOS传感器原理吃透了,再去看ISP、去调试3A,你会知道哪些该在sensor端解决,哪些该丢给ISP。那种“sensor什么都行”的期望要不得,它也是一颗模拟芯片,有脾气,得顺着它。