3、GPIO触发同步:使用MCU/FPGA产生同步脉冲,连接相机Trigger IN,实现帧级同步

好,咱们来聊聊第三种方案——GPIO触发同步。说实话,这是我在实际项目里用得最多的一种方式。为什么?因为它够灵活,成本可控,而且精度能满足绝大多数多摄像头应用。

说白了,就是用一颗MCU或者FPGA,按照你设定的帧率,往每台相机的Trigger IN引脚上送一个脉冲。所有相机收到这个脉冲后,同时开始曝光。这样就能实现帧级别的同步。

3.1 基本原理:一个脉冲,所有相机同时响应

我习惯把这种方案叫做「主从触发模式」。主设备(MCU/FPGA)产生一个TTL电平的方波脉冲,通过GPIO口输出。这个脉冲经过分线或者驱动电路后,同时连接到所有相机的Trigger IN接口。

相机内部配置成「外部触发模式」后,每检测到一次上升沿(或下降沿),就执行一次曝光。你想想看,只要脉冲到达每个相机的时间差足够小,那所有相机的曝光起始时刻就是一致的。

关键点:同步精度取决于脉冲到达各相机的时延差。理想情况下,这个时延差可以做到微秒级甚至纳秒级。

3.2 硬件选型:MCU还是FPGA?

这里我踩过不少坑。先说说我的建议:

方案 优点 缺点 适用场景
MCU(如STM32) 开发简单,成本低,生态好 脉冲抖动较大(±10μs级),多路输出时延不一致 帧率≤30fps,精度要求不高的场景
FPGA(如Xilinx Artix-7) 脉冲抖动极小(±1ns级),多路输出严格对齐 开发周期长,成本高,需要懂硬件描述语言 高帧率(>100fps),高精度同步需求
CPLD(如Altera MAX系列) 介于两者之间,性价比不错 逻辑资源有限,复杂功能受限 中等精度,中等帧率

我个人习惯是:如果只是做原型验证,先用STM32搭一套。等确认方案可行,再换成FPGA做量产。嗯,这样能省不少开发时间。

3.3 电路设计:别忘了加驱动芯片

这里有个容易忽略的点——驱动能力。我曾经在一个项目里直接用MCU的GPIO去驱动6台相机,结果脉冲波形严重畸变,相机经常漏触发。

为什么会这样?因为相机的Trigger IN通常有10kΩ左右的上拉电阻,加上线缆的寄生电容,MCU那几毫安的驱动电流根本不够用。

避坑指南:我曾经因为省成本,没加74HC244驱动芯片,结果现场调试了三天才发现是波形问题。后来老老实实加了驱动,问题立刻解决。

推荐电路结构:

MCU/FPGA GPIO → 74HC244(或ULN2003)→ 50Ω串联电阻 → 各相机Trigger IN

注意:串联50Ω电阻是为了匹配阻抗,减少信号反射。线缆长度超过1米时,这个电阻必须加。

3.4 软件配置:相机端要做什么?

相机这边,通常需要配置以下几个参数:

  • 触发模式: 设置为「外部触发」或「硬件触发」
  • 触发极性: 上升沿触发还是下降沿触发?我习惯用上升沿,因为默认高电平,拉低再拉高,抗干扰能力强
  • 触发延迟: 有些相机支持设置触发信号到曝光的延迟,用于补偿不同相机的响应时间差异
  • 曝光时间: 所有相机设为相同值,否则帧率不同步

举个例子,用Basler相机的话,配置代码大概是这样:

// 伪代码示例
camera.TriggerMode = "On";          // 开启外部触发
camera.TriggerSource = "Line1";     // 触发信号来自Line1(GPIO)
camera.TriggerActivation = "RisingEdge"; // 上升沿触发
camera.ExposureTime = 10000;        // 曝光时间10ms,所有相机一致

3.5 精度分析:到底能同步到多准?

这个问题很多人问。我直接给实测数据:

  • MCU方案(STM32F4): 脉冲抖动约±5μs,多路输出时延差约±10μs
  • FPGA方案(Xilinx Artix-7): 脉冲抖动约±500ps,多路输出时延差约±1ns
  • CPLD方案(MAX V): 脉冲抖动约±2ns,多路输出时延差约±5ns

你想想看,对于30fps的相机,一帧是33ms。±10μs的误差只占0.03%,人眼根本看不出来。但如果是高速相机,比如1000fps,一帧只有1ms,那±10μs的误差就占1%了,这时候必须上FPGA。

小技巧:如果MCU方案抖动太大,可以试试用定时器的PWM输出模式,而不是用GPIO软件翻转。PWM模式由硬件产生脉冲,抖动会小很多。

3.6 多相机接线:星型还是菊花链?

我遇到过不少人在接线方式上翻车。两种主流方式:

  • 星型连接: 主设备每个GPIO单独接一台相机。优点是各通道独立,故障隔离。缺点是占用GPIO多,线缆多。
  • 菊花链连接: 主设备一个GPIO输出,通过分线器同时接到所有相机。优点是接线简单。缺点是信号反射问题,需要做好阻抗匹配。

我个人习惯:相机数量≤4台时用菊花链,超过4台用星型。为什么?因为菊花链的反射问题会随着节点数增加而恶化。我曾经试过用菊花链带8台相机,结果最后两台经常丢帧。

3.7 实战案例:一个四目立体视觉系统

讲个实际项目吧。去年我帮客户做了一套四目立体视觉系统,用于工业零件尺寸测量。要求四台相机同步采集,帧率60fps,同步误差小于100μs。

我选了STM32F407作为主控,用定时器PWM输出50Hz的方波。经过74HC244驱动后,分成四路接到四台海康威视的工业相机。相机配置为上升沿触发,曝光时间5ms。

实测结果:四台相机的曝光起始时刻差异在±20μs以内,完全满足要求。整个BOM成本不到50块钱。

嗯,这里要注意一点:STM32的定时器时钟源要选内部高速时钟(HSI),不要用PLL倍频后的时钟,因为PLL的抖动会更大。

3.8 优缺点总结

最后,咱们客观地看看这个方案的优缺点:

优点 缺点
成本极低,MCU方案几十块钱搞定 需要额外硬件,增加PCB面积
精度可调,从微秒级到纳秒级都能做 线缆多了之后,信号完整性是个问题
不依赖网络,没有丢包风险 相机数量多了,GPIO不够用
实时性好,延迟固定可预测 调试时需要示波器看波形

说白了,GPIO触发同步是性价比最高的方案。如果你的项目对同步精度要求不是变态高(比如纳秒级),而且预算有限,那选这个方案准没错。

下一章咱们聊聊更高级的「PTP时钟同步」,那个精度更高,但复杂度也上了一个台阶。