3、硬件触发同步:硬件触发原理、GPIO与PWM触发、外部触发信号设计
聊到多摄像头同步,软件方案再花哨,到了工业现场往往还是得靠硬件触发。为什么?因为软件那条路,说白了是「尽力而为」——你没法保证每个摄像头都在同一纳秒开始曝光。而硬件触发,是直接把同步信号用导线送过去,物理层面保证一致性。
我个人习惯,只要项目预算允许、布线条件不苛刻,首选就是硬件触发。今天咱们就把它掰开揉碎了讲清楚。
3.1 硬件触发原理:一根线如何让所有相机「齐步走」
硬件触发的核心思想很简单:用一个外部电信号,同时告诉所有摄像头「开始干活」。这个信号通常是上升沿或下降沿,摄像头检测到边沿后,立即启动曝光。
你想想看,电信号在导线里的传播速度接近光速。就算线长一米,延迟也就几纳秒。对于绝大多数视觉应用来说,这已经足够「同时」了。
关键点:硬件触发不是「让相机自己对齐」,而是「外部强制对齐」。同步精度取决于信号传播延迟和相机响应延迟,而不是软件调度抖动。
我在项目中遇到过一种情况:用同一个触发源驱动4个相机,结果发现其中一台总是慢半拍。排查了半天,原来是那台相机的触发输入引脚内部有RC滤波,引入了额外延迟。嗯,这里要注意——不同型号的相机,触发响应延迟可能不一样。
3.2 GPIO触发:最直接、最灵活的方式
GPIO触发,就是用主控芯片(比如STM32、FPGA、Jetson)的通用输入输出引脚,直接输出一个脉冲信号。每个脉冲对应一帧图像。
我建议初学者先从GPIO触发入手。原因很简单:可控性极强。你可以精确控制脉冲的宽度、间隔、数量,甚至可以在程序里动态调整。
下面是一个典型的GPIO触发代码片段(以STM32 HAL库为例):
// 配置触发引脚为推挽输出
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
// 产生一个10us宽度的触发脉冲
void TriggerOneFrame(void) {
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
delay_us(10); // 脉冲宽度10微秒
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
}
这里有个坑:脉冲宽度不能太短。我曾经遇到过一款工业相机,触发脉冲要求至少50微秒。你给10微秒,它直接忽略。所以,一定要查你所用相机的datasheet,确认最小触发脉宽。
警告:GPIO触发虽然灵活,但主控芯片的GPIO输出抖动(jitter)通常在几十纳秒到几微秒之间。如果要求亚微秒级同步精度,GPIO可能不够用。
3.3 PWM触发:适合固定帧率的场景
PWM触发,本质上是GPIO触发的一种特例——用PWM模块产生固定频率的方波,每个周期上升沿触发一次曝光。
为什么单独拿出来讲?因为PWM触发在「固定帧率多相机同步」场景下特别好用。比如你要做30fps的同步采集,直接用PWM输出30Hz的方波,所有相机接同一个信号,省心省力。
我个人习惯,在以下情况优先用PWM触发:
- 帧率固定不变,不需要动态调整
- 需要长时间稳定运行(PWM由硬件定时器产生,不占用CPU)
- 主控芯片的GPIO资源紧张
PWM触发还有一个隐藏优势:占空比可以用来控制曝光时间。有些相机支持「脉宽调制曝光模式」,即触发脉冲的高电平宽度直接决定曝光时长。这时候,你只需要调整PWM的占空比,就能同时控制所有相机的曝光时间。
我曾经在一个产线项目中用过这个技巧。当时需要根据物料颜色动态调整曝光时间,我直接改了PWM的占空比,所有相机同步调整,效果非常好。
3.4 外部触发信号设计:从信号源到相机的完整链路
前面讲的都是「怎么产生触发信号」。但信号从产生到送达相机,中间还有不少门道。这部分我踩过的坑最多,咱们重点说说。
3.4.1 信号电平匹配
不同相机的触发输入电平标准不一样。常见的有:
| 电平标准 | 高电平范围 | 低电平范围 | 常见场景 |
|---|---|---|---|
| 3.3V TTL | 2.0V - 3.6V | 0V - 0.8V | 多数工业相机、嵌入式平台 |
| 5V TTL | 2.4V - 5.5V | 0V - 0.8V | 老式相机、PLC输出 |
| RS-422/485 | 差分信号 | 差分信号 | 长距离传输(>10米) |
| 光耦隔离输入 | 取决于光耦型号 | 取决于光耦型号 | 高噪声环境 |
切记:不要直接用3.3V的GPIO去驱动5V输入的相机。我见过有人这么干,结果相机触发不稳定,偶尔漏帧。加个电平转换芯片,成本几毛钱,能省很多麻烦。
3.4.2 信号完整性
触发信号在长距离传输时,容易受到干扰。尤其是电机、变频器这些大噪声源附近。我建议:
- 使用双绞线或屏蔽线传输触发信号
- 信号线远离动力线,至少保持10cm以上距离
- 终端并联一个小电容(比如100pF),滤除高频噪声
- 如果距离超过5米,考虑用差分信号(RS-422)传输
小技巧:在触发信号线上串联一个100Ω电阻,靠近信号源端。这能抑制信号反射,改善波形质量。我几乎所有项目都会加这个电阻,成本几乎为零,效果立竿见影。
3.4.3 多相机扇出
一个触发源要驱动多个相机,怎么接?
最简单的做法是「并联」——把所有相机的触发输入接到同一个信号线上。但要注意:每个相机的输入引脚都有一定的输入电容,并联多了,总电容变大,信号边沿会变缓。
我建议:
- 4个相机以内,直接并联,问题不大
- 4-8个相机,加一个缓冲器(比如74HC244)做扇出
- 8个以上,用专用的触发分配器,或者用FPGA做多路复制
我曾经在一个项目里接了12个相机,直接并联,结果最后一个相机的触发信号上升沿从10ns变成了200ns。虽然也能触发,但触发时刻的抖动明显增大。后来加了缓冲器,问题解决。
3.5 实战建议:如何设计一套可靠的硬件触发系统
说了这么多,最后给一套我自己的设计流程:
- 确定同步精度需求:是微秒级还是毫秒级?这决定了你用GPIO还是专用硬件。
- 选择触发源:固定帧率用PWM,动态控制用GPIO,超高精度用FPGA。
- 设计信号链路:考虑电平匹配、传输距离、噪声环境。
- 验证触发响应:用示波器同时测量触发信号和相机曝光输出(很多相机有Strobe输出),确认延迟和抖动。
- 留有余量:触发脉宽、信号幅度都留20%以上的余量,别卡着极限值设计。
核心原则:硬件触发同步的精度,取决于「最差的那条链路」。别只盯着主控的触发输出,要检查每一台相机的实际响应时刻。用示波器量一量,比什么理论分析都管用。
好了,硬件触发同步这部分就聊到这儿。下一章咱们讲软件同步方案——那又是另一番天地了。