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通路是帧同步的。Sensor曝光完成后,RAW数据通过MIPI接口送给ISP,ISP在帧消隐期(VBLANK)内算出FV等统计量。AF算法拿到统计量后,计算出新的镜头位置,通过I²C/SPI写入驱动IC,驱动IC调整PWM占空比,VCM推动镜头到新位置。这一切必须在下一帧曝光开始前完成,否则就会丢帧。
我遇到过最头疼的问题就是数据通路延迟。有一次,ISP统计引擎的FV输出比实际帧晚了2帧,导致AF算法一直在用旧数据做决策,对焦来回振荡。后来加了时间戳对齐才解决。
实战建议
调试AF数据通路时,我习惯先抓一个全链路延迟分布图:
- Sensor曝光结束到ISP输出FV:通常0.5~2行时间
- FV传输到AF算法:I²C/SPI传输,约0.1~0.5ms
- AF算法计算新位置:取决于算法复杂度,一般0.1~1ms
- 驱动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设错了。先把通路打通,再谈优化。