2. 同步控制基础:帧同步概念、行同步与场同步、同步信号时序分析
各位同学,今天我们聊聊多摄同步里最基础、也最绕不开的东西——同步信号。说白了,就是怎么让几个摄像头“步调一致”地干活。
我刚开始做多摄项目时,觉得同步不就是给个触发信号嘛,有啥难的?结果第一次联调,三颗摄像头拍出来的画面,有的快半帧,有的慢半帧,拼接出来的图像像鬼影一样。嗯,从那以后,我再也不敢小看同步信号了。
2.1 帧同步:让所有摄像头从同一行开始
帧同步,英文叫 Frame Sync。它的核心任务只有一个:告诉所有摄像头,下一帧从此刻开始。
你想想看,如果两个摄像头各自按自己的节奏跑,A 摄像头已经拍到第 500 行了,B 摄像头才刚启动第 100 行。这时候你让它们同时输出图像,数据根本对不上。
帧同步信号通常是一个脉冲。上升沿到来时,所有摄像头复位到帧起始位置。我习惯用 VSYNC(垂直同步)来表示这个信号。在 CMOS 传感器里,VSYNC 高电平有效时,表示一帧数据正在传输;低电平时,表示帧间隙。
关键点:帧同步的精度决定了多摄拼接的“对齐度”。如果帧同步偏差超过 1 行像素时间,运动物体就会出现撕裂。
我在项目中遇到过一个问题:用软件发帧同步命令,结果因为 I2C 总线延迟,三颗摄像头收到命令的时间差了 2ms。2ms 在 30fps 下就是 6% 的帧偏移,拍静态场景还行,一拍运动物体就露馅了。后来我改用硬件 GPIO 直接触发,延迟降到微秒级,问题才解决。
2.2 行同步与场同步:逐行扫描的节拍器
帧同步搞定的是“哪一行开始”,但一帧有上千行,每行怎么对齐?这就轮到行同步(HSYNC)和场同步(VSYNC)登场了。
行同步(HSYNC):每扫描完一行像素,传感器会发出一个脉冲,告诉下一行可以开始了。行同步的频率 = 帧率 × 每帧行数。比如 1080p 30fps,每帧有 1125 行(含消隐区),行同步频率就是 30 × 1125 = 33.75kHz。
场同步(VSYNC):这个就是我们刚才说的帧同步。在隔行扫描的老式系统中,一帧分奇场和偶场,所以叫“场同步”。现在逐行扫描普及了,场同步基本等同于帧同步。但术语保留了下来,你看到 VSYNC 就知道是帧级别的同步信号。
| 信号 | 作用 | 典型频率 | 备注 |
|---|---|---|---|
| VSYNC | 帧/场起始标志 | 30Hz / 60Hz | 高电平表示有效数据区 |
| HSYNC | 行起始标志 | 几十 kHz | 每行一个脉冲 |
| PCLK | 像素时钟 | 几十 MHz | 每个时钟传输一个像素 |
这里有个坑,我提醒一下:有些传感器把 VSYNC 和 HSYNC 的极性设计成可配置的。默认可能是高有效,但如果你配置错了,采集到的图像会上下颠倒或者左右翻转。我曾经因为没仔细看 datasheet,花了两天时间查为什么图像是倒的——结果就是 VSYNC 极性设反了。
2.3 同步信号时序分析:用示波器“听”心跳
光知道概念不够,你得会看时序图。我每次调试多摄同步,第一件事就是拿示波器抓 VSYNC 和 HSYNC 的波形。
一个标准的同步时序包含四个阶段:
- 前肩(Front Porch):行/帧结束后的空白期
- 同步脉冲(Sync Pulse):真正的同步信号
- 后肩(Back Porch):同步脉冲后的空白期
- 有效数据区(Active Video):传输像素数据
为什么要有前肩和后肩?说白了,这是给传感器和接收端一个“缓冲时间”。传感器需要时间准备下一行数据,接收端需要时间处理上一行。没有这些空白期,信号容易出毛刺。
我的调试习惯:先测单颗摄像头的 VSYNC 和 HSYNC 波形,确认时序参数和 datasheet 一致。然后同时测多颗摄像头的 VSYNC,看上升沿是否对齐。偏差超过 1 个 HSYNC 周期(约 30μs 对于 1080p),就需要调整。
下面我画了一张同步信号时序的示意图,帮你理解这几个阶段的关系:
从图上你能看到:VSYNC 低电平时,HSYNC 还在正常跳变,这些行属于上一帧的消隐区。VSYNC 拉高后,HSYNC 继续跳变,但此时传输的是有效像素数据。PCLK 则像心跳一样,每个时钟送一个像素。
避坑指南:我曾经遇到一个情况,三颗摄像头的 VSYNC 明明对齐了,但拍出来的图像还是错位。后来发现是 HSYNC 没对齐——虽然帧起始时间一样,但每行的起始点差了半个像素时钟。解决办法是让所有摄像头共用同一个 PCLK 源,或者用 PLL 锁定相位。
2.4 同步信号的关键参数
实际项目中,你需要关注以下几个参数:
- 同步脉冲宽度:VSYNC 和 HSYNC 脉冲保持有效电平的时间。太短可能被噪声误触发,太长会压缩有效数据时间。
- 建立时间(Setup Time):数据在同步信号到来前必须稳定的时间。我一般留 2-3 个 PCLK 周期的余量。
- 保持时间(Hold Time):同步信号结束后数据需要保持的时间。这个容易被忽略,但 FPGA 采集时经常因为保持时间不够导致亚稳态。
- 抖动(Jitter):同步信号边沿的随机偏移。多摄系统里,抖动会导致帧间对齐误差累积。我习惯要求抖动 < 1% 的 PCLK 周期。
嗯,同步信号的基础就这些。说白了,帧同步定大局,行同步管细节,时序分析是调试的必备技能。下一节我们会聊怎么用硬件电路把这些信号分发给多个摄像头——那又是另一番天地了。
一句话总结:同步信号就是多摄系统的“心跳”,心跳乱了,整个系统就乱了。把 VSYNC、HSYNC、PCLK 的时序吃透,多摄同步就成功了一半。