浅析可穿戴设备和物联网设计的运动跟踪解决方案

越来越多的可穿戴设备和物联网设计将检测方向和跟踪运动的能力视为重要要求。尽管已经有各种各样的可用运动传感器,但工程师还是不断受到挑战,探索以更低的功耗更快、更高效地集成这些设备,这在额外增加传感器时尤其具有挑战性。

为应对这些运动跟踪挑战,设计人员需要集成度更高的加速计、陀螺仪和磁力仪五金件以及更加高效且智能的数据融合算法。

本文将介绍TDKInvenSense提供的同时为硬件和软件提供帮助的解决方案。然后,本文还将介绍设计人员如何着手将该解决方案应用于简化需要复杂的运动感应功能的复杂低功耗多传感器应用的开发。

高效运动跟踪的挑战

利用传统的运动跟踪方法,开发人员可以同时为硬件和软件处理重要的集成问题。在硬件方面,开发人员通常会努力在采用单独的传感器(包括加速计、陀螺仪和磁力仪)构建的设计中最大限度减少其复杂性、尺寸和零件的数量。软件工程师则需要特别注意同步各种各样的传感器输出,以创建高级运动跟踪应用中所用传感器融合算法所需的统一数据流。对于硬件和软件开发人员而言,需要在设计中集成额外传感器类型的应用面临的挑战均显著增加。

但是,使用TDKInvenSenseICM-20948,开发人员便能够以最少的工作量快速实现运动跟踪设计或其他多传感器系统。

运动跟踪解决方案

TDKInvenSenseICM-20948是一种多芯片模块,尺寸只有3mmx3mmx1mm,它集成了提供完整运动跟踪解决方案所需的整套传感器、信号链、数据处理和接 口电路(图1)。

图1:TDKInvenSenseICM-20948通过其专用的信号链、可编程滤波器、接口电路和数字运动处理器执行运动跟踪

该模块在全面工作模式下仅需要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结合了小封装、系统集成功能及主机独立操作等特点,特别适合在移动设备、可穿戴设备和物联网设计中使用。模块的高水平集成意味着,开发人员仅使用三个电容器便可以执行典型的运动跟踪设计。按照TDKInvenSense使用陶瓷X7R零件的建议,开发人员将在模块的REGOUT引脚上增加一个0.1μF电容器进行稳压器滤波,并在其VDD和VDDIO引脚上增加一个该电容器用于电源旁通(图2)。

图2:设计人员可以将TDKInvenSenseICM-20948轻松添加到基于MCU的设计中,从而通过SPI(此处所示)或I2C接口连接到MCU,后者使用相同的配置,但引脚22(nCS)与VDDIO相关联

虽然ICM-20948为运动跟踪设计提供了近乎直接替代型的解决方案,但很多应用还是对其他传感器类型提出了要求。为帮助开发人员简化这些多传感器设计,ICM-20948为其他外部传感器提供单独的I2C接口和内置支持。开发人员在此将兼容I2C的智能传感器连接到模块的专用辅助I2C端口(图3)。

图3:在SPI(或I2C)与主机MCU连接的同时,开发人员可以使用TDKInvenSenseICM-20948模块的辅助I2C接口(AUX_CL和AUX_DA)连接外部传感器,并通过ICM-20948的辅助设备专用寄存器管理它们

在正常操作中,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提出了相对简单的接口要求,但希望评估运动跟踪解决方案的开发人员甚至可以避免该水平的硬件原型开发。TDKInvenSense的DK-20948评估板和参考设计提供现成的开发平台,其结合了主机MCU、嵌入式调试器、USB接口和用于增加其他传感器的多个连接器、无线连接和其他功能(图4)。

图4:TDKInvenSenseDK-20948板提供一种完整的运动感应设计,其结合了ICM-20948模块与MicrochipTechnologyATSAMG55J19BMCU(左侧中间)和基于MicrochipAT32UC3A4256MCU(位于板的后侧)的嵌入式调试器

DK-20948板基于MicrochipTechnologyATSAMG55J19BMCU,使用ICM-20948提供完整的运动传感器设计。同时,该板包括一个提供嵌入式调试功能的MicrochipAT32UC3A4256MCU,从而在与主机ATSAMG55MCU结合使用时消除对外部工具的需求。开发人员可以使用该板评估ICM-20948,在此过程中,无需进一步的硬件工作或者其他定制或可用子板来扩展其功能。开发人员完成其ICM-20948评估后,可以使用套件的示意图、详细的BOM和板设计文件创建定制设计。

对于软件工程师而言,DK-20948套件同样包括用于快速评估和定制开发的选项。对于评估,公司基于MotionLinkGUI的工具可使开发人员探索不同的配置设置及评估它们对所产生运动数据的影响。然而,对于大多数开发人员来说,套件的软件开发包将很快成为他们的主要关注点。

定制软件

对于定制软件开发,TDKInvenSenseeMD(嵌入式运动驱动器)SmartMotion软件包提供应用编程接口(API)说明文档、驱动源代码、传感器融合文库以及预建的DMP固件图像。同时,该软件包还包括构建和闪现定制固件图像的工具以及与评估板进行控制台交互的命令行实用程序。

eMD软件平台设计用于与Atmel/MicrochipTechnologyAtmelStudio配合使用,包含两个AtmelStudio包:内核和应用。内核包包含编程和操作ICM-20948所需的底层驱动器和固件,以及DK-20948板的MicrochipATSAMG55J19B主机MCU的预建运动算法和math文件。

