文件版-百度网盘
Motion Driver 是一款传感器驱动层程序,其配置简单,利用了InvenSense的运动传感设备的片上数字移动处理器(DMP)的能力。Motion Driver 是嵌入式运动应用软件的一个子集,可以方便地移植到复杂的MCU架构。本文档介绍了运动驱动库的实际应用。部分教程为兼容TI的MSP430嵌入式处理器而写,因此,推荐事先熟悉MSP430架构。MSP430仅仅是作为举例平台。Motion Driver可以很容易地移植到任何MCU。
Motion Driver 由一套遵循ANSI标准C语言的API构成,这些API可用来配置与使用InvenSense 运动传感器的不同功能,包括DMP操作。本教程提供了一个样例工程,程序通过PC串口发送经加速度计和陀螺仪数据融合得到的四元数数据,上位机由python写就,可在屏幕上显示并旋转一个三维立方体。本驱动支持InvenSense的6轴和9轴设备。
本教程包含以下内容:
- 如何加载,配置,应用DMP功能
- MSP430的I2C驱动示例
- 陀螺仪和加速度计自测功能,基于硬件自测文档(自测的具体细节请参考产品寄存器文档)
- 加速度计校准及更新硬件寄存器
- 陀螺仪校准
- 配置低功耗加速度计运动中断
- 可以改变陀螺仪和加速度计的传感器输出数据速率(ODR)
- 可以选择FIFO中存储哪种数据
msp430_i2c_write
和 msp430_i2c_read
函数进行基本的数据读写, msp430_i2c_enable
和msp430_i2c_disable
函数用以控制MSP430F5528的I2C通讯的使能和失能。这些函数需要的形参有从地址、寄存器地址、长度和数据。在 msp430_i2c.c文件中有更多详细的信息。MPU的陀螺仪和加速度计自测特性允许用户测试陀螺仪和加速度计的机械和电子部分。当自测激活,板上电路将“激励”相应的传感器。此激励将移动陀螺仪的测试单元一定距离,等效于科里奥利力(地球自偏转);模拟外部力施加在加速度计上。测试结果改变传感器的输出,映射在输出信号上。输出信号通常用于与自测寄存器比较,观测“自测响应”。“自测相应”(STR)定义如下:
SelfTest Response=Sensor Output with SelfTest Enable- Sensor Output with Selftest Disabled
(STR自测响应=自测使能时传感器的输出-自测失能时传感器的输出)
此自测响应与工厂设定的自测响应值比较,用于判定该部分是否通过了自测:
Change from Factory Trim of the Self-Test Response(%)=(Str-FT)/FT
Motion Driver 提供了 int mpu_run_self_test(long* gyro, long* accel)
API,来执行陀螺仪和加速度计的自测。如果自测成功执行将返回0。从mpu_run_self_test
获得的陀螺仪值应根据陀螺仪敏感度设置做相应的比例转换。陀螺仪敏感度参数可通过调用mpu_get_gyro_sens(float* sens)
获得。按比例缩减陀螺仪和加速度计的16位有符号格式(Q16)的数据,存储最新获得的陀螺仪基准值。
执行加速度计自测用以确定加速度计功能正常,该功能通过在mpu_self_test()
函数中调用另一个函数accelerate_self_test(accel,accel_st)
实现。accel_st 参数参考标准加速度计基准值,该值可通过调用get_st_biases
从MPU寄存器中获得。
motion_driver_test.c 中有关于run_self_test
函数的更多细节。参考以下函数可获得更多信息:
- mpu_run_self_test
- get_st_biases
- accel_self_test
将板子放在平坦表面上,保持静止,加速度计校准将通过对照当前加速度值(如有必要)更新基准值。加速度计校准执行的函数为accel_self_test(accel,accel_st)
,该函数包含于inv_mpu.c。该函数检索MPU寄存器获得加速度计的基准偏差(函数调用 get_st_biases
返回基准偏差)和当前加速度计读取值,计算两值之差与 inv_mpu.c中test_s 结构体的一个实例所指定的最大、最小g值相比较。
const struct test_s test = {
.gyro_sens = 32768/250,
.accel_sens = 32768/16,
.reg_rate_div = 0, /* 1kHz. */
.reg_lpf = 1, /* 188Hz. */
.reg_mpu_fsr = 0, /* 250dps. */
.reg_accel_fsr = 0x18, /* 16g. */
.wait_ms = 50,
.packet_thresh = 5, /* 5% */
.min_dps = 10.f,
.max_dps = 105.f,
.max_gyro_var = 0.14f,
.min_g = 0.3f,
.max_g = 0.95f,
.max_accel_var = 0.14f};
调用mpu_set_accel_bias
函数,更新MPU硬件寄存器中的加速度计标准偏移量。注意:陀螺仪偏移量更新到DMP存储器,加速度计偏移量更新到硬件寄存器。参考mpu_set_accel_bias
获得更多细节。
DMP提供了一种基于设备不移动状态的方法来校准陀螺仪偏移量。此特性可通过选择DMP特性中的DMP_FEATURE_GYRO_CAL使能。当此特性使能,并且板子保持不移动超过8秒,陀螺仪将自动校准。
此段揭示了驱动中关于实现低功耗(LP)的加速度计中断模式的部分,可用于当无运动时休眠主进程直到检测到运动。函数
int mpu_lp_motion_interrupt (unsigned short thresh, unsigned char time, unsigned char lpa_freq)
配置LP 加速度中断模式的三个参数(在Embedded Motion Driver API文档中有进一步描述),包括阈值、时间和LPA频率。
在此模式下,设备将以固定的频率持续采样加速度计,直到检测到持续一段时间的高于阈值的信号。如果选择的时间周期比 Ipa_freq 定义的采样周期值小,LP加速度中断将在采集到高于阈值信号后的第一次采样时触发。参照产品规格文档(DS)的低功耗加速度中断章节可获得更多细节。
InvenSense MPU 提供了可编程的陀螺仪、加速度计数据输出速率范围(ODR)。该范围可通过写值到SMPLRT_DIV配置,陀螺仪的输出数据速率计算公式如下:
Sample Rate = Gyroscope Output Rate /(1+SMPLRT_DIV)
Motion Driver 提供了一个简单的方法配置陀螺仪的ODR——调用函数mpu_set_sample_rate
。不过,当DMP打开,陀螺仪就预设为200Hz采样率,并不需要调用mpu_set_sample_rate
。当DMP关闭,最大值可以设置为最高8Khz,取决于MPU设备特性。当DLPF失能(DLPF_CFG=0 or 7)最大陀螺仪输出速率为8Khz,当DLPF使能时为1Khz。最大加速度计输出速率为1Khz。当采样率高于1KHz时,加速度计的同一次采样数据可能会在FIFO、DMP和传感器寄存器中输出超过一次。
提供了片内FIFO来队列化传感器寄存器值,降低了MCU读取速率的需求。只有加速度计和陀螺仪传感器数据可以被推到FIFO缓冲区。每个轴陀螺仪数据可以存储在独立FIFO(如果需要的话)。加速度计输出只能用于同时保存所有三个轴值。Motion Driver提供了函数int mpu_configure_fifo(unsigned char sensors)
来配置FIFO缓冲区。sensor的值包括如下标志: INV_X_GYRO, INV_Y_GYRO, INV_Z_GYRO, INV_XYZ_GYRO, INV_XYZ_ACCEL.
motion-driver-client.py
32运行motion-driver-client.py 如果使用集成电子罗盘的InvenSense MPU-9150或者一个6轴MPU通过第二条I2C总线连接一个辅助的电子罗盘,motion driver 有能力从电子罗盘中拉取raw(偏航)数据。Motion driver 函数 mpu_set_sensors()
可以用来配置电子罗盘,同样也可以用 INV_XYZ_COMPASS宏定义。当其配置好后,用函数mpu_set_conpass_sample_rate()
设置电子罗盘采样率,最大100Hz。mpu_get_compass_reg()
功能将允许获得芯片层面的电子罗盘数据。
本节提供关于如何集成和校准电子罗盘一般性指导和参考,以实现9轴传感器融合。Motion Driver 源代码不包括或支持在本节点出的任何电子罗盘校准或融合参考。本节讨论的电子罗盘校准和集成参考自TI和MEMSense提供的应用笔记和源代码。
磁场强度测量受地磁场和当地铁磁材料的影响。考虑理想情况下,磁场沿着硬件组件磁力仪应该形成一个球体,原点应该在(0,0,0)。然而,只是不考虑外部磁场影响的情况。如果外部影响来自于预设的磁场,或者“硬铁”,将会导致球体的原点偏移(),这可以通过地磁场数据类似基准偏移量校准的操作来校准。“软铁”效应是由于材料弯曲和扭曲了当地磁场,这将导致角度精度误差。为得到正确的电子罗盘值,软铁影响也应消除。
以下链接解释了罗盘指南针校准和集成并给出了源代码。此应用笔记详细解释了硬件如何使用。
- http://www.memsense.com/docs/MTD-0802_1.2_Magnetometer_Calibration.pdf
- http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slaa518a&fileType=pdf
[1] Embedded Motion Driver V5.1.1 APIs Specification, Doc# SW-EMD-REL-5.1.1