2、AF系统架构:VCM马达与镜头模组、AF驱动IC与PWM控制、ISP与AF统计引擎、Sensor与AF数据通路

自动对焦系统,说白了就是一套让镜头“自己找到清晰位置”的闭环控制。很多刚入行的朋友觉得AF就是调调PID参数,其实不然。你想想看,从马达转动到图像变清晰,中间经过了物理、电路、算法三层转换。哪一层出问题,对焦都会翻车。

我个人习惯把AF系统拆成四个核心模块:执行器(VCM+镜头)、驱动器(IC+PWM)、感知器(Sensor+ISP统计引擎)、控制器(AF算法)。今天咱们就逐个过一遍。

2.1 VCM马达与镜头模组

VCM(Voice Coil Motor,音圈马达)是目前手机摄像头最主流的对焦执行器。原理很简单——通电线圈在磁场中受力,推动镜头沿光轴移动。嗯,跟扬声器差不多。

核心参数对照表

参数典型值对AF的影响
行程(Stroke)0.2 ~ 0.5 mm决定对焦范围,微距能力
谐振频率80 ~ 200 Hz影响settling time,高频易振荡
灵敏度(μm/mA)10 ~ 50决定PWM分辨率需求
磁滞(Hysteresis)5 ~ 20 μm回程误差,需算法补偿

我在项目中遇到过一款VCM,标称行程0.4mm,但实际跑到0.35mm就开始非线性。后来查出来是弹簧片疲劳。所以啊,千万别完全相信datasheet,每批来料都要抽检。

避坑指南

我曾经在量产前发现某批次VCM的磁滞比标称大了3倍,导致近距→远距和远距→近距的AF位置差了20多个code。解决方案:在AF算法里加了一维查表补偿,把回程误差压到5μm以内。

2.2 AF驱动IC与PWM控制

驱动IC负责把主控发来的数字指令转换成VCM线圈上的电流。最常见的控制方式是PWM(脉宽调制)——通过调整占空比来改变平均电压,进而控制电流。

为什么用PWM而不是直接DAC?说白了,PWM效率高、成本低,而且驱动IC内部集成了H桥和电流检测,省外围器件。

这里有个关键参数:PWM频率。我建议选在VCM谐振频率的3~5倍以上,比如VCM谐振100Hz,PWM至少500Hz。太低的话,线圈会跟着PWM的开关频率振动,产生 audible noise(可听噪声),用户会投诉的。

注意

PWM频率也不是越高越好。频率太高,驱动IC的开关损耗增大,发热上升。而且MCU的PWM定时器分辨率有限,频率越高,可调的占空比步数越少。我一般取1~10 kHz,具体看驱动IC型号。

驱动IC还有一个重要功能——电流检测。通过检测VCM线圈上的实际电流,可以判断镜头是否到位、是否堵转。有些高端驱动IC还内置了波形整形功能,能自动生成S曲线加速/减速波形,减少镜头到位时的过冲。

2.3 ISP与AF统计引擎

AF算法需要知道当前图像清不清晰,这个“清晰度”指标由ISP(图像信号处理器)内部的AF统计引擎来计算。

最常见的统计量是对比度(Contrast),也叫FV(Focus Value,对焦值)。ISP会在每个帧周期内,对指定ROI(感兴趣区域)内的像素做高通滤波,然后累加高频分量。高频越多,图像越锐利,FV越高。

我常用的统计方式有几种:

  • Sobel梯度:对水平/垂直方向做一阶差分,计算梯度幅值。实现简单,对边缘敏感。
  • Laplacian:二阶差分,对噪声敏感,适合纹理丰富的场景。
  • 带通滤波:只提取特定频率范围(比如0.5~2 cycle/pixel),抗噪性好,但需要调滤波器系数。

嗯,这里要注意:ROI的选择直接影响对焦准确性。我见过有人把ROI设在整个画面,结果背景清晰、主体模糊,FV反而很高。所以一般建议用多区域加权,中心区域权重高,边缘权重低。

ISP AF统计引擎输出示例

// 假设ISP每帧输出以下结构
struct af_stats {
    uint16_t fv_h;          // 水平方向FV
    uint16_t fv_v;          // 垂直方向FV
    uint16_t fv_combined;   // 综合FV(通常取max或sum)
    uint8_t  roi_luminance; // ROI平均亮度(用于曝光补偿)
    uint8_t  confidence;    // 统计置信度(0~255)
};

2.4 Sensor与AF数据通路

最后,我们看看数据是怎么在Sensor、ISP、AF算法之间流转的。我画了一张流程图,帮你理清时序关系。

AF数据通路与帧时序 AF数据通路与帧时序 Sensor 曝光 曝光时间 + 读出时间 RAW 数据输出 MIPI CSI-2 接口 ISP 统计引擎 计算FV、亮度、置信度 AF 算法 爬山/搜索/预测 驱动 IC PWM -> 电流 -> VCM VCM + 镜头 物理移动 光学反馈(下一帧) 帧时序说明 • 每帧约16~33ms (30~60fps) • AF算法在VBLANK期间计算 • 驱动IC在下一帧曝光前完成

从图上你能看到,整个AF通路是帧同步的。Sensor曝光完成后,RAW数据通过MIPI接口送给ISP,ISP在帧消隐期(VBLANK)内算出FV等统计量。AF算法拿到统计量后,计算出新的镜头位置,通过I²C/SPI写入驱动IC,驱动IC调整PWM占空比,VCM推动镜头到新位置。这一切必须在下一帧曝光开始前完成,否则就会丢帧。

我遇到过最头疼的问题就是数据通路延迟。有一次,ISP统计引擎的FV输出比实际帧晚了2帧,导致AF算法一直在用旧数据做决策,对焦来回振荡。后来加了时间戳对齐才解决。

实战建议

调试AF数据通路时,我习惯先抓一个全链路延迟分布图:

  1. Sensor曝光结束到ISP输出FV:通常0.5~2行时间
  2. FV传输到AF算法:I²C/SPI传输,约0.1~0.5ms
  3. AF算法计算新位置:取决于算法复杂度,一般0.1~1ms
  4. 驱动IC响应:PWM更新到VCM稳定,约1~5ms(含settling time)

总延迟控制在一帧以内(30fps时约33ms),否则就要考虑预测算法或帧缓存。

2.5 小结:系统级视角

好了,四个模块都过了一遍。你可能会问:这些模块怎么协同工作?

我个人习惯用状态机来管理AF系统。每个模块都有独立的状态:

  • VCM:IDLE、MOVING、SETTLED、STALL
  • 驱动IC:STANDBY、ACTIVE、FAULT
  • ISP统计:WAITING、READY、OVERFLOW
  • AF算法:SCANNING、CLIMBING、LOCKED、LOST

状态之间通过事件驱动。比如ISP统计READY后触发AF算法执行一次step,AF算法计算出新位置后触发驱动IC开始MOVING,驱动IC完成移动后触发VCM进入SETTLED,VCM稳定后再触发Sensor开始下一帧曝光。

嗯,这个状态机设计得好,AF系统就稳。设计得不好,就会出现各种奇怪问题——比如镜头还没稳定就开始采图,或者FV统计还没更新就做了决策。

最后提醒一句

AF系统架构的调试,不要只盯着算法看。我见过太多团队花几个月调爬山算法,结果问题出在VCM磁滞补偿没做、或者ISP统计ROI设错了。先把通路打通,再谈优化。