越来越多的可穿戴设备和物联网规划将检测方向和盯梢运动的才能视为重要要求。虽然已经有各式各样的可用运动传感器,但工程师仍是不断遭到应战,探究以更低的功耗更快、更高效地集成这些设备,这在额定添加传感器时特别具有应战性。
为应对这些运动盯梢应战,规划人员需求集成度更高的加快计、陀螺仪和磁力仪五金件以及愈加高效且智能的数据交融算法。
本文将介绍 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 软件包,开发人员可以快速构建可以满意最低尺度和功耗要求的运动感应解决方案。