3、硬件触发方案设计:GPIO触发模式、PWM触发模式、外部信号源触发

硬件触发,说白了就是给两个相机一个“齐步走”的口令。这个口令必须足够精准,才能保证左右眼看到的画面是同一时刻的。我这些年调试过的双目系统,十有八九的同步问题都出在触发信号上。今天咱们就把三种最常用的硬件触发方案掰开揉碎了讲清楚。

3.1 GPIO触发模式:最直接的“拍肩膀”

GPIO触发,就是用一个高低电平的变化来告诉相机:“现在,拍!” 这是最基础、也最常用的方式。

工作原理:主控芯片(比如STM32、FPGA)拉高一个GPIO引脚,相机检测到上升沿(或下降沿),立即开始曝光。就这么简单。

关键参数

  • 触发电平:3.3V 或 5V,取决于相机IO口耐受电压。我习惯用3.3V,兼容性更好。
  • 脉冲宽度:一般要求大于相机的最小触发脉宽(查手册,通常是50μs~1ms)。
  • 响应延迟:从GPIO拉高到相机开始曝光,中间有几十纳秒到几微秒的延迟。这个延迟在双目标定中会被标定掉,但抖动(jitter)才是杀手。

核心要点:GPIO触发模式下,两个相机的触发信号必须来自同一个GPIO引脚,或者两个引脚由同一个时钟源驱动。否则,两个信号的相位差会随时间漂移。

我在项目中遇到过一个问题:用两个独立的定时器分别控制左右相机的GPIO,结果发现画面总是有1~2行的错位。查了半天,原来是两个定时器的时钟源不同,导致触发时刻有微小偏差。后来改成同一个定时器的两个通道输出,问题就解决了。

3.2 PWM触发模式:连续稳定的“节拍器”

如果你需要相机以固定帧率连续工作,比如30fps或60fps,那PWM触发模式就派上用场了。它本质上就是一个周期性的方波信号。

为什么用PWM?

  • GPIO模式需要软件不断去拉高拉低,CPU负担重。
  • PWM由硬件定时器自动产生,CPU只需要配置一次,之后完全不用管。
  • PWM的占空比可以控制曝光时间(如果相机支持)。

配置示例(以STM32为例)

// 假设目标帧率30fps,周期33.33ms,高电平脉宽1ms
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 84-1;      // 84MHz / 84 = 1MHz
htim2.Init.Period = 33333-1;      // 1MHz / 33333 ≈ 30Hz
HAL_TIM_PWM_Init(&htim2);

TIM_OC_InitTypeDef sConfigOC;
sConfigOC.Pulse = 1000;           // 高电平1000μs = 1ms
sConfigOC.OCMode = TIM_OCMODE_PWM1;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

个人经验:PWM频率不要设得太高。我曾经为了追求低延迟,把帧率设到120fps,结果相机曝光时间太短,画面暗得没法看。后来才明白,帧率要跟光照条件和相机灵敏度匹配。

避坑指南:PWM信号的上升沿抖动通常很小(纳秒级),但如果你用RC滤波电路去整形,反而会引入额外的延迟和抖动。我曾经这么干过,结果同步精度从纳秒级掉到了微秒级。嗯,后来我再也不在触发信号上加滤波了。

3.3 外部信号源触发:最灵活的“外挂”

有时候,主控芯片的GPIO或PWM不够用,或者你需要更精确的时序控制。这时候,外部信号源(比如信号发生器、FPGA、专用时钟芯片)就是最佳选择。

典型场景

  • 需要亚微秒级的同步精度(比如高速运动物体的三维重建)。
  • 主控芯片的定时器资源不够,或者精度达不到要求。
  • 需要多个相机(3个以上)严格同步,且触发信号需要长距离传输。

信号发生器怎么用?

  1. 设置输出波形:方波,频率=目标帧率。
  2. 设置幅值:3.3V或5V,匹配相机IO电平。
  3. 设置占空比:一般50%即可,但要注意高电平时间要大于相机最小触发脉宽。
  4. 用BNC线或SMA线连接到两个相机的触发输入口。

重要提醒:外部信号源的地线必须与相机的地线共地!否则信号会飘,严重时可能烧坏相机IO口。我见过有人用信号发生器直接接相机,没共地,结果相机触发口冒烟了。

FPGA方案:如果你手头有FPGA,那是最好的外部信号源。FPGA可以产生任意频率、任意占空比的信号,而且多个输出通道之间的延迟可以精确控制到皮秒级。我习惯用FPGA内部的PLL产生一个基准时钟,然后用计数器分频出触发信号,这样所有通道的相位差可以做到完全一致。

3.4 三种方案对比

方案 精度 灵活性 CPU占用 适用场景
GPIO触发 微秒级 高(需软件控制) 低速、非连续采集
PWM触发 微秒级 低(硬件自动) 固定帧率连续采集
外部信号源 纳秒~皮秒级 最高 高精度、多相机同步

3.5 核心知识体系

下面这张图,是我自己总结的硬件触发方案选择逻辑。你想想看,做双目同步,第一步就是搞清楚你的精度需求和应用场景。

硬件触发方案选择逻辑 触发需求 精度要求高? 连续采集? 外部信号源 GPIO触发 PWM触发 GPIO触发 选择建议 • 高精度(纳秒级)+ 多相机 → 外部信号源(FPGA/信号发生器) • 固定帧率 + 低CPU占用 → PWM触发 • 非连续采集 + 简单实现 → GPIO触发

我的习惯:做原型验证时,先用GPIO触发,简单粗暴。等系统稳定了,再根据实际需求换成PWM或外部信号源。这样前期调试快,后期性能也有保障。

好了,三种硬件触发方案就讲到这里。记住一句话:触发信号的精度,决定了双目同步的上限。不管你用哪种方案,信号路径越短、干扰越少、时钟越统一,效果就越好。


公众号:蓝海资料掘金营,微信deep3321