首页 / 资讯中心 / 文章详情

展锐平台PDAF调试实战:从相位差到自动对焦的完整链路

展锐平台PDAF调试实战:从相位差到自动对焦的完整链路 ★ FEATURED ARTICLE
在展锐平台上做 PDAF 调试很多新人一开口就问“相位差怎么才能读成 0”或者“怎么让寄存器里的 diff 值固定住”。我最早接触这套东西的时候也差不多是这个思路总觉得 PDAF 就是个传感器侧的特性把 diff 调到某个区间就等于调完了。后来真正把一个项目从点亮摄像头一路带到量产才发现这个想法离题太远。PDAF 调试真正难的不是“让统计值变好看”而是让整套自动对焦系统在真实光照、不同温度、不同模组公差下都能稳定地停在正确的焦平面。这篇文章就围绕展锐平台上的 PDAF 调试展开把调试链路拆开讲先厘清相位差统计和自动对焦算法各管哪一段再讲标定和阈值怎么定最后聊聊我在实拍中反复踩过的几个坑和对应的排查思路。如果你正接手一个展锐方案的相机项目面对一堆 PD 寄存器和 AF 参数无从下手这篇文章应该能帮你把工作理成一条能落地的流程。1. 把PDAF调试的核心矛盾和边界划清楚1.1 相位差只是中间产物不是最终目标PDAF 的原理很好理解感光芯片上有一部分像素被微透镜工艺处理成左右或上下半遮蔽结构这些像素看同一场景时会因为入射角度差异产生相位偏移偏移量经过 ISP 统计模块换算就成为我们说的 diff 值。理想情况下镜头正好合焦时左右两组像素看到的图像应该对齐diff 趋近于 0镜头跑偏时diff 变大并且有明确方向。这个方向直接告诉自动对焦算法“镜头该往近拉还是往远推”。但请注意diff 只是“相位差统计量”不是一个绝对的物理距离单位。不同的镜头行程、不同的对焦距离、甚至同一颗镜头在不同温度下同样的 diff 数值对应的马达 DAC 位置都可能不一样。所以 PDAF 调试的第一个原则就是不要把“把 diff 调到某个值”当目标而是要把“在任意场景下AF 算法都能依据 diff 正确推出马达位置”当作目标。diff 是中间的坐标不是最终落点。1.2 展锐平台上硬件统计、driver、AF算法各管一段在展锐平台上PDAF 调试通常涉及三层。最底下是 sensor 侧负责把 PD 像素的数据在特定的曝光通道里统计出来通过寄存器或者驱动接口交给上层中间是 ISP 的统计模块负责把原始像素响应换算成可用的 diff、confidence 等数值有时还带简单的滤波和裁剪最上层是 AF 控制模块它不关心 diff 是怎么算出来的只关心“现在diff是多少、可信度多少、镜头在哪个位置、应该往哪个方向走到哪一步”。我在调试过程中经常发现问题明明出在 AF 算法参数上大家却跑到 sensor 驱动里改了一圈寄存器或者反过来现象是 sensor 统计的 diff 跳得离谱却在 AF 策略里反复调搜索步长。结果就是改了参数不起作用只能到处试。所以接手调试任务的第一件事不是改代码而是在架构图上先把“谁输出diff、谁消费diff”标清楚。展锐平台给到的 debug 工具里一般能同时看到 PD 统计值、AF 状态机和最终 DAC 指令调试时就要同时盯这三个值哪个环节断了就只查哪个环节。1.3 “硬件统计正常”和“AF表现正常”是两码事我见过很典型的情况用固定光源、固定距离对着图卡diff 输出非常干净线性度很好灵敏度也高但一拿到实际场景里相机对焦像是喝醉了一样一会拉到近处一会推到远处。问题出在哪多半是 AF 层没有理解 diff 的“绝对参考”。具体说diff 等于 0 不代表镜头就在最佳清晰点因为 sensor 的 PD 像素在出厂时存在一个固有偏移微透镜位置、模组组装公差、红外截止滤光片的厚度都会影响“合焦时 diff 到底该是多少”。有些项目在产线会把一个固定的 offset 值写进 sensor 的 OTP 区域有些是放在模组端曲线表里。调试时如果把“diff0”当成唯一的对焦依据忽略了 offset那么硬件统计即使再干净AF 也永远停不在最清晰的位置。判断一个平台 PDAF 是否调试到位标准应该是从最近对焦距离到无穷远分段测多点每个点都能通过 diff 指引收敛到“与人工手动对焦几乎一致”的位置并且在切换场景时没有明显回退。2. 动手前必须做好的准备数据通路、模组档案与验证环境2.1 先确认相位统计模块的数据通路是通的一开始调试的时候我总是先让 sensor 输出一帧有纹理的画面然后把展锐平台 PD 统计模块使能打开。这里最容易出问题的地方是分辨率和裁剪。很多 sensor 在开双像素/掩埋PD功能时输出的 RAW 往往要经过特殊的 binning 或者裁剪保证 PD 像素与普通像素的配对关系不变。一旦驱动里加了缩放、裁切或者旋转配置统计模块取到的像素坐标可能与实际像素对不上就会出现“画面明明很清楚diff 却乱跳”的现象。我的习惯是写一段非常简单的小工具在固定场景下连续打 30 帧把每帧的 diff 平均值、最大值、无效区占比打印出来。如果 30 帧里平均值稳定、波动不超过一定范围说明数据通路基本通了如果呈周期性跳变或者间歇性跳变优先检查帧率和曝光参数排查是不是在统计窗口内发生了曝光切换或者 sensor 用了不同的增益通道。展锐平台的 debug 串口一般会把 ISP 统计模块输出的节拍信息也打出来要养成先看节拍再判断数据的习惯很多“统计异常”其实是时序问题。2.2 建立模组档案VCM曲线、光轴方向与温度补偿我调试 PDAF 之前一定会找模组厂要三样东西VCM 的 DAC-行程曲线、PD 像素灵敏度差异报告、模组在不同温度下的焦点漂移数据。这三样东西决定了很多看起来像“PDAF 没调好”的症状其实是“压根没往对的方向调”。VCM 曲线最容易被忽略的一点是近端和远端的不对称。很多音圈马达的行程在靠近镜头回弹位置时会变平导致同样一档 DAC 变化量对应的焦点位移量很小表现在 PDAF 上就是“近处对焦很准远处总觉得差一点”。PD 像素灵敏度差异报告是用来做感光矫正的因为相位像素天生比普通像素少一半光照或做了遮蔽如果不做响应归一化diff 里会混入不该有的 DC 分量。温度补偿数据则关系到冬天和夏天的表现差异温度降低时 VCM 的磁通量变化、润滑脂黏度变化都会让同一 DAC 位置对应的镜头位置发生偏移如果没有温度补偿表PDAF 的灵敏度标定出来也是“只能在特定温度成立”的局部结论。2.3 搭一套可复现的调试环境比多买设备重要很多团队的调试环境就是“拿手机对着窗外拍”觉得这样更接近真实场景。但做 PDAF 标定最忌讳的就是场景不可控。我建议至少准备三个固定距离的测试点最近微距厂商标称最小物距附近、中距约 0.8-1 米、无穷远至少 20 米以外或使用准直光管。每个距离上放一张带高对比边界的图卡图卡平面尽量与 sensor 光轴垂直避免因为倾斜角度带来额外的相位差偏移。光源方面至少要覆盖一个高照度冷色温场景和一个中等照度暖色温场景。这两个场景用来验证两件事第一PD 统计是否容易受白平衡增益影响第二弱光下噪声变大时diff 是否还能保持有效。所有测试都必须记录下目标距离、光源照度、色温、Gain、曝光时间这几个参数之后查找问题时才能定位是场景问题还是参数问题。开发时为了方便我会在测试环境里固定一台监控相机用来记录“被测相机当前到底对着什么”很多看似没有规律的对焦失败一对照监控录像就能看出来是目标移动了还是实际场景根本缺纹理。2.4 第一个“跑通”用例手动拉DAC看diff能不能单调变化拿到第一块可以出图的展锐平台样机之后我建议不要急着开复杂标定。先做一件最简单也最有用的事把 AF 算法暂时旁路掉手动写一个 DAC 扫描程序从最低行程一步步往上推每一步停 100 毫秒同时记录 diff 的变化。如果 diff 能随着 DAC 从近到远呈现单调变化并且在某个区段内近似线性那么整个链路就是健康的后续标定工作可以放心展开。如果 diff 呈“先减后增再减”这种反复拐弯的状态多半说明统计窗口取到了有问题的区域或者 PD 像素输出异常要先回头查统计配置。如果 diff 完全不变则可能是 sensor 的 PD 通道没有正常曝光或者驱动里给 PDAF 数据的解析位宽错了。这一步跑通后面所有调试才有意义。3. 从相位差原始数据到自动对焦步数的完整调试链路3.1 原始相位差数据的读取与有效性判定PDAF 调试到了中层阶段核心就是对一组数据做“清洗—建模—决策”。先说清洗。展锐平台上拿到的 PD 统计一般会按照用户设置的 ROI 区域输出多个子块数值。我常用的规则是把 ROI 分成横向若干小块每个小块输出一组 pd_avg、pd_min、pd_max 之类的统计量同时输出该区域的亮度信息和置信度信息。判定一帧 diff 是否有效我通常看三个条件区域平均亮度不能过低或饱和区域纹理强度不能接近纯色区域内的像素响应一致性不能差得离谱。这三个条件只要有一个不满足这一帧的 diff 就直接打上“invalid”标记不让它进入 AF 状态机。原因很朴素纯白墙面没有相位信息像素饱和了也切不出正确的相位差硬用只会让 AF 来回复位。把这些无效帧滤掉之后通常还要再做一次多帧平均因为单帧的 PD 像素数量有限在低照度下噪声会让 diff 抖得厉害。多帧平均能稳但代价是变慢所以这里的窗口大小一般动态调diff 波动小时窗口收窄波动大时窗口放宽。3.2 灵敏度标定一格DAC到底对应多少相位差“灵敏度”在 PDAF 调试里有两个含义一个是传感器侧 PD 像素本身对光线角度变化的敏感程度另一个是 AF 算法侧“diff 变化量 / DAC 变化量”的比值。调试时主要关注后者因为算法最终要靠“当前距离目标还有多远”来做步长决策。标定的基本流程是固定场景距离、固定光源从行程最小端开始逐步增加 DAC记录每个 DAC 点上的 diff。然后画出“DAC—diff”曲线。正常情况下曲线中间段会有一段斜率相对稳定的线性区这个区段的斜率就是灵敏度标定值。如果近端和远端斜率差异很大需要分段标定或者使用曲线拟合而不是只取一个固定比值。这里有一个特别容易出现偏差的操作标定曲线时镜头经过的行程方向不同VCM 的迟滞会让同一 DDC 位置下镜头实际停的位置不一样所以标定时必须保证“总是从同一起点向同一方向运动”或者分别做“上行曲线”和“下行曲线”然后取中点建模。不做这一步之后运行时的 AF 搜索步长就会偏大或偏小表现就是“每次对焦都对得上但总要反复来回好几次才停住”。3.3 零相位基准与镜头位置偏移的处理之前说过合焦时 diff 不一定是 0还取决于 PD offset。这个 offset 怎么测做法是在一个光照稳定、纹理丰富的目标上先用人工方式把镜头调到主观最清晰点然后读取该点的 diff 值作为基准 offset。这个值应该是相对稳定的但如果每次测完都不一样就要检查是不是存在 VCM 回弹或者目标距离波动。得到基准 offset 之后AF 算法里的目标值就不再写死为 0而是“基准 offset ± 一个容差带”。容差带的大小取决于景深和灵敏度景深越大允许的 diff 偏差可以越大灵敏度越高稍微一点 diff 变化就代表清晰的焦点变化容差应该收紧。实拍里经常会发现“明明 diff 还没到目标值但画面已经很清楚了”“或者 diff 已经到目标值画面还发虚”这类现象多数就是容差带与景深不匹配导致的。调试这种问题时别只盯着 diff 数值看要对照最终图像的清晰度评价对比度值来判定收敛是否合理。3.4 置信度阈值与AF搜索策略的联动diff 很稳、灵敏度也标好了不代表每个场景都能依赖 PDAF。低对比度区域、纯色背景、强反光、高光溢出这些场景下即使 diff 能算出来可信度也不高。所以一定要有一个置信度阈值低于阈值的场景自动切回对比度搜索或者采用“先 PDAF 粗定位 对比度精搜索”的组合策略。置信度阈值怎么定我习惯的做法是采集一组“可信任场景”和一组“不可信任场景”的统计直方图然后在两者交叉区域选阈值。太苛刻会导致 PDAF 几乎不工作一切场景都走对比度模式失去相位对焦的速度优势太宽松则会在弱纹理场景里发生“自信地错位”。阈值定完之后还要和 AF 搜索窗口联动如果置信度只是略低于阈值可以把搜索窗口限制在一个较小范围内用对比度快速精扫如果置信度非常低则放开搜索窗口按普通搜索对待。这是一种很实用的分级策略也是我在展锐平台上比较推荐的一层设计。4. 实拍调试中常见的五个特征问题与排查手记4.1 相位差数值一直跳变根本没法定位这个现象在初测时很常见。第一反应通常是“是不是 sensor 的 PD 像素坏了”但我后来总结出三个更常见的根因。第一个是 ROI 太小或位置没对准主体统计窗口里混入了太多背景区域diff 就成了多个深度目标的混合统计。第二个是低照度下噪声放大了 PD 像素响应差异即使静止画面diff 也会大幅波动。第三个才是真正的硬件问题PD 通道的曝光和正常预览通道没有同步导致统计的时候像素状态不一致。排查链路建议按顺序来先加大 ROI 并确认主体占满整个统计区域再看增益和曝光时间如果 gain 很高先做多帧滤波最后才去检查 sensor 的 PD 配置时序。我一个项目里曾经遇到“只有 60Hz 光源下跳变”的情况最后定位到是 PD 统计窗口没有和曝光行同步对齐导致每帧采到的荧光灯相位不一样把曝光行同步配置改正确之后diff 立刻稳定下来。4.2 对焦看起来比相位差“慢半拍”这种情况很有意思手动拉 DAC 时 diff 响应很快但在实际对焦时镜头总是冲过头再拉回来表现为来回运动明显比对比度对焦还慢。问题核心往往在 VCM 迟滞处理上。我们的标定曲线是理想位置但实际运动时镜头总有个“冲量”尤其是大行程搜索之后立刻进入小步精细调整延迟更明显。处理方式通常是给 AF 算法加一个“方向惩罚”或者“迟滞查表”判断当前镜头运动方向与上一次目标方向是否一致不一致时先跳过或者补偿一定 DAC 量。另外要把“拉镜速度”和“统计曝光时间”匹配起来。如果一帧统计要 60ms而镜头每步运动只要 5ms那就别让算法每帧都发新指令等稳定一两帧再采样不然读到的 diff 是镜头运动过程中的中间值自然显得“慢半拍”。4.3 微距和无穷远表现不一致微距准、无穷远不准或者反过来这是 PDAF 项目里比较常见的失衡现象。多数原因不是 PDAF 标定错了而是 VCM 曲线在两端出现了非线性。近端微距时镜头往往被弹簧顶在临界位置行程曲线会变得比较“软”远端无穷远时镜头又接近机械限位存在回弹不一致。用同一个全局灵敏度去换算两端的 DAC 步长自然会一边准一边偏。我遇到这种情况后的处理思路是不追求全行程用一个灵敏度而是把对焦距离分成“近、中、远”三段每段标定一个局部灵敏度并在行程两端各留一个所谓的“软区”软区里减少单步 DAC 增量让算法更谨慎地逼近目标。软区的宽度要在实拍里根据对焦成功率来调。还有一个容易被忽略的点模组在无穷远位置时如果靠的是机械限位而非自动对焦行程位置那么取模组标定时要记住“外部设定目标不一定对应同一 DAC”需要和模组厂对一下“标称无穷远”定义。4.4 光线一变自动对焦就乱套白天对焦很稳晚上对焦就迷茫或者说冷光下没问题暖光下偏。这类问题通常和 PDAF 像素的感度矫正有关。PD 像素对光线色温比较敏感因为遮蔽结构、微透镜厚度带来的光谱响应差异在不同色温下左右像素组的响应差可能被放大。展锐平台的统计模块一般会有针对 PD 像素的感光矫正系数如果这个系数是固定的没有随白平衡增益联动就会出现色温相关的偏差。排查时先把光源切换到暖色温观察不同增益下 diff 的 baseline 是否发生平移如果平移量与 R/G/B gain 的变化成正比基本就能判断是感光矫正不够。解决办法是增加一份“色温/增益—diff offset”查表或者让 AWB 结算结果参与 PDAF offset 修正。照明频闪也不可忽视尤其 LED 灯下曝光积分长度和光源频闪周期不匹配时diff 会出现低频振荡这种问题只在部分曝光档位出现抓日志时注意记录曝光时间别只记“光线没变”。4.5 模组间一致性差一个参数调不好所有机器单机调试调得很好一上产线就完蛋这是很多 PDAF 项目量产前的噩梦。原因通常是每颗模组的 PD offset、VCM 曲线、微透镜偏移都不一样。同一个校准表装到另一颗模组上可能直接误差出景深范围。这类问题没有“银弹”只能靠两件事兜底一是产线校准在 sensor OTP 或者模组 EEPROM 里写入每颗独有的 PD offset 和 VCM 特征参数二是软件侧做“自适应校准”开机时自动扫一圈 DAC记录 diff 的 baseline 和灵敏度覆盖掉产线参数里的公共部分。调试阶段要做的就是建立好“产线参数位”的定义和读写接口并在驱动加载时确认软件读到的参数与模组编码匹配。很多平台都有对应的产线校准工具展锐方案里一般也会提供 ATE 校准接口调试初期就要把这套链路跑通不要等到量产前才来折腾。5. 收尾阶段的回归、平台升级应对与调参经验沉淀5.1 把“打点数据”做成固定回归而不是靠眼睛看PDAF 调试最容易“调着调着就退回去”。今天把近距调准了改了一下中距灵敏度第二天发现近距又跑了。所以我到最后阶段会做一个半自动化的回归脚本固定几个测试距离依次触发对焦自动记录“目标 DAC、实际收敛 DAC、收敛时间、diff 残留、对比度残差”然后自动生成一张表格和上一版结果对比。回归用例不要只在理想光源下做至少要覆盖三档照度、两种色温、一个频闪光源场景。对焦成功率的标准也要定得客观我认为比较实用的标准是“连续触发 30 次每次都能在有限帧数内收敛到峰值的 90% 以上并且不出现来回振荡超过 3 次”。这个标准虽然简单但在实拍中很能反映真实体验。5.2 平台升级后PDAF行为变化要比对“寄存器基线”展锐平台软件版本更新频率很高尤其是 ISP 侧统计模块和 camera HAL 驱动。每次升级后我都会第一时间做一件事把之前保存的“关键寄存器 参数基线”重新读一遍对照哪些默认值变了。很多时候升级本身没有改 PDAF 相关逻辑但合入了新的 ISP 公共模块导致统计数据的节拍或者 ROI 对齐方式变化间接影响 diff 输出。为了省事我在调试期间会专门维护一份“PDAF 调试基线清单”包括统计模块各开关的状态、ROI 设置、曝光同步配置、置信度阈值、灵敏度表版本以及使用的 sensor 固件版本。每次平台升级、每次换 sensor 固件、每次换模组批次都要拿这份基线重新跑一遍 2.4 里的“手动 DAC 扫描”用例只对比 diff 曲线的形态。曲线形态不变就可以继续往下调形态变了先追溯平台改动不要急着再调参数。5.3 把参数、日志、决策逻辑沉淀成文档而不是只存在于局部最后这一点是我个人最深的心得。PDAF 调试周期不长但涉及的知识点很散sensor 驱动、ISP 统计、AF 算法、VCM 特性、产线校准每一块都有人懂一点但很少有人全都清楚。如果不把调试过程中的参数选择理由记录下来两三个月后项目换人一切都要重来。我习惯用一个很简单的表格来维护调试结论参数名、默认值、当前值、修改原因、测试依据、生效版本。例如“灵敏度”这一格子我会写“由近距/远距两段曲线取中段斜率获得实拍 0.5m/1m/无穷远收敛后决定比例因子为 x.x”。这种文档看起来不起眼但它是整个调试工作中最保值的部分。后来我又把每次实拍日志里最重要的三个量——DAC 位置、diff 值、对比度值——存成 CSV遇到疑难杂症时直接画在同一张图里。只要这三个量有任意两个对得上问题基本都能圈到一个很小的范围里如果三个量互相矛盾那多半是日志的时间戳不同步先解决数据同步再谈分析。我做 PDAF 调试这些年最大的体会是它不像很多文档里写的那样一个公式、一个阈值就能搞定。它是一个需要反复验证闭环的工程问题统计链路通不通、标定曲线准不准、算法策略合不合理、模组一致性稳不稳每一环都可能让前功尽弃。但反过来只要能沉下心来把每一条链路的判定标准都建立起来PDAF 调试反而比对比度对焦更容易“根治”因为它给出了明确的方向信息。真到了那一天你会觉得展锐平台上的 PDAF 调试也不过如此。
阅读完成 · 觉得有帮助?
咨询建站