如何快速展開 3D 光學 ToF 感測設計

作者:Stephen Evanczuk

資料提供者:DigiKey 北美編輯群

從工業感測到以手勢為主的使用者介面,光學飛時測距 (ToF) 在許多應用中發揮重要作用。透過準確且高速的多像素 ToF 感測器,開發人員就可實作更複雜的 3D 感測演算法,滿足這些應用的需求。但礙於多像素光學感測子系統的複雜性,開發時間會拉長。

本文將探討 ToF 的基本原理。接著會介紹 Broadcom 的光學 ToF 評估套件,開發人員能藉此迅速地針對準確的 1D 與 3D 測距應用製作原型,並且快速實作客製化的光學 ToF 感測解決方案。

光學 ToF 技術的基本原理

光學 ToF 技術能依據光穿越空氣所需的時間來進行測量,可在許多應用中取得準確的距離結果。專門用於執行這些測量的計算,通常仰賴兩種不同的方法:直接與間接 ToF。直接 ToF 也稱為脈衝測距,會使用一個裝置,使用方程式 1 測量 ToF 感測器傳送和接收到特定光脈衝之間的時間:

方程式 1 方程式 1

說明:

c0 = 真空光速

∆T = 傳送和接收之間經過的時間

雖然概念很簡單,但要能使用此作法達到準確的測量,還是有許多困難,包括必須使用夠強大的發射器和接收器、訊噪比增強,以及精確的脈衝邊緣偵測。

相較之下,間接 ToF 方法則採用調變連續波,並根據方程式 2 測量傳輸和接收訊號之間的相位差:

d = c0 / 2fmod x ∆φ/2π 方程式 2

說明:

c0 = 真空光速

fmod = 雷射調變頻率

∆φ = 判定的相位差

除了可降低發射器和接收器的功率需求外,間接 ToF 方法也可減輕對脈衝成形的要求,並簡化執行 3D 測距與動作偵測的設計複雜性。

無論是直接或間接方法,都需要仔細設計光學前端,並精確控制發射器和接收器的訊號。多年來,開發人員皆運用整合式光學 ToF 感測器,享受其在單一封裝內結合發射器與接收感測器的優勢。但就前幾代裝置的經驗,開發人員通常得犧牲某些效能或運作特性,例如功耗、範圍、準確度和速度。對於越來越多運作範圍長達 10 公尺的中程工業感測應用來說,此折衷情況已成了一大發展阻礙。

越來越多應用需要在中距離下取得高速準確的結果,同時又要維持最小的封裝尺寸及功耗,因此有越來越多先進的間接 ToF 感測器模組,就是專為此需求而特別設計,Broadcom 的 AFBR-S50MV85G 就是其中之一。Broadcom 也以此感測器為基礎,推出 AFBR-S50MV85G-EK 評估套件和相關的軟體開發套件 (SDK),提供多像素 ToF 感測器開發平台,讓開發人員迅速實作 3D ToF 感測應用。

整合式模組如何簡化 ToF 測距

AFBR-S50MV85G 模組專為工業感測應用開發,以單一封裝提供完整的光學 ToF 感測解決方案。其中的整合式元件包括用於紅外線 (IR) 照射的 850 nm 垂直共振腔面射型雷射 (VCSEL)、六角 32 像素感測器矩陣、VCSEL 和感測器光學元件用的整合式鏡片,以及特殊應用積體電路 (ASIC)。

發射器和感測矩陣固定對齊,會照亮目標物體,因此感測矩陣中的某些像素可偵測反射的 IR 訊號。在基本操作方面,由於模組內建環境光抑制功能,因此能支援白色、黑色、彩色、金屬或復歸反射式表面進行準確測距 (陽光直射亦然)。

與物體的距離逐漸縮小下,視差自動補償能力可在幾乎沒有距離下限的情況下進行測量。此外,IR 照射與感測矩陣的結合,還能提供物體的其他資訊,包括物體的動作、速度、傾斜角度或橫向對齊。因此,模組能提供必要的資料,藉此判定目標物通過或靠近時的方向與速度 (圖 1)。

從 Broadcom AFBR-S50MV85G 模組 8 x 4 像素感測矩陣取得的資料示意圖 (按此放大)圖 1:從 AFBR-S50MV85G 模組 8 x 4 像素感測矩陣取得的資料,能讓開發人員實作測量物體移動特性的 3D 應用。(圖片來源:Broadcom)

模組內建的 ASIC 能協調 VCSEL 和感測矩陣達到精準運作,藉此提供驅動 VCSEL 所需的所有電路、感測矩陣類比訊號擷取,以及數位訊號調整 (圖 2)。

