作者:Stephen Evanczuk
在从工业感测到基于手势的用户界面等各种应用中,光学飞行时间 (ToF) 距离测量扮演着重要角色。随着精确、高速多像素 ToF 传感器的出现,开发人员可以实现这些应用中需要的更复杂的三维 (3D) 感测算法。然而,由于多像素光学感测子系统相当复杂,开发时间会较长。
本文将讨论 ToF 的基本原理,然后介绍 Broadcom 的光学 ToF 评估套件,借助该套件,开发人员能够快速进行精确的 1D 和 3D 距离测量应用原型设计,并可快速实现定制的光学 ToF 感测解决方案。
光学 ToF 技术基础知识
光学 ToF 技术能够根据光在空气中传播所需的时间做出测量,被广泛用于多种应用以获得所需的精确距离。执行这些测量时,具体计算通常依赖于两种方法:直接和间接 ToF。在直接 ToF 法(也称作“脉冲测距”)中,设备利用公式 1 测量 ToF 传感器发射和接收特定光脉冲之间的间隔时间。
公式 1
其中:
c0 = 真空中的光速
∆T = 发射和接收的间隔时间
虽然概念很简单,但要用这种方法实现精确测量,还面临着许多挑战,包括需要足够强大的发射器和接收器、改善信噪比,以及精确的脉冲边缘检测。
相反,间接 ToF 法使用调制连续波,并根据公式 2 测量发射信号与接收信号之间的相位差:
公式 2
其中:
c0 = 真空中的光速
fmod = 激光调制频率
∆φ = 确定的相位差
除了降低发射器和接收器的功率要求外,间接 ToF 法放宽了对脉冲整形的要求,简化了执行 3D 测距和运动检测的设计复杂程度。
直接法和间接法都需要仔细设计光学前端,并精确控制发射器和接收器的信号。多年来,开发人员已经能够利用集成光学 ToF 传感器的优势,将发射装置和接收传感器组合在单一封装中。然而,这类设备的前几代通常要求开发人员在一些性能或操作特性(如功耗、量程、精度和速度)方面做出权衡。对于越来越多的工业感测应用,这种妥协已经成为主要障碍,因为这些应用需要在不超过 10 m 的中等距离内运行。
更先进的间接 ToF 传感器模块,如 Broadcom 的 AFBR-S50MV85G,则专门用于满足在中等距离范围内获得高速、准确的结果,同时保持最小封装尺寸和功耗这一日益增长的需求。基于这种传感器,Broadcom 的 AFBR-S50MV85G-EK 评估套件及相关软件开发套件 (SDK) 提供了一个多像素 ToF 传感器开发平台,使开发人员能够快速实现 3D ToF 感测应用。
集成模块如何简化 ToF 距离测量
AFBR-S50MV85G 模块专为工业感测应用而开发,在单一封装中提供了完整的光学 ToF 感测解决方案。其集成元器件包括一个用于发射红外光 (IR) 的 850 nm 垂直腔面发射激光器 (VCSEL)、一个 32 像素的六角形传感器矩阵、用于 VCSEL 和传感器光学器件的集成透镜,以及一个专用集成电路 (ASIC)。
发射器相对于感测矩阵以固定对齐的方式定位,照射目标物体,从而使感测矩阵中的一些像素检测到反射的红外信号。在基本操作中,这使该模块能够支持从白色、黑色、彩色、金属或反光表面进行精确的距离测量——即使在阳光直射下亦如此,这得益于其内置的环境光抑制功能。
随着与物体的距离减小,可对视差进行自动补偿,使得测量几乎没有距离下限。同时,红外照射与感测矩阵相结合,可以获得关于物体的更多信息,包括其运动、速度、倾斜角度或横向对齐。因此,该模块可以提供必要的数据,以确定经过或接近的目标物体的方向和速度(图 1)。
图 1:利用从 AFBR-S50MV85G 模块的 8×4 像素感测矩阵获得的数据,开发人员可以实现能够测量物体运动特性的 3D 应用。(图片来源:Broadcom)
该模块的内置 ASIC 协调其 VCSEL 和感测矩阵的精确运行,提供驱动 VCSEL、从感测矩阵捕获模拟信号以及进行数字信号调节所需的全部电路(图 2)。
图 2:AFBR-S50MV85G 模块中集成的 ASIC 包括驱动该模块的 VCSEL 光源、获取来自感测矩阵的接收信号以及生成通过 SPI 总线传输的数字数据所需的全部电路。(图片来源:Broadcom)
该 ASIC 集成了电源电路,使该模块能够在单一的 5 伏电源下运行,而其集成的经出厂校准和温度补偿的电阻电容 (RC) 振荡器和数字锁相环 (PLL) 则提供了所有需要的时钟信号。由于这种集成,开发人员可以使用微控制器单元 (MCU) 和一些附加的外部元器件,轻松地将该模块纳入他们的设计。与 MCU 的接口只需要一个通用输入/输出 (GPIO) 引脚,用于接收来自模块的数据就绪信号,以及一个通过模块的数字串行外设接口 (SPI) 实现的连接(图 3)。
图 3:Broadcom 的 AFBR-S50MV85G 模块只需要一个 MCU 和一些附加元器件即可实现完整的 ToF 感测系统。(图片来源:Broadcom)
作为对这种简单的硬件设计的补充,Broadcom 的 ToF 驱动软件提供了实现距离测量所需的所有相关软件功能。当该模块处理距离测量应用的光学数据收集时,该公司提供的 AFBR-S50 SDK 中包含的 Broadcom ToF 驱动软件会执行所有硬件配置、校准和测量步骤。在测量过程中,驱动软件同时提取像素的距离和振幅值。
如何快速开发距离测量应用
Broadcom 的 AFBR-S50MV85G-EK 评估套件与 AFBR-S50 SDK 相结合,提供了适用于快速开发距离测量应用原型的综合平台。该套件附带一块包含 AFBR-S50MV85G 模块的适配器板,NXP 基于 ArmCortex-M0+ MCU 的 FRDM-KL46Z 评估板,以及一条用于将评估板组件连接到笔记本电脑或其他嵌入式系统的迷你 USB 电缆(图 4)。
图 4:Broadcom 的 AFBR-S50MV85G-EK 评估套件及相关软件提供了适用于 ToF 距离测量应用评估和原型开发的综合平台。(图片来源:Broadcom)
使用评估套件进行 ToF 距离测量只需几个步骤即可开始。下载 AFBR-S50 SDK 后,安装向导会引导开发人员完成快速安装程序。开发人员启动 SDK 包中包含的 Broadcom AFBR-S50 Explorer 软件应用程序后,该软件通过 USB 接口连接到 AFBR-S50 评估板,通过在 NXP 板的 MCU 上运行的驱动软件接收测量数据,并允许用户以 1D 或 3D 曲线图显示结果(图 5)。
图 5:AFBR-S50 Explorer 软件通过 3D 曲线图显示 ToF 传感器矩阵中每个像素接收到的照射光振幅,简化了 ToF 测量的评估。(图片来源:Broadcom)
如图 5 所示,3D 曲线图显示了每个像素的读数,但软件还提供了另一种视图,允许开发人员仅查看被视为有效的测量像素。在此替代视图中,不符合定义标准的像素将从曲线图中删除(图 6)。
图 6:借助 Broadcom 的 AFBR-S50 Explorer 软件,开发人员可以查看精简的 3D 测量曲线图,删掉不符合预定标准的像素。(图片来源:Broadcom)
为了解不同应用场景的测量精度和性能,如照明、反射率和表面类型,开发人员可以查看不同感测配置的影响,例如对于增强型 3D 应用使用更多的像素;或对于需要更精确测量的 1D 应用使用更少的像素。在其原型中评估测量方法后,开发人员可以在 Broadcom 的 AFBR-S50 SDK 中包含的样例软件的基础上,快速实现定制化 ToF 感测应用。
构建定制化 ToF 感测软件应用
Broadcom 围绕基于 AFBR-S50 核心库的高效架构建立了对 ToF 感测应用的支持,该核心库包括传感器硬件专用代码、应用编程接口 (API) 和硬件抽象层 (HAL)(图 7)。
图 7:在 Broadcom 的 ToF 工作环境中,ToF 驱动程序 API 提供的用户应用代码可访问预编译 ToF 驱动程序核心库中的校准、测量和评估功能。(图片来源:Broadcom)
作为 AFBR-S50 SDK 软件包的一部分,Broadcom 将核心库作为预编译的 ANSI-C 库文件提供,其中嵌入了运行 AFBR-S50MV85G 硬件所需的全部数据和算法。核心库在距离测量系统的 MCU 上运行,具有校准、测量和评估等功能,能以最小的处理负荷或功耗进行距离测量。由于核心库函数会处理所有的底层细节,开发人员看到的基本测量周期非常简单(图 8)。
图 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(" ##### AFBR-S50 API - Simple Example ############## "
" API Version: v%d.%d.%d "
" Chip ID: %d "
" Module: %s "
"################################################## ",
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 应用中快速实现复杂物体运动跟踪系统。