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打开期间先后采两个点FD被复位后的电压复位信号简写RTX打开、电荷转移完后的电压信号简写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什么都行”的期望要不得它也是一颗模拟芯片有脾气得顺着它。