应用包包含一个样例应用程序,用于演示内核包的使用,包括从顶层应用向下延伸到串行总线交易的主要设计模式。例如,主要的C例程展示开发人员如何初始化ICM-20948和获取数据(列表1)。

intmain(void)

{/*Initializeicm20948serifstructure*/

structinv_icm20948_serificm20948_serif;

icm20948_serif.context=0;/*noneed*/

icm20948_serif.read_reg=idd_io_hal_read_reg;

icm20948_serif.write_reg=idd_io_hal_write_reg;

icm20948_serif.max_read=1024*16;/*maxnumbytesallowedperserialread*/

icm20948_serif.max_write=1024*16;/*maxnumbytesallowedperserialwrite*/

icm20948_serif.is_spi=interface_is_SPI();

*Setuptheicm20948device*/

icm20948_sensor_setup();

/*

*NowthatIcm20948devicewasinitialized,proceedwithDMPimageloading

*ThisstepismandatoryasDMPimagearenotstoreinnonvolatilememory

*/

load_dmp3();

/*

*InitializeDynamicprotocolstuff

*/

DynProTransportUart_init(transport,iddwrapper_transport_event_cb,0);

DynProtocol_init(protocol,iddwrapper_protocol_event_cb,0);

/*

*InitializesthedefaultsensorODRinordertoproperlyinitthealgorithms

*/

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();

}

}

return0;

}

列表1:开发人员可以检查DK-20948eMDSmartMotion软件包中提供的示例源代码,以了解主要设计模式,如示例应用的main.c例程中此代码片段所列的ICM-20948初始化和传感器轮询模式。(代码来源:TDKInvenSense)

编程ICM-20948等高度集成的设备时,开发人员很容易发现自己不仅要应付设备的很多配置选项,还要应付高效操作设备所需的大量软件组件。eMD内核包通过一系列的抽象(包括软件结构和服务层)消除了该复杂性。例如,关键软件结构inv_icm20948收集了操作ICM-20948所需的所有数据和元数据,包括其串行接口定义(列表2)。

/**@briefICM20948serialinterface

*/

structinv_icm20948_serif{

void*context;

int(*read_reg)(void*context,uint8_treg,uint8_t*buf,uint32_tlen);

int(*write_reg)(void*context,uint8_treg,constuint8_t*buf,uint32_tlen);

uint32_tmax_read;

uint32_tmax_write;

inv_bool_tis_spi;

};

列表2:为帮助降低软件复杂性,DK-20948eMDSmartMotion软件内核例程提供很多C语言结构,这就是其中一个例子,该示例定义ICM-20948串行接口的设置及I2C或SPI交易所需的适当底层读取和写入例程的指示器。(代码来源:TDKInvenSense)

在实例化eMD结构及初始化设备本身之后,开发人员可以调用单个例程inv_icm20948_poll_sensor(),以使用inv_icm20948结构实例读取传感器和通过DMP处理数据。这份记录齐全的例程有900多行,为开发人员详细演示了操作传感器、管理FIFO和利用DMP的核心功能的使用。

有兴趣从更基础的层面了解ICM-20948操作的开发人员可以转向底层内核例程,如设备自测试Icm20948SelfTest.c模块中使用的例程。在此模块中,intinv_do_test_accelgyro等例程显示了控制设备的典型寄存器操作(列表3)。

staticintinv_do_test_accelgyro(structinv_icm20948*s,enumINV_SENSORSsensorType,int*meanValue,int*stMeanValue)

{

//SetSelf-TestBit

if(sensorType==INV_SENSOR_GYRO)

{

//EnablegyroscopeSelf-TestbysettingregisterUserBank2,RegisterAddress02(02h)Bit[5:3]tob111

result=inv_icm20948_write_single_mems_reg(s,REG_GYRO_CONFIG_2,BIT_GYRO_CTENSELFTEST_GYRO_AVGCFG);

}else

{

result=inv_icm20948_write_single_mems_reg(s,REG_ACCEL_CONFIG_2,BIT_ACCEL_CTENSELFTEST_ACCEL_DEC3_CFG);

}

...

}

列表3:开发人员可以在DK-20948eMDSmartMotion软件包中发现演示ICM-20948在多个抽象层面使用的例程,包括Icm20948SelfTest.c模块此代码片段中显示的寄存器级访问。(代码来源:TDKInvenSense)

在列表3中,(相对)高级的inv_icm20948_write_single_mems_reg()函数会调用低级例程inv_icm20948_write_reg(),从而传递给常见的inv_icm20948结构实例。该调用会向下传达到低层,最终到达实际执行寄存器写入操作的例程中。为执行此操作,该最终低级函数使用软件初始化期间加载到inv_icm20948_serif串行接口结构实例中的寄存器写入例程指示器,如前面的列表2所示。这种分层方法对于帮助最大限度降低软件复杂性和最大限度提高性能是必不可少的。

对于开发人员,eMDSmartMotion架构提供一个在一组一致的关键预定义结构上构建的灵活框架。使用eMD软件包,开发人员可以在高水平上工作,从而使用抽象快速执行应用。同时,开发人员可以轻松跳入低层以执行定制功能,而不会失去与更高级软件的一致性。eMDSmartMotion软件包和DK-20948开发板一起使用,可以提供全面的平台来快速开发运动感应应用。

总结

TDKInvenSenseICM-20948模块为运动感应提供了完全集成的解决方案。使用相关的DK-20948开发套件和eMDSmartMotion软件包,开发人员可以快速构建能够满足最低尺寸和功耗要求的运动感应解决方案。

猜你喜欢