第二讲:相机硬件架构深度解析

大家好,欢迎来到第二讲。

上一讲我们聊了智能相机的整体轮廓。今天,咱们把镜头拉近,看看相机内部到底是怎么工作的。说白了,就是拆开相机,看看里面那些核心部件是怎么协同作战的。

我个人习惯,做驱动开发前,一定要先把硬件吃透。你想想看,连传感器怎么输出数据都不清楚,怎么写驱动?那不是瞎写嘛。好,咱们开始。

2.1 镜头:相机的眼睛

镜头这东西,看起来就是个玻璃片,其实门道很深。它负责把外界的光线汇聚到传感器上。

关键参数有哪些?

  • 焦距:决定了视野范围。焦距越短,看得越宽(广角);焦距越长,看得越远(长焦)。
  • 光圈:控制进光量。光圈越大(F值越小),进光越多,暗光下表现好,但景深浅。
  • 视场角(FOV):镜头能看到的范围。做安防相机时,FOV 90度以上才够用。
我的经验: 做驱动开发,你至少要知道镜头用了什么接口。最常见的是M12(螺纹)和S接口。我曾经遇到一个项目,镜头座没拧紧,图像一直模糊,排查了三天才发现是机械问题。嗯,硬件细节不能忽视。

2.2 图像传感器:CCD vs CMOS

传感器是相机的「视网膜」。光信号在这里变成电信号。目前主流就两种:CCD和CMOS。

对比项 CCD CMOS
工作原理 电荷逐行转移,统一输出 每个像素独立放大、输出
噪声 低,画质干净 相对高,但技术进步已缩小差距
功耗 高(需要多路电压) 低(单电压供电)
速度 慢(串行读出) 快(并行读出,支持高帧率)
成本
典型应用 工业相机、天文摄影 手机、监控、消费电子

现在消费级市场,CMOS基本一统天下了。为什么?便宜、省电、速度快。我早期做工业相机时,客户非要CCD,说画质好。后来CMOS技术进步了,比如索尼的IMX系列,动态范围做得非常好,客户也就慢慢接受了。

避坑指南: 我曾经在选型时忽略了一个问题——传感器的「快门类型」。全局快门(Global Shutter)适合拍运动物体,卷帘快门(Rolling Shutter)拍快速移动物体会变形。做扫码相机,必须用全局快门,否则条码都拍歪了。

2.3 ISP:图像信号处理器

传感器出来的原始数据叫RAW图,说白了就是一堆没处理的数字。ISP就是负责把这些RAW图变成我们肉眼看着舒服的图像。

ISP干了哪些活?

  1. 坏点校正:传感器总有坏点,ISP得把它们抹掉。
  2. 黑电平校正:去掉暗电流带来的偏置。
  3. 去马赛克:Bayer阵列每个像素只有一种颜色,ISP要插值算出全彩。
  4. 白平衡:让白色在不同光源下看起来都是白的。
  5. 降噪:减少噪点,但别把细节磨没了。
  6. 锐化:让边缘更清晰。

ISP可以集成在传感器内部(比如一些手机摄像头模组),也可以独立成芯片(比如安霸、海思的方案),或者用CPU/GPU软件实现。我个人习惯,做嵌入式产品,尽量用硬件ISP,省CPU资源。

核心要点: 驱动开发时,你不需要自己实现ISP算法,但必须知道怎么配置ISP的寄存器。比如设置增益、曝光时间、白平衡模式。这些参数通常通过I2C/SPI接口写入。

2.4 接口:MIPI / USB / GigE

传感器处理完数据,怎么传给主控?这就靠接口了。不同的接口,决定了你的驱动怎么写。

2.4.1 MIPI CSI(相机串行接口)

这是嵌入式领域最常用的接口。手机、树莓派、RK平台都用它。

  • 特点:差分信号,高速(每通道可达几Gbps),功耗低。
  • 物理层:通常2-4对数据线 + 1对时钟线。
  • 驱动要点:需要配置MIPI D-PHY的电压、摆率、LP/HS模式切换。

我刚开始调MIPI时,经常遇到图像花屏。后来发现是时钟相位没对准。嗯,MIPI的调试,示波器是必备工具。

2.4.2 USB(UVC协议)

USB摄像头大家最熟悉了。即插即用,靠的是UVC(USB Video Class)标准协议。

  • 特点:通用性强,Windows/Linux/macOS都支持。
  • 驱动要点:Linux下用V4L2框架,枚举设备、设置格式、启动流。
  • 局限:带宽有限(USB 2.0约480Mbps),高分辨率高帧率吃力。
我的建议: 如果做工业检测,别用USB 2.0。我曾经用USB 2.0传1080p 60fps,结果带宽不够,丢帧严重。后来换了USB 3.0,问题解决。

2.4.3 GigE Vision(千兆以太网)

工业相机的主流接口。传输距离远(100米),带宽高(1Gbps)。

  • 特点:基于UDP协议,支持多相机同步。
  • 驱动要点:需要实现GVCP(控制协议)和GVSP(流协议)。
  • 坑点:网络丢包会导致图像损坏,需要做重传机制。

我记得有一次调试GigE相机,图像总是有撕裂。查了半天,发现是网卡的巨型帧(Jumbo Frame)没开启。开启后,大包传输效率提升,问题消失。

2.5 整体数据流

咱们把整个链路串起来:

光线 → 镜头 → 传感器(RAW) → ISP(处理) → 接口(MIPI/USB/GigE) → 主控(内存) → 显示/存储

驱动开发的核心,就是打通这条链路。每个环节都有对应的驱动模块:

  • 传感器驱动:初始化、配置帧率/分辨率、控制曝光/增益。
  • ISP驱动:加载固件、配置参数、获取处理后的图像。
  • 接口驱动:MIPI D-PHY配置、USB UVC协议栈、GigE网络协议栈。
总结一下: 做相机驱动,你不需要成为光学专家,但必须理解每个硬件模块的输入输出是什么。传感器输出的是RAW数据,ISP输出的是YUV/RGB,接口负责搬运。搞清楚了这些,写驱动就有方向了。

下一讲,我们会深入传感器驱动,手把手教你初始化一个OV5640。到时候,咱们直接上代码。

好,今天就到这儿。有问题欢迎交流。