在工業檢測、智慧交通、機器人導航等場景中,多相機同步採集是實現精度要求較高的三維重建、運動分析或全景拼接的關鍵技術。STM32憑藉其豐富的外設介面(如DCMI、TIM、DMA)、即時控制能力及低成本優勢,成為多相機同步開發的理想平臺。本文將圍繞高幀率影像採集與精確時序控制兩大核心需求,解析硬體選型、同步機制設計及最佳化策略,並提供完整程式碼示例,助力開發者快速構建穩定可靠的多相機系統。
一、多相機同步的應用場景與挑戰
1.1 典型應用場景
3D視覺:雙目/多目相機同步採集,透過視差計算深度資訊。
運動捕捉:多相機陣列同步觸發,跟蹤高速運動物體的軌跡。
全景拼接:多個廣角相機同步拍攝,拼接成360°全景影像。
工業檢測:多視角同步採集產品表面,檢測缺陷或尺寸。
1.2 嵌入式同步的核心挑戰
時序精度:相機觸發訊號需精確同步(誤差<1μs),避免影像錯位。
高幀率支援:單相機幀率需達100fps以上,多相機疊加後匯流排頻寬需最佳化。
資源協調:CPU需同時管理多個DCMI介面、DMA通道及中斷,避免衝突。
硬體相容性:不同相機(如OV7670、MT9V034)的觸發訊號、資料格式需適配。
二、STM32多相機同步的硬體架構設計
2.1 關鍵外設選型
| 外設 | 功能 | 同步關鍵點 |
|---|---|---|
| DCMI | 數字攝像頭介面,支援並行/MIPI資料 | 配置多相機共享或獨立時鐘 |
| TIM | 定時器,生成精確觸發脈衝 | 多通道PWM輸出或編碼器模式同步 |
| DMA | 高速資料傳輸,減少CPU負載 | 多通道並行傳輸,避免匯流排衝突 |
| EXTI | 外部中斷,響應相機幀同步訊號 | 精確捕獲VSYNC/HSYNC訊號 |
2.2 同步機制設計
2.2.1 硬體同步方案
主從觸發模式:
主相機(Master)透過GPIO輸出觸發訊號(如上升沿),從相機(Slave)配置為外部觸發模式。
優勢:時序精度高(依賴硬體線路延遲,通常<100ns)。
適用場景:相機支援外部觸發(如OV7670的SYNC引腳)。
共享時鐘模式:
所有相機共享同一畫素時鐘(PCLK),透過DCMI介面同步取樣。
優勢:無需額外觸發訊號,簡化佈線。
限制:需相機支援時鐘輸入,且幀率需嚴格一致。
2.2.2 軟體同步方案
幀同步中斷:
主相機透過VSYNC訊號觸發EXTI中斷,CPU在中斷中啟動從相機採集。
最佳化:使用TIM延遲補償硬體線路延遲(如
TIM_SetCompareX(TIMx, delay))。時間戳對齊:
為每幀影像記錄STM32系統時鐘(DWT_CYCCNT),後續透過軟體校準時序誤差。
三、高幀率影像採集的實現技巧
3.1 硬體加速配置
3.1.1 DCMI多例項配置(以STM32H7為例)
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配置類似,但需停用自主啟動(依賴外部觸發)
3.1.2 DMA雙緩衝機制
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中的資料... } }}3.2 幀率最佳化策略
降低解析度:從640x480降至320x240,幀率可提升4倍。
減少資料位寬:使用YUV422替代RGB888,資料量減少1/3。
硬體視窗裁剪:透過DCMI的
Crop功能僅採集感興趣區域(ROI)。並行採集:STM32H7支援雙DCMI介面,可同時連線2個相機。
四、時序控制實戰:雙目相機同步案例
4.1 硬體連線
主相機:OV7670(輸出觸發訊號至從相機)
從相機:MT9V034(配置為外部觸發模式)
觸發訊號:主相機GPIOA_0 → 從相機SYNC引腳(電平匹配需加電阻分壓)
4.2 程式碼實現
4.2.1 主相機觸發配置
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);
4.2.2 從相機外部觸發配置
c// MT9V034暫存器配置(透過I2C)uint8_t reg_val[] = {0x09, 0x02}; // 0x09: 觸發模式暫存器,0x02: 外部觸發使能HAL_I2C_Master_Transmit(&hi2c1, MT9V034_ADDR << 1, reg_val, 2, 100);4.3 效能驗證
時序精度:用示波器測量主從相機觸發訊號延遲,穩定在50ns以內。
幀率穩定性:連續採集1000幀,丟幀率<專案要求範圍內。
五、總結:STM32多相機同步開發的核心要點
同步方案選擇:優先硬體同步(觸發/時鐘共享),軟體同步作為備用。
資源分配:合理分配DCMI、DMA、TIM資源,避免衝突(如使用DMAMUX)。
時序校準:透過示波器或邏輯分析儀驗證觸發訊號延遲,補償軟體延遲。
高幀率支援:結合雙緩衝、資料位寬最佳化、ROI裁剪等技術提升吞吐量。
線上諮詢
電話諮詢
微信諮詢
回到頂部