Broadcom AFBR-S50MV85G 模組中的整合式 ASIC 圖片圖 2:AFBR-S50MV85G 模組中的整合式 ASIC 含有所有必要電路,可驅動模組的 VCSEL 光源、從感測矩陣取得接收的訊號,以及產生數位資料以透過 SPI 匯流排傳輸。(圖片來源:Broadcom)

ASIC 的整合式電源電路,能讓模組靠單一 5 V 電源運作,也更整合了經過原廠校準和溫度補償的電阻電容 (RC) 振盪器和數位鎖相迴路 (PLL),可提供所有必要的時脈訊號。透過這些整合,開發人員能利用微控制器單元 (MCU) 及一些額外的外部元件,輕鬆將模組整合到設計裡。MCU 的介接只需要一個通用輸入/輸出 (GPIO) 引腳,即可處理來自模組的資料就緒訊號,再搭配一條連接,接至模組的數位序列周邊裝置介面 (SPI) 即可 (圖 3)。

Broadcom 的 AFBR-S50MV85G 模組圖片 (按此放大)圖 3:Broadcom 的 AFBR-S50MV85G 模組只需要一個 MCU 和幾個附加元件,就能實作完整的 ToF 感測系統。(圖片來源:Broadcom)

測距所需的相關軟體功能,補強了這個簡單的硬體設計,且皆可在 Broadcom 的 ToF 驅動程式軟體中取得。模組會負責收集測距應用所需的光學資料,Broadcom 的 AFBR-S50 SDK 隨附的 ToF 驅動程式軟體,則負責執行所有硬體設定、校準及測量步驟。測量過程中,驅動程式軟體會萃取像素的距離和振幅值。

如何快速開發測距應用

Broadcom 的 AFBR-S50MV85G-EK 評估套件與 AFBR-S50 SDK 結合後,便可提供完善的平台,可針對測距應用快速製作原型與開發。此套件隨附一張配接板,內含 AFBR-S50MV85G 模組、Arm Cortex-M0+ MCU 架構的 NXP FRDM-KL46Z 評估板,以及用於將評估板組件連至筆記型電腦或其他嵌入式系統的 mini-USB 纜線 (圖 4)。

Broadcom 的 AFBR-S50MV85G-EK 評估套件圖片圖 4:Broadcom 的 AFBR-S50MV85G-EK 評估套件和相關軟體,為 ToF 測距應用的評估及原型開發提供完整的平台。(圖片來源:Broadcom)

只要幾個步驟就能開始使用評估套件進行 ToF 測距。下載 AFBR-S50 SDK 後,安裝精靈會引導開發人員進行快速安裝程序。開發人員啟動 SDK 套裝中隨附的 Broadcom AFBR-S50 Explorer 軟體應用程式後,軟體會透過 USB 介面連接到 AFBR-S50 評估板、透過 NXP 板 MCU 上執行的驅動程式軟體接收測量資料,即可讓使用者以 1D 或 3D 繪圖顯示結果 (圖 5)。

Broadcom 的 AFBR-S50 Explorer 軟體示意圖 (按此放大)圖 5:AFBR-S50 Explorer 軟體可透過 3D 繪圖簡化 ToF 測距的評估作業;3D 繪圖會針對 ToF 感測器矩陣中的每個像素,顯示接收到的光振幅。(圖片來源:Broadcom)

如圖 5 所示,3D 繪圖視圖可顯示每個像素的讀數,但軟體可提供另一種視圖,只會呈現視為有效測量的像素。在此替代視圖中,不符合預定條件的像素會從圖中剔除 (圖 6)。

Broadcom 的 AFBR-S50 Explorer 軟體示意圖 (按此放大)圖 6:透過 Broadcom 的 AFBR-S50 Explorer 軟體,開發人員能查看簡化的測量 3D 繪圖,剔除不符合預定條件的像素。(圖片來源:Broadcom)

若想在照明、反射性和表面類型等不同的應用情境中,探索測量的準確度和效能,開發人員可以檢視不同感測配置所造成的影響,例如針對增強型 3D 應用採用更多像素、針對需要精準測量的 1D 應用採用較少像素。在原型中評估完測量方法後,開發人員能以 Broadcom AFBR-S50 SDK 中的範例軟體作為基礎,快速實作客製化的 ToF 感測應用。

打造客製化的 ToF 感測軟體應用

Broadcom 採用以 AFBR-S50 核心函式庫為基礎的高效率架構提供 ToF 感測應用的支援;該函式庫中包含感測器硬體專用程式碼、應用程式開發介面 (API) 和硬體抽象層 (HAL) (圖 7)。

