PDAF调试完整指南:参数确认、对焦曲线标定与常见问题排查
1. 项目背景与调试思路拆解1.1 什么是PDAF调试这个任务到底在解决什么接触相机模组调试这些年PDAF是我觉得最需要耐心的一类工作。它本身看起来不复杂传感器上做成对的半遮挡像素分别记录光线经过镜头左右两侧的相位对焦不准时左右像素的灰度信息会出现相位差这个差异的大小和正负能直接告诉对焦器该往哪个方向推动镜头、推多少。给相机用上PDAF就像给对焦系统装了一把直读标尺不像反差式对焦那样需要反复试探才能找到峰值。但话说回来从传感器支持PDAF到让相机真正拍出又快又准的照片中间隔着大量只有实际调过才知道的细节。我这次接手的项目是在某国产移动芯片平台上做一颗主摄的相机调试目标很明确预览对焦要快、抓拍不能脱焦、录像追焦要稳。平台自带PDAF硬件加速传感器也宣称支持全像素双核对焦但第一次开机预览时对焦速度完全达不到预期拍出来的图片还有接近两成的脱焦率。于是整个调试过程变成了一条从硬件到算法再到应用场景的排查链条。对刚接触这块的新人来说PDAF调试最适合的第一步不是改代码而是先弄明白一条链路传感器端相位像素输出有没有正常平台端PDAF统计值能不能拿到统计值能不能正确换算成马达移动量换算完之后的码值能不能让镜头精确停在合焦点上。这四步一环套一环任何一环存在偏差都会在对焦结果上暴露出来只是现象往往比较隐蔽需要靠数据和场景去挖。这篇文章会按我实际操作的顺序来写从项目需求拆解开始到硬件参数确认、工具准备再到数据通路验证、对焦曲线标定、静态和动态场景验证最后把常见问题排查技巧单独整理出来。看过之后哪怕你手上是完全不同的平台这套方法论也能直接搬过去用。1.2 调试流程的整体设计思路我给自己定的流程分成三段先把PDAF数据通路打通并验证再做马达行程和镜头对焦曲线的标定最后用静态和动态场景做整机验证。顺序可以局部调整但我不建议跳步。先通数据通路的原因很简单如果PDAF统计值本身读不到、读出来的相位差符号是反的、或者左右像素的布点坐标和驱动配置对不上后面做得再细也是对着一个坏温度计测体温。数据通路验证做完确认统计值稳定、方向正确再去做标定才有可信的基础。标定阶段解决的是“镜头走到哪个码值才是清晰的”这个机械层问题它输出的对焦曲线会直接影响之后所有算法动作。最后用场景验证去暴露组合问题比如光线从亮到暗时统计噪声变化、目标移动时对焦曲线跟不上速度、多摄切换时参数被串改。这套思路背后的核心逻辑是分层处理问题。硬件误差单独清一遍校准参数单独建一份算法逻辑再根据场景去调。分层的好处很实际一旦最终对焦效果不达标你能快速定位是某一层的偏差而不是在一堆寄存器之间来回试。我见过不少同行在遇到偏焦时第一反应是加偏置量试了一轮改这个、改那个最后一堆参数互相拖累问题反而更隐蔽。分层的习惯能避免这种盲目试错。2. 动手前的参数确认与工具准备2.1 镜头、传感器、马达先列一张硬件参数底表我每次调试前的第一件事就是整理一张硬件参数底表。心里有底现场才不会慌。这张表至少要有以下几项内容。传感器型号、像素尺寸、单个像素物理大小以及PD双像素的排列方式。这里要特别注意是全局双像素还是局部区域带PD点PD是2x1还是1x2排列这些直接决定后续统计窗口怎么设。传感器RAW输出中PD点的行列坐标映射以及平台侧怎么知道这些坐标。镜头最大口径、有效焦距、F数以及按这些参数算出的理论景深范围。马达类型。音圈马达和闭环步进马达的调试逻辑差别很大要区分开。马达行程范围、电流与位移的灵敏度、驱动IC寄存器码值范围。镜头模组组立公差特别是倾斜和偏芯数据。温度传感器位置和采样精度这部分是做温度补偿的依据。实操中我踩过的坑主要是物料端和软件端的信息“打架”。有一次拿到的封样规格书标称马达行程0.35毫米实际用光具座一测只有0.31毫米差了将近12%。如果不做机械行程实测直接用标称值去写对焦算法无穷远端就会差很大一块但对焦近景反而可能没事。这种偏差在调试初期根本不会暴露直到用户拍远景时抱怨“拍不清”才知道坏了。所以行程标定必须发生在第一次点亮传感器之后、写对焦算法之前。另一个值得注意的点是景深和允许弥散圆的关系。像素大约1.0微米、焦距4.7毫米、光圈F1.9的模组在0.5米距离下的景深范围加起来可能只有几个厘米宽。镜头偏芯一旦导致焦面倾斜画面边缘就会明显比中心偏。这类问题不归PDAF算法管但它在PDAF调试阶段一定会干扰判断所以要在调试早期先把模组光学品质测掉。否则你会把镜头装歪误判成对焦算法故障浪费大量时间。参数底表我建议做成表格过一版刷一版标注数据来源是规格书还是实测。项目后期追查问题时这张表就是第一手证据。2.2 调试工具清单和测试图卡布置工具部分我习惯分成软件和硬件两类。软件类主要用到四样平台提供的相机调试工具用来读写传感器寄存器、PDAF统计寄存器、马达驱动IC以及抓取预览画面和RAW图。能打开RAW文件并显示像素坐标的分析软件这个环节用来验证PD像素位置。拍摄参数记录脚本把每一帧的PDAF统计值、马达码值、曝光时间、场景亮度一起记录成可排序的表格。对焦曲线标定脚本最好能自动控制马达步进并记录清晰度评价函数能省下大量重复劳动。硬件类同样四样光具座用于精确标定马达行程和镜头极限位置。多距离目标卡座。我常用的距离档位是0.1米、0.3米、0.5米、1米、2米、5米、无穷远。注意每一档都要用平面目标不能用倾斜目标代替。标准照度计确保每轮验证的亮度和色温能复现。亮度可调的柔光箱用来模拟从约1000勒克斯到约5勒克斯多个亮度档位。工具准备解决的是“能不能立刻做”的问题图卡布置才决定验证结论可不可信。测试卡要和镜头光轴垂直卡面平整不能用反光材质。贴卡时用带水平泡的夹具花五分钟调垂直和水平能省掉后面两小时对失焦原因的瞎猜。另外目标距离的测量要统一参考点。我习惯以镜头前镜片表面为起点而不是以手机后盖或者模组基板为起点。这个细节如果不统一多轮验证的曲线会互相矛盾。3. 核心调试环节的实操记录3.1 相位像素数据通路验证这个环节的目标只有一个确认PDAF统计值是从正确的PD像素读出来的方向正确、噪声合理。我按这样的顺序操作在传感器初始化脚本里打开PDAF模式把传感器输出配置成带PD像素的RAW格式。抓一帧RAW用分析软件找到左右相位点的实际坐标。和驱动配置里的PD区域坐标做对比确认行列位置不差。让镜头分别停在离焦前方和后方观察PDAF统计值的符号变化。符号不对时优先检查坐标镜像和翻转有没有同步到平台侧。在不同亮度下记录统计值的标准差建立一条“亮度-噪声”基线。整个环节最容易出三个问题。第一个是传感器切换binning模式以后PD像素没跟着切换导致统计值混入非PD像素的信息。第二个是镜像翻转导致相位差方向和物理运动方向相反对焦算法会把镜头往反方向推。第三个是统计窗口太小噪声大到相位差一会儿正一会儿负算法根本没法收敛。我在测亮度噪声基线时遇到过一种情况某个PD区域的统计值在高亮场景很稳定到了低亮场景噪声直接放大三倍。排查半天发现是该区域本来就有一组坏点在暗光下被异常点亮。处理办法很简单把这些坏点坐标加进传感器坏点表再把平台PDAF统计窗口的坏点排除功能打开。这个现象如果不做亮度扫档只在高亮环境下验证的话永远发现不了。这个环节的产出不止是一句“通了”还包括一份PD坐标确认记录、一份符号方向测试记录、一份亮度-噪声基线表。后续对焦曲线标定如果出现异常先拿这三份数据对照能省一半排查时间。3.2 对焦曲线标定与马达行程写入数据通路没问题之后进入对焦曲线标定。先明确目的对焦算法需要知道“目标在某个距离时镜头该用哪个码值”这组“距离-码值”的关系就通过标定来获得。步骤分解通过驱动IC把马达推到机械最远端和最近端记录两个方向对应的寄存器码值同时用光具座确认极限位置。从最大行程中找出成像合焦范围不要盲目用满行程机械结构两端往往存在非线性和回差区域。目标距离从近到远排成一列每个距离让马达从远端往近端来回扫记录清晰度峰值对应的码值。把多个距离的“距离-码值”组合拟合成对数曲线或者按平台要求用分段线性插值写入校准表。在低温和高温环境下各测一轮生成温度补偿表。这里必须提醒一个细节标定时马达移动方向要统一。如果有的距离段从远端往近端扫有的反过来扫马达回差会把曲线弄得不平滑拟合出来的表也会带锯齿。无论远近距离统一从同一方向进入对焦搜索可以有效抑制回差影响。温度补偿对音圈马达尤其重要。音圈马达的磁路特性在低温下会变化同样码值对应的镜头位置会偏移。项目里驱动工程师给过一个估算环境温度从25度降到0度某些马达的位移灵敏度会降低约6%。如果不做补偿5米外的对焦点可能偏到4.5米。我调完曲线后实测的趋势基本吻合。所以温度补偿不是一个可选项只要项目对低温场景有要求就一定要做。标定完成后的验证方式是用一组未参与拟合的距离点做回验。比如拟合用了0.1米、0.5米、1米、3米、无穷远回验就选0.3米、2米、5米。如果回验点对焦误差在景深范围内曲线才算通过。只拿拟合点自测是典型的自欺欺人行为一定要避免。3.3 静态对焦准确率验证矩阵标定完成进入静态场景验证。我固定一张验证矩阵每一轮都完整跑一遍结果记录为“通过”或“不通过”并附带原始数据。这张矩阵长这样目标距离照度勒克斯目标类型中心对焦边缘对焦0.1米约1000高对比黑白卡通过通过0.3米约1000纹理彩色卡通过边缘偏软0.5米约500人像模拟卡通过通过1米约200低对比灰卡通过通过3米约100高对比黑白卡边缘偏软不通过5米约1000远景建筑物场景通过边缘偏软判断“通过”我用的标准是两条画面清晰度指数不低于峰值清晰度的80%同时对焦过程中马达没有明显的往返振荡。边缘对焦偏软时先排查镜头模组焦面倾斜排除模组问题后再看PDAF统计窗口是否只覆盖画面中心区域。如果边缘对焦需求高就要调大统计窗口范围。这个环节最耗时间的其实是收集“偏软但不明显”的样本。单看一两张图很难看出问题但把连续十次对焦的清晰度曲线拉出来能看到某些场景稳定地差一截。处理方法是提高抽样次数每个距离至少测10次出现一次不合格就重测一轮连续两轮不合格才真正记录为缺陷。这样能过滤掉偶发因素也能暴露出系统性的偏软。静态验证还有一个容易忽略的点记录相机内部sensor温度。对焦长时间工作后sensor温度会上升热量传导给马达导致同一码值对应的位置发生变化。如果调试时发现上午测的结果和下午不一致先查温度数据大概率能找到原因。3.4 动态追焦和多摄切换验证静态过了以后看动态。我固定做四个动态验证项目目标在0.5米到3米之间来回移动速度分别设为慢速、中速、快速。画面从亮场景瞬间切换到暗场景再切回来。从微距瞬间切换到无穷远。多摄相机之间连续切换确保切换后的第一次对焦正常。第一个场景最能暴露PDAF和反差式对焦的切换策略问题。平台逻辑通常是先用PDAF粗对焦快速靠近合焦点再用反差式对焦精细收敛。如果粗对焦段给的时间太长运动目标会跑出镜头对焦范围如果反差收敛段的搜索窗口太小低对比度目标又会收敛不到峰值。我在这个平台上的调节经验把PDAF粗对焦的收敛阈值从“相位差小于满量程20%”改成“相位差小于满量程35%”提前切换反差式对焦同时限制反差搜索只在对焦曲线的平滑区间内进行。改完之后中速运动目标脱焦率明显下降。代价是低速或者静止目标的对焦时间会略微增加但整机体验整体提升了。多摄切换是我这个项目里比较特殊的场景。项目同时上了主摄、广角、长焦三颗摄像头切换时确实出现过从长焦切回主摄后主摄第一次对焦用了比平时多一倍时间的现象。排查后确认是切换时没有把上一颗摄像头的PDAF状态清掉新摄像头加载了一次错误的对焦状态。后来在切换逻辑里增加了“摄像头关闭时复位PDAF状态打开时重新加载校准表”的步骤问题就消失了。这个坑很典型做多摄项目的同行可以提前预防。4. 常见问题与排查技巧实录4.1 对焦偏移偏前还是偏后先分清是方向问题还是曲线问题对焦偏移是投诉最多的现象。我遇到这种问题后的排查顺序是这样。第一步看PDAF统计值的符号。把镜头人为停在合焦点前和合焦点后分别记录统计值的正负确认符号和方向定义一致。这一条检查很快能直接排除三分之一的问题。第二步看偏移是否随距离变化。如果近距离准、远距离偏多半是对焦曲线中段斜率不对重新标定中间距离点即可。如果所有距离都偏移相同的物理距离更可能是马达码值和镜头位移的换算系数错了。第三步如果偏移总是固定偏向同一个方向比如永远偏近要考虑镜头主光线角CRA和传感器PD像素微透镜偏移不匹配。这个属于光学层面的系统误差需要在PDAF统计值上叠加一个固定相位偏置。第四步极端温度下的偏移优先查温度补偿表是否在正确生效。可以把温度补偿表临时屏蔽在同一温度下比较对焦结果很快就能确认补偿有没有真的起作用。在项目里最常见的情况是第二步和第三步混合出现。这时候不要急着加偏置先重新标定一遍中段曲线再用系统偏置去修正残余偏差。顺序反了的话两个问题会互相掩盖。4.2 弱光、低对比度场景下PDAF失效弱光下最常见的表象是对焦时间变长甚至直接停在失焦位置。先看统计方差。如果PDAF统计值在暗光下跳变幅度很大说明噪声超限。试三种办法扩大统计累计帧数把多帧统计值平均后再给算法代价是对焦时间变长。打开平台的低照度PDAF增强模式部分传感器在暗光下会用特殊读出方式提高PD像素灵敏度。设一个可信度阈值统计方差超过阈值时直接切反差式对焦避免用坏的相位差硬算。低对比度场景比如一面纯色墙的情况不同。PDAF统计值本身就缺少可检测的纹理相位差信息很弱属于“无中生有难”。这时候平台通常会做场景识别判断对比度过低时主动切到反差式对焦。我调试时遇到过片刻画阈值过松导致墙面场景总进入PDAF模式然后对不上焦。最后把场景识别阈值收紧让低对比度场景优先走反差式问题就消失了。这个问题的排查关键在于拿数据和场景对照说话。弱光失效先看方差曲线低对比失效看纹理统计量两者处理路径完全不一样不要一看到“PDAF失效”就统一调参。4.3 马达回差引起的对焦抖动问题现象是对焦完成后画面在一个小范围内来回颤录像里晃得明显单张静态照片反而不太看得出来。马达哪怕闭环在微米级移动时也存在回差尤其是从两个不同方向逼近目标位置时停点会有差异。调试手法是对所有方向不一致的场景做“同方向到位”处理如果目标点在上一个位置的内侧就先让马达越过目标点一点再反向回拉到位。这个回拉量就是死区补偿需要实测标定。另一个常见原因是步进马达的启停参数没调好过流保护误触发。马达刚走到位就触发保护然后又重新启动看起来就像对焦在抖动。这种问题靠改代码常常压不住需要用示波器量马达驱动波形确认电流和时序。我们最后把驱动IC的斩波模式换了抖动就消失了。改驱动参数这一类操作建议在量测数据支撑下进行不要凭感觉。4.4 多摄切换时的PDAF状态串扰多摄项目的切换串扰我列几种排查手段在所有切换入口打印日志输出当前摄像头的PDAF状态组ID确认切换前后状态是否正确。检查每颗摄像头的PDAF校准数据表是否独立文件名尽量用全小写加下划线避免大小写混用导致加载错文件。给每颗摄像头分配独立的马达位置状态区不要共用同一块公共内存区域。切换后立刻触发一次强制对焦让新摄像头重新建立对焦基准可以掩盖大部分状态残留类问题。这个项目的经验是串扰问题不到现场往往复现不出来因为切换时序受上层调度影响很大。所以我测切换时用脚本连续切50次统计每次对焦响应时间和准确性基本能复现所有状态残留类问题。如果你在实验室怎么测都正常但用户反馈切换后对焦异常大概率就是这个方向。5. 写在最后三件比改代码更值得做的事最后聊几句调试心态。PDAF调试最磨人的地方在于它太容易让人陷入“试来试去”。我刚做这类项目时遇到偏焦就先加一个偏置试试不行再加另一个最后改了一堆参数问题不但没解决还把自己改糊涂了。吃了亏之后慢慢形成一套习惯对焦问题先分类——是统计值方向问题还是数值噪声问题是马达机械问题还是曲线标定问题是算法逻辑问题还是场景触发问题。每类问题用对应的工具去查基本都能在两三轮内定位。有三件比改代码更值得做的事我想单独强调。第一硬件参数和实测数据一定要汇总成一张表。所有调试结论都要能落到表上的某个数据点。没有数据支撑的“我感觉”和“应该是”在PDAF调试里是最贵的浪费。第二静态测试验证至少覆盖三个距离、两个亮度档位。只在一个环境验证通过的“正常”很可能只是偶然现象。这个项目如果我只在高亮环境下调大概永远发现不了那个暗光坏点问题。第三记录每一条修改和对应的现象变化。哪怕当时觉得没用三天后回头看就是救命稻草。我当时靠这种记录才在隔了一周后回查时快速定位到某次改统计窗口大小引起的弱光对焦衰退。PDAF调试说到底不是调一个像素、一个寄存器而是调一整条从光到电、从电到动的反馈链路。链路通了对焦自然就快了。这也是我在这类任务里收获最大的部分把看似玄学的问题拆解成一组可测、可调、可复现的工程数据。下次你拿到新的平台项目、新的传感器这套方法论依然能帮你省下大把时间。