4、多Sensor同步设计:多摄像头帧对齐、硬件触发模式(Trigger Mode)、PLL时钟同步
多Sensor同步,说白了就是让多个摄像头“步调一致”。
你想想看,一个全景环视系统装了4颗甚至6颗摄像头,如果每颗Sensor自己管自己曝光、自己管自己读出,那拼接出来的画面肯定错位得一塌糊涂。我早年做第一版多目拼接方案时,就吃过这个亏——画面里一辆车从左边摄像头跑到右边摄像头,中间能差出好几帧,根本没法看。
所以,多Sensor同步的核心目标就三个:帧对齐、曝光同步、时钟同源。下面我们一个一个拆开讲。
4.1 硬件触发模式(Trigger Mode)
要让多颗Sensor同时开始曝光、同时结束读出,最直接的办法就是给它们一个统一的“开枪信号”。这个信号,就是硬件触发。
Sensor的触发模式一般分两种:
| 触发模式 | 信号类型 | 典型应用 | 同步精度 |
|---|---|---|---|
| Free-Running(自由运行) | 无外部触发 | 单摄像头、低功耗场景 | 无同步 |
| 硬件触发(Trigger Mode) | 外部脉冲(GPIO/FSIN) | 多目拼接、3D深度、ADAS | 纳秒级 |
硬件触发模式下,Sensor会等待一个外部脉冲信号。收到脉冲后,Sensor才开始曝光(或开始读出)。这个脉冲的上升沿或下降沿,就是所有Sensor的“起跑线”。
关键参数:
- 触发延迟(Trigger Delay):从收到脉冲到实际开始曝光的延迟。不同Sensor的延迟可能不同,需要校准。
- 触发抖动(Trigger Jitter):多次触发之间延迟的随机变化。好的设计抖动应小于1个像素时钟周期。
- 最小触发间隔:两次触发之间至少需要间隔多长时间,否则Sensor会丢帧。
我个人习惯在FPGA里用一个专用的触发信号发生器。这个发生器输出一个周期性的脉冲,宽度刚好满足Sensor的触发要求。所有Sensor的触发引脚都连到同一个信号线上——注意,这里要等长布线,否则信号到达时间不同,同步精度就白做了。
4.2 多摄像头帧对齐
帧对齐,就是让所有Sensor在同一时刻开始输出一帧图像。硬件触发解决了“同时开始”的问题,但Sensor内部还有读出时间、曝光时间、消隐时间,这些都会影响帧对齐的精度。
我遇到过最典型的问题:两颗Sensor都用了同一个触发信号,但输出的帧头(VSYNC)却差了十几行。为什么?因为Sensor的读出延迟不一样。
解决帧对齐,通常有几种做法:
- 硬件对齐法:在FPGA里检测每颗Sensor的VSYNC上升沿,然后用一个全局计数器做对齐。哪颗Sensor先来,就等后面的Sensor都到了,再统一开始处理。
- 软件对齐法:在ISP或CPU端,根据每帧的时间戳做对齐。这种方法精度低,但实现简单。
- 混合对齐法:硬件做粗对齐(行级),软件做细对齐(像素级)。
我的经验:
如果Sensor支持“行有效信号(LINE_VALID)”输出,我建议用行级对齐。在FPGA里,每收到一行数据,就检查所有Sensor是否都到了这一行。如果某颗Sensor慢了,就插入等待周期。这样能保证每行数据都是对齐的。
4.3 PLL时钟同步
时钟不同源,一切都是空谈。
多颗Sensor如果各自用自己的晶振,哪怕标称频率一样,实际频率也会有微小差异。这个差异会导致帧率慢慢漂移——刚开始是同步的,跑了几分钟后,帧头就错开了。
PLL时钟同步的核心思路:所有Sensor共享同一个参考时钟。
具体做法:
- 用一个高精度晶振(比如25MHz,温漂小于±25ppm)作为主时钟源。
- 通过时钟缓冲器(Clock Buffer)扇出到每颗Sensor的输入时钟引脚。
- Sensor内部的PLL锁相环,锁定到这个参考时钟上。
注意:
时钟扇出时,要保证每路时钟的走线长度一致。我见过一个项目,因为时钟走线差了2cm,导致两路时钟相位差了将近1ns。对于高速Sensor(比如4K@60fps),这个偏差足以让帧对齐失败。
另外,有些Sensor支持“时钟同步模式(Clock Sync Mode)”。在这种模式下,Sensor不仅锁定频率,还会锁定相位。这样多颗Sensor的像素时钟完全同频同相,数据采集的时序就彻底统一了。
4.4 整体架构图
下面这张图,是我做多Sensor同步设计时常用的架构。你可以看到,从时钟源到触发信号,再到Sensor数据采集,每个环节都围绕“同步”展开。
4.5 避坑指南
做多Sensor同步,我踩过的坑不少。挑几个典型的说说:
- 触发信号毛刺:Sensor的触发引脚通常很敏感。如果触发线上有毛刺,Sensor会误触发。我建议在FPGA内部做一次边沿检测+去抖,确认信号稳定后再输出给Sensor。
- 上电时序不一致:多颗Sensor上电时间可能差几毫秒。如果触发信号来得太早,有的Sensor还没初始化完成,就会漏掉触发。解决办法:等所有Sensor都输出“Ready”信号后,再开始发触发脉冲。
- PLL失锁:如果参考时钟有抖动,Sensor内部的PLL可能会失锁。失锁后,Sensor输出的像素时钟会漂移,帧对齐就乱了。我习惯在FPGA里加一个PLL锁定检测,一旦发现失锁,立即复位Sensor并重新锁定。
总结一下:
多Sensor同步,核心就三件事:时钟同源、触发同步、帧对齐。时钟是基础,触发是手段,帧对齐是目标。只要这三件事做好了,多目拼接的硬件基础就稳了。