Broadcom 的 ToF 作業環境示意圖圖 7:在 Broadcom 的 ToF 作業環境中,ToF 驅動程式 API 提供使用者應用程式碼,藉此在預先編譯的 ToF 驅動程式核心函式庫中存取校準、測量與評估函數。(圖片來源:Broadcom)

Broadcom 在 AFBR-S50 SDK 套裝中提供的核心函式庫採用預先編譯的 ANSI-C 函式庫檔案型式,並在其中嵌入所有必要的資料和演算法,以運行 AFBR-S50MV85G 硬體。核心函式庫在測距系統的 MCU 上執行,可提供包含校準、測量與評估等功能,能以最小的處理負載或功耗進行測距。由於核心函式庫函數會處理所有涉及的細節,開發人員看到的基本測量週期相當簡單明瞭 (圖 8)。

Broadcom 的 AFBR-S50 SDK ToF 軟體示意圖 (按此放大)圖 8:AFBR-S50 SDK ToF 軟體使用中斷和回呼,將處理器的工作負載降到最低。(圖片來源:Broadcom)

在每個測量循環開始時 (由定期計時器中斷指令來啟動,即 IRQ),MCU 會啟動測量然後立即回到閒置狀態 (或繼續處理某些應用程式碼)。測量完畢後,AFBR-S50MV85G 模組會使用連接的 GPIO 線路發出中斷訊號,喚醒 MCU 在 SPI 匯流排上啟動資料讀出作業,然後回到先前的狀態。完成資料讀出後 (即 SPI 發出 IRQ),MCU 會執行程式碼以評估取得的 ToF 感測器資料。

為了避免測量資料遺失,核心函式庫會封鎖資料緩衝區,阻止進行新的測量循環,直到調用評估常式為止。有鑑於此,開發人員通常會針對原始資料加入雙緩衝區,以便交錯執行測量和評估任務。

對應用程式軟體開發人員來說,核心函式庫常式會遮蔽校準、測量和評估的細節。事實上,開發人員能將評估套件和 AFBR-S50 Explorer 應用程式當作完整的原型開發平台,將測量資料傳送至高階軟體應用程式碼。

對於需要實作客製化應用程式軟體的開發人員來說,AFBR-S50 SDK 套裝的優勢在於結合了預先編譯的核心函式庫模組以及數個軟體範例。因此,開發人員能依照 SDK 提供的範例應用,快速打造其專屬的 ToF 感測應用。開發人員能調用 AFBR-S50 SDK API 中的函數,並針對核心函式庫支援的各種回呼指定其專用的函數,藉此存取應用專屬軟體程式碼中的 AFBR-S50MV85G 硬體和 AFBR-S50 核心函式庫功能 (再次參見圖 7)。

Broadcom 提供許多有關 API 及範例軟體的說明文件,以便開發人員快速依據需求調整軟體範例,或從頭開發。事實上,基本測量和評估循環相當簡單,只需將自訂的函數和 API 調用,與測量循環匹配即可 (再次參見圖 8)。例如,先前討論的測量循環包含三個階段:ToF 裝置整合、資料讀出和評估。啟動這三個階段所需的核心函式庫 API 調用包括:

  • Argus_TriggerMeasurement() - 會以非同步方式觸發單一測量訊框
  • Argus_GetStatus() - 會在順利完成測量時回傳 STATUS_OK
  • Argus_EvaluateData() - 會評估原始測量資料中的有用資訊

Broadcom 在 SDK 發行版的範例應用中,展示此基本測量循環,如清單 1 所示。

