越来越多的可穿戴设备和物联网设计将检测方向和跟踪运动的能力视为重要要求。尽管已经有各种各样的可用运动传感器,但工程师还是不断受到挑战,探索以更低的功耗更快、更高效地集成这些设备,这在额外增加传感器时尤其具有挑战性。
为应对这些运动跟踪挑战,设计人员需要集成度更高的加速计、陀螺仪和磁力仪五金件以及更加高效且智能的数据融合算法。
本文将介绍 TDK InvenSense 提供的同时为硬件和软件提供帮助的解决方案。然后,本文还将介绍设计人员如何着手将该解决方案应用于简化需要复杂的运动感应功能的复杂低功耗多传感器应用的开发。
高效运动跟踪的挑战
利用传统的运动跟踪方法,开发人员可以同时为硬件和软件处理重要的集成问题。在硬件方面,开发人员通常会努力在采用单独的传感器(包括加速计、陀螺仪和磁力仪)构建的设计中最大限度减少其复杂性、尺寸和零件的数量。软件工程师则需要特别注意同步各种各样的传感器输出,以创建高级运动跟踪应用中所用传感器融合算法所需的统一数据流。对于硬件和软件开发人员而言,需要在设计中集成额外传感器类型的应用面临的挑战均显著增加。
但是,使用 TDK InvenSense ICM-20948,开发人员便能够以最少的工作量快速实现运动跟踪设计或其他多传感器系统。
运动跟踪解决方案
TDK InvenSense ICM-20948 是一种多芯片模块,尺寸只有 3 mm x 3 mm x 1 mm,它集成了提供完整运动跟踪解决方案所需的整套传感器、信号链、数据处理和接口电路(图 1)。
图 1: TDK InvenSense ICM-20948 通过其专用的信号链、可编程滤波器、接口电路和数字运动处理器执行运动跟踪。(图片来源: TDK InvenSense)
该模块在全面工作模式下仅需要 3 毫安 (mA) 左右便能实现其全部功能。对于功率受限的应用,开发人员可以关闭模块的某些部分,从而将完全休眠模式下各阶段的电流消耗降低至 8 微安 (μA)。产生的功耗取决于工作电压 (VDD),根据设计要求,该电压值可以介于 1.71 伏特和 3.6 伏特。
单独的信号链集成在模块中,为集成的 3 轴加速计、3 轴陀螺仪和 3 轴磁力仪以及集成的温度传感器的每个通道提供支持。每个信号链都包括缓冲放大器和一个专用的 16 位模数转换器 (ADC),以及特定于传感器的电路,如驱动模块的霍尔效应磁力仪的电流源。
为了提高每种信号链的输出,模块包括适用于每种进一步传感器类型的信号调节阶段。例如,磁力仪输出通过算术电路进行基本信号处理,而其他传感器的输出各自馈入自动的传感器特定调节阶段,以执行采样平均等处理功能。开发人员可以将 ICM-20948 设置为平均多达 128 个陀螺仪数据采样,或者将加速计设置为平均多达 32 个采样。最终,每个通道的信号调节阶段的输出馈入一组专用的传感器寄存器中。
ICM-20948 的核心是一个专有的数字运动处理器 (DMP),用于提供各种不同的功能,包括执行运动处理算法、校准和自测试。在正常工作期间,DMP 会处理来自专用传感器寄存器的数据。然后再将结果存储在模块的集成式 FIFO 中,供主机 MCU 通过共享的 I2C 或 SPI 总线访问。
DMP 和 FIFO 的功能为很多实际应用提供重要功能。很多情况下,应用以相对较慢的速度更新其运动跟踪结果,甚至允许其主机处理器在更新之间休眠,以降低总功耗。然而,运动跟踪算法需要的更新速度明显更高,以确保其在应用请求更新时以最低的延时提供精确的数据。DMP 能够在不需要主机参与的情况下维持高更新速度,这有助于确保准确性,而不会对主机应用本身的性能或功耗强加额外的要求。
简单的集成
ICM-20948 结合了小封装、系统集成功能及主机独立操作等特点,特别适合在移动设备、可穿戴设备和物联网设计中使用。模块的高水平集成意味着,开发人员仅使用三个电容器便可以执行典型的运动跟踪设计。按照 TDK InvenSense 使用陶瓷 X7R 零件的建议,开发人员将在模块的 REGOUT 引脚上增加一个 0.1 μF 电容器进行稳压器滤波,并在其 VDD 和 VDDIO 引脚上增加一个该电容器用于电源旁通(图 2)。
图 2: 设计人员可以将 TDK InvenSense ICM-20948 轻松添加到基于 MCU 的设计中,从而通过 SPI(此处所示)或 I2C 接口连接到 MCU,后者使用相同的配置,但引脚 22 (nCS) 与 VDDIO 相关联。(图片来源: TDK InvenSense)
虽然 ICM-20948 为运动跟踪设计提供了近乎直接替代型的解决方案,但很多应用还是对其他传感器类型提出了要求。为帮助开发人员简化这些多传感器设计,ICM-20948 为其他外部传感器提供单独的 I2C 接口和内置支持。开发人员在此将兼容 I2C 的智能传感器连接到模块的专用辅助 I2C 端口(图 3)。
图 3: 在 SPI(或 I2C)与主机 MCU 连接的同时,开发人员可以使用 TDK InvenSense ICM-20948 模块的辅助 I2C 接口(AUX_CL 和 AUX_DA)连接外部传感器,并通过 ICM-20948 的辅助设备专用寄存器管理它们。(图片来源: TDK InvenSense)
在正常操作中,ICM-20948 将充当 I2C 总线控制器,以与外部传感器通信。在此模式下,开发人员可编程一组专用的模块寄存器,以定义外部设备的 I2C 地址、输出数据地址以及其他的传输参数。用此信息,模块可以将外部传感器数据读入其 FIFO 和外部设备数据寄存器中,从而在传感器 I2C 总线上使用单字节或多字节读取,而不会涉及到主机 MCU。
ICM-20948 提供专门设计用于协调 ICM-20948 与外部传感器之间时间的一项额外功能。除了使用模块的专用中断 INT 引脚之外,开发人员还可以使用外部传感器的中断或同步脉冲驱动模块的 FSYNC 引脚。例如,在图像稳定应用中,开发人员可以使用图像传感器的帧同步输出来将图像数据与 ICM-20948 传感器读数同步。使用模块的 FSYNC_CONFIG 寄存器,开发人员甚至可以将模块配置为测量外部传感器 FSYNC 事件与 ICM-20948 数据事件之间的时间,从而在图像和运动数据间提供更密集的同步。
但是,作为专用的运动跟踪设备,ICM-20948 缺乏使用一般由主机 MCU 处理的那种设备特定设置操作来配置外部传感器所需的功能。为简化系统初始化过程,该模块提供一种直通模式,以使用集成的接口旁通多路复用器将主机系统处理器直接连接到外部传感器上。
在直通模式下,该设备使用其集成的模拟开关将辅助 I2C 引脚 AUX_CL(引脚 7)和 AUX_DA(引脚 21)直接以电气方式连接到主机 I2C 总线(引脚 23 和 24)。该工作模式提供一种简单的方法,以允许主机处理器处理与每个外部传感器相关的任何配置和设置要求。初始化后,开发人员禁用旁通多路复用器,以允许 ICM-20948 接管正常操作时的外部传感器访问。
快速开发
尽管 ICM-20948 提出了相对简单的接口要求,但希望评估运动跟踪解决方案的开发人员甚至可以避免该水平的硬件原型开发。TDK InvenSense 的 DK-20948 评估板和参考设计提供现成的开发平台,其结合了主机 MCU、嵌入式调试器、USB 接口和用于增加其他传感器的多个连接器、无线连接和其他功能(图 4)。
图 4: TDK InvenSense DK-20948 板提供一种完整的运动感应设计,其结合了 ICM-20948 模块与 Microchip Technology ATSAMG55J19B MCU(左侧中间)和基于 Microchip AT32UC3A4256 MCU(位于板的后侧)的嵌入式调试器。(图片来源: TDK InvenSense)
DK-20948 板基于 Microchip Technology ATSAMG55J19B MCU,使用 ICM-20948 提供完整的运动传感器设计。同时,该板包括一个提供嵌入式调试功能的 Microchip AT32UC3A4256 MCU,从而在与主机 ATSAMG55 MCU 结合使用时消除对外部工具的需求。开发人员可以使用该板评估 ICM-20948,在此过程中,无需进一步的硬件工作或者其他定制或可用子板来扩展其功能。开发人员完成其 ICM-20948 评估后,可以使用套件的示意图、详细的 BOM 和板设计文件创建定制设计。
对于软件工程师而言,DK-20948 套件同样包括用于快速评估和定制开发的选项。对于评估,公司基于 MoTIonLink GUI 的工具可使开发人员探索不同的配置设置及评估它们对所产生运动数据的影响。然而,对于大多数开发人员来说,套件的软件开发包将很快成为他们的主要关注点。
定制软件
对于定制软件开发,TDK InvenSense eMD(嵌入式运动驱动器)SmartMoTIon 软件包提供应用编程接口 (API) 说明文档、驱动源代码、传感器融合文库以及预建的 DMP 固件图像。同时,该软件包还包括构建和闪现定制固件图像的工具以及与评估板进行控制台交互的命令行实用程序。
eMD 软件平台设计用于与 Atmel/Microchip Technology Atmel Studio 配合使用,包含两个 Atmel Studio 包:内核和应用。内核包包含编程和操作 ICM-20948 所需的底层驱动器和固件,以及 DK-20948 板的 Microchip ATSAMG55J19B 主机 MCU 的预建运动算法和 math 文件。
应用包包含一个样例应用程序,用于演示内核包的使用,包括从顶层应用向下延伸到串行总线交易的主要设计模式。例如,主要的 C 例程展示开发人员如何初始化 ICM-20948 和获取数据(列表 1)。
int main (void)
{
?? ...
??
?? ?/* IniTIalize icm20948 serif structure */
?? struct inv_icm20948_serif icm20948_serif;
?? icm20948_serif.context?? = 0; /* no need */
?? icm20948_serif.read_reg? = idd_io_hal_read_reg;
?? icm20948_serif.write_reg = idd_io_hal_write_reg;
?? icm20948_serif.max_read? = 1024*16; /* max num bytes allowed per serial read */
?? icm20948_serif.max_write = 1024*16; /* max num bytes allowed per serial write */
?
?? icm20948_serif.is_spi??? = interface_is_SPI();
?
?? ...
??
?? ?* Setup the icm20948 device */
?? icm20948_sensor_setup();
?
?? /*
?? ?* Now that Icm20948 device was iniTIalized, proceed with DMP image loading
?? ?* This step is mandatory as DMP image are not store in non volatile memory
?? ?*/
?
?? load_dmp3();
?
?? /*
?? ?* Initialize Dynamic protocol stuff
?? ?*/
?? DynProTransportUart_init(&transport, iddwrapper_transport_event_cb, 0);
?? DynProtocol_init(&protocol, iddwrapper_protocol_event_cb, 0);
?
?? /*
?? ?* Initializes the default sensor ODR in order to properly init the algorithms
?? ?*/
?? sensor_configure_odr(period_us);
?
?? InvScheduler_init(&scheduler);
?
?? ...
??
?? while (1) {
????? InvScheduler_dispatchTasks(&scheduler);
?
????? if (irq_from_device == 1) {
???????? inv_icm20948_poll_sensor(&icm_device, (void *)0, build_sensor_event_data);
?
???????? __disable_irq();
???????? irq_from_device = 0;
???????? __enable_irq();
????? }
?? }
?
?? return 0;
}
列表 1: 开发人员可以检查 DK-20948 eMD SmartMotion 软件包中提供的示例源代码,以了解主要设计模式,如示例应用的 main.c
例程中此代码片段所列的 ICM-20948 初始化和传感器轮询模式。(代码来源: TDK InvenSense)
编程 ICM-20948 等高度集成的设备时,开发人员很容易发现自己不仅要应付设备的很多配置选项,还要应付高效操作设备所需的大量软件组件。eMD 内核包通过一系列的抽象(包括软件结构和服务层)消除了该复杂性。例如,关键软件结构 inv_icm20948
收集了操作 ICM-20948 所需的所有数据和元数据,包括其串行接口定义(列表 2)。
/** @brief ICM20948 serial interface
?*/
struct inv_icm20948_serif {
?????? void *???? context;
?????? int????? (*read_reg)(void * context, uint8_t reg, uint8_t * buf, uint32_t len);
?????? int????? (*write_reg)(void * context, uint8_t reg, const uint8_t * buf, uint32_t len);
?????? uint32_t?? max_read;
?????? uint32_t?? max_write;
?????? inv_bool_t is_spi;
};
列表 2: 为帮助降低软件复杂性,DK-20948 eMD SmartMotion 软件内核例程提供很多 C 语言结构,这就是其中一个例子,该示例定义 ICM-20948 串行接口的设置及 I2C 或 SPI 交易所需的适当底层读取和写入例程的指示器。(代码来源: TDK InvenSense)
在实例化 eMD 结构及初始化设备本身之后,开发人员可以调用单个例程 inv_icm20948_poll_sensor()
,以使用 inv_icm20948
结构实例读取传感器和通过 DMP 处理数据。这份记录齐全的例程有 900 多行,为开发人员详细演示了操作传感器、管理 FIFO 和利用 DMP 的核心功能的使用。
有兴趣从更基础的层面了解 ICM-20948 操作的开发人员可以转向底层内核例程,如设备自测试 Icm20948SelfTest.c
模块中使用的例程。在此模块中,int inv_do_test_accelgyro
等例程显示了控制设备的典型寄存器操作(列表 3)。
static int inv_do_test_accelgyro(struct inv_icm20948 * s, enum INV_SENSORS sensorType, int *meanValue, int *stMeanValue)
{
?? ...
?
??? // Set Self-Test Bit
??? if (sensorType == INV_SENSOR_GYRO)
??? {
??????? // Enable gyroscope Self-Test by setting register User Bank 2, Register Address 02 (02h) Bit [5:3] to b111
??????? result = inv_icm20948_write_single_mems_reg(s, REG_GYRO_CONFIG_2, BIT_GYRO_CTEN | SELFTEST_GYRO_AVGCFG);
??? } else
??? {
??????? result = inv_icm20948_write_single_mems_reg(s, REG_ACCEL_CONFIG_2, BIT_ACCEL_CTEN | SELFTEST_ACCEL_DEC3_CFG);
??? }
?
?? ...
}
列表 3: 开发人员可以在 DK-20948 eMD SmartMotion 软件包中发现演示 ICM-20948 在多个抽象层面使用的例程,包括 Icm20948SelfTest.c
模块此代码片段中显示的寄存器级访问。(代码来源: TDK InvenSense)
在列表 3 中,(相对)高级的 inv_icm20948_write_single_mems_reg()
函数会调用低级例程 inv_icm20948_write_reg()
,从而传递给常见的 inv_icm20948
结构实例。该调用会向下传达到低层,最终到达实际执行寄存器写入操作的例程中。为执行此操作,该最终低级函数使用软件初始化期间加载到 inv_icm20948_serif
串行接口结构实例中的寄存器写入例程指示器,如前面的列表 2 所示。这种分层方法对于帮助最大限度降低软件复杂性和最大限度提高性能是必不可少的。
对于开发人员,eMD SmartMotion 架构提供一个在一组一致的关键预定义结构上构建的灵活框架。使用 eMD 软件包,开发人员可以在高水平上工作,从而使用抽象快速执行应用。同时,开发人员可以轻松跳入低层以执行定制功能,而不会失去与更高级软件的一致性。eMD SmartMotion 软件包和 DK-20948 开发板一起使用,可以提供全面的平台来快速开发运动感应应用。
总结
TDK InvenSense ICM-20948 模块为运动感应提供了完全集成的解决方案。使用相关的 DK-20948 开发套件和 eMD SmartMotion 软件包,开发人员可以快速构建能够满足最低尺寸和功耗要求的运动感应解决方案。