在工业检测、智能交通、机器人导航等场景中,多相机同步采集是实现高精度三维重建、运动分析或全景拼接的关键技术。STM32凭借其丰富的外设接口(如DCMI、TIM、DMA)、实时控制能力及低成本优势,成为多相机同步开发的理想平台。本文将围绕高帧率图像采集与精确时序控制两大核心需求,解析硬件选型、同步机制设计及优化策略,并提供完整代码示例,助力开发者快速构建稳定可靠的多相机系统。
3D视觉:双目/多目相机同步采集,通过视差计算深度信息。
运动捕捉:多相机阵列同步触发,跟踪高速运动物体的轨迹。
全景拼接:多个广角相机同步拍摄,拼接成360°全景图像。
工业检测:多视角同步采集产品表面,检测缺陷或尺寸。
时序精度:相机触发信号需精确同步(误差<1μs),避免图像错位。
高帧率支持:单相机帧率需达100fps以上,多相机叠加后总线带宽需优化。
资源协调:CPU需同时管理多个DCMI接口、DMA通道及中断,避免冲突。
硬件兼容性:不同相机(如OV7670、MT9V034)的触发信号、数据格式需适配。
| 外设 | 功能 | 同步关键点 |
|---|---|---|
| DCMI | 数字摄像头接口,支持并行/MIPI数据 | 配置多相机共享或独立时钟 |
| TIM | 定时器,生成精确触发脉冲 | 多通道PWM输出或编码器模式同步 |
| DMA | 高速数据传输,减少CPU负载 | 多通道并行传输,避免总线冲突 |
| EXTI | 外部中断,响应相机帧同步信号 | 精确捕获VSYNC/HSYNC信号 |
主从触发模式:
主相机(Master)通过GPIO输出触发信号(如上升沿),从相机(Slave)配置为外部触发模式。
优势:时序精度高(依赖硬件线路延迟,通常<100ns)。
适用场景:相机支持外部触发(如OV7670的SYNC引脚)。
共享时钟模式:
所有相机共享同一像素时钟(PCLK),通过DCMI接口同步采样。
优势:无需额外触发信号,简化布线。
限制:需相机支持时钟输入,且帧率需严格一致。
帧同步中断:
主相机通过VSYNC信号触发EXTI中断,CPU在中断中启动从相机采集。
优化:使用TIM延迟补偿硬件线路延迟(如TIM_SetCompareX(TIMx, delay))。
时间戳对齐:
为每帧图像记录STM32系统时钟(DWT_CYCCNT),后续通过软件校准时序误差。
c// 初始化主相机DCMIDCMI_HandleTypeDef hdcmi_master;hdcmi_master.Instance = DCMI;hdcmi_master.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // 硬件同步hdcmi_master.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // 像素时钟上升沿采样hdcmi_master.Init.VSPolarity = DCMI_VSPOLARITY_HIGH; // 帧同步高电平有效hdcmi_master.Init.HSPolarity = DCMI_HSPOLARITY_HIGH; // 行同步高电平有效hdcmi_master.Init.CaptureRate = DCMI_CR_ALL_FRAME; // 捕获所有帧HAL_DCMI_Init(&hdcmi_master);// 从相机DCMI配置类似,但需禁用自主启动(依赖外部触发)
c// 定义双缓冲uint8_t frame_buf1[640*480*2]; // RGB565格式,2字节/像素uint8_t frame_buf2[640*480*2];// 启动DMA传输(循环模式)HAL_DCMI_Start_DMA(&hdcmi_master, DCMI_MODE_CONTINUOUS, (uint32_t)frame_buf1, 640*480*2);// 在DMA半传输中断中切换缓冲区void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { if (hdcmi->Instance == DCMI) { static uint8_t buf_idx = 0; buf_idx ^= 1; if (buf_idx == 0) { HAL_DCMI_Suspend(&hdcmi_master); // 暂停当前传输 HAL_DCMI_Start_DMA(&hdcmi_master, DCMI_MODE_CONTINUOUS, (uint32_t)frame_buf2, 640*480*2); HAL_DCMI_Resume(&hdcmi_master); // 处理frame_buf1中的数据... } else { // 处理frame_buf2中的数据... } }}降低分辨率:从640x480降至320x240,帧率可提升4倍。
减少数据位宽:使用YUV422替代RGB888,数据量减少1/3。
硬件窗口裁剪:通过DCMI的Crop功能仅采集感兴趣区域(ROI)。
并行采集:STM32H7支持双DCMI接口,可同时连接2个相机。
主相机:OV7670(输出触发信号至从相机)
从相机:MT9V034(配置为外部触发模式)
触发信号:主相机GPIOA_0 → 从相机SYNC引脚(电平匹配需加电阻分压)
c// 配置TIM生成周期性触发脉冲(100Hz)TIM_HandleTypeDef htim_trigger;htim_trigger.Instance = TIM2;htim_trigger.Init.Prescaler = 84-1; // 84MHz/84 = 1MHzhtim_trigger.Init.Period = 10000-1; // 1MHz/10000 = 100Hzhtim_trigger.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&htim_trigger);// 配置PWM通道1(GPIOA_0)TIM_OC_InitTypeDef sConfigOC;sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 10; // 脉冲宽度10μs(高电平触发)sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;HAL_TIM_PWM_ConfigChannel(&htim_trigger, &sConfigOC, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim_trigger, TIM_CHANNEL_1);
c// MT9V034寄存器配置(通过I2C)uint8_t reg_val[] = {0x09, 0x02}; // 0x09: 触发模式寄存器,0x02: 外部触发使能HAL_I2C_Master_Transmit(&hi2c1, MT9V034_ADDR << 1, reg_val, 2, 100);时序精度:用示波器测量主从相机触发信号延迟,稳定在50ns以内。
帧率稳定性:连续采集1000帧,丢帧率<0.1%。
同步方案选择:优先硬件同步(触发/时钟共享),软件同步作为备用。
资源分配:合理分配DCMI、DMA、TIM资源,避免冲突(如使用DMAMUX)。
时序校准:通过示波器或逻辑分析仪验证触发信号延迟,补偿软件延迟。
高帧率保障:结合双缓冲、数据位宽优化、ROI裁剪等技术提升吞吐量。