複製
int main(void)
{
   status_t status = STATUS_OK;
   
   /* Initialize the platform hardware including the required peripherals
   * for the API. */
   hardware_init();
   
   /* The API module handle that contains all data definitions that is
   * required within the API module for the corresponding hardware device.
   * Every call to an API function requires the passing of a pointer to this
   * data structure. */
   argus_hnd_t * hnd = Argus_CreateHandle();
   handle_error(hnd ? STATUS_OK : ERROR_FAIL, "Argus_CreateHandle failed!");
   
   /* Initialize the API with default values.
   * This implicitly calls the initialization functions
   * of the underlying API modules.
   *
   * The second parameter is stored and passed to all function calls
   * to the S2PI module. This piece of information can be utilized in
   * order to determine the addressed SPI slave and enabled the usage
   * of multiple devices on a single SPI peripheral. */
   
   status = Argus_Init(hnd, SPI_SLAVE);
   handle_error(status, "Argus_Init failed!");
   
   /* Print some information about current API and connected device. */
   uint32_t value = Argus_GetAPIVersion();
   uint8_t a = (value >> 24) & 0xFFU;
   uint8_t b = (value >> 16) & 0xFFU;
   uint8_t c = value & 0xFFFFU;
   uint32_t id = Argus_GetChipID(hnd);
   argus_module_version_t mv = Argus_GetModuleVersion(hnd);
   print("\n##### AFBR-S50 API - Simple Example ##############\n"
   " API Version: v%d.%d.%d\n"
   " Chip ID: %d\n"
   " Module: %s\n"
   "##################################################\n",
   a, b, c, id,
   mv == AFBR_S50MV85G_V1 ? "AFBR-S50MV85G (v1)" :
   mv == AFBR_S50MV85G_V2 ? "AFBR-S50MV85G (v2)" :
   mv == AFBR_S50MV85G_V3 ? "AFBR-S50MV85G (v3)" :
   mv == AFBR_S50LV85D_V1 ? "AFBR-S50LV85D (v1)" :
   mv == AFBR_S50MV68B_V1 ? "AFBR-S50MV68B (v1)" :
   mv == AFBR_S50MV85I_V1 ? "AFBR-S50MV85I (v1)" :
   mv == AFBR_S50SV85K_V1 ? "AFBR-S50SV85K (v1)" :
   "unknown");
      
/* Adjust some configuration parameters by invoking the dedicated API methods. */
   status = Argus_SetConfigurationFrameTime( hnd, 100000 ); // 0.1 second = 10 Hz
   handle_error(status, "Argus_SetConfigurationFrameTime failed!");
   
   /* The program loop ... */
   for (;;)
   {
      myData = 0;
      /* Triggers a single measurement.
      * Note that due to the laser safety algorithms, the method might refuse
      * to restart a measurement when the appropriate time has not been elapsed
      * right now. The function returns with status #STATUS_ARGUS_POWERLIMIT and
      * the function must be called again later. Use the frame time configuration
      * in order to adjust the timing between two measurement frames. */
      Argus_TriggerMeasurement(hnd, measurement_ready_callback);
      handle_error(status, "Argus_StartMeasurementTimer failed!");
      STATUS_ARGUS_POWERLIMIT)
      {
         /* Not ready (due to laser safety) to restart the measurement yet.
         * Come back later. */
         continue;
      }
      else
      {
         /* Wait until measurement data is ready. */
      do
         {
            status = Argus_GetStatus(hnd);
         }
         while (status == STATUS_BUSY);
         handle_error(status, "Waiting for measurement data ready (Argus_GetStatus) failed!");
         /* The measurement data structure. */
         argus_results_t res;
         
         /* Evaluate the raw measurement results. */
         status = Argus_EvaluateData(hnd, &res, (void*) myData);
         handle_error(status, "Argus_EvaluateData failed!");
         
         /* Use the obtain results, e.g. print via UART. */
         print_results(&res);
         }
      }
}

清單 1:Broadcom 的 AFBR-S50 SDK 發行版的範例程式碼,展示了從 AFBR-S50MV85G 模組取得和評估 ToF 資料的基本設計模式。(原始程式碼:Broadcom)

如清單所示,前面提到的三個 API 函數調用,構成了執行測量循環的主幹。只要研究 SDK 中的 API 說明文件與其他範例應用,開發人員就可透過模組提供必要資料,來判定進階特性,例如目標物體的速度、方向和傾斜角度,如此便可迅速實作複雜的 3D 應用。

結論

光學 ToF 感測裝置可在需要精確測量的不同領域中促成多種應用,但礙於測量範圍、準確度或可靠度等限制,因此無法拓展到諸如工業感測系統等,需要採用低功耗裝置在更遠距離下提供準確結果的應用。Broadcom 的整合式光學 ToF 子系統,可滿足新一代感測應用的新要求。使用以此裝置為基礎的評估套件,開發人員就能快速實作系統,在 1D 測距應用中精準地測量,以及在 3D 應用中進行複雜的物體移動追蹤。

DigiKey logo

聲明:各作者及/或論壇參與者於本網站所發表之意見、理念和觀點,概不反映 DigiKey 的意見、理念和觀點,亦非 DigiKey 的正式原則。

關於作者

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk 撰寫電子產業的相關資訊已有超過二十年的經驗,涉及的主題多元,涵蓋硬體、軟體、系統以及包含 IoT 在內的應用。他以神經元網路為研究主題,取得神經科學博士學位,並且在航太產業,針對廣泛運用的安全系統和演算法加速方法進行研究。目前,在撰寫科技和工程文章之餘,他投入辨識和推薦系統的深度學習應用。

關於出版者

DigiKey 北美編輯群