2025-04-10 17:31:33 +08:00
..
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00
2025-04-10 17:31:33 +08:00

SensorHub

通过LDO供电需要配置对应的电压值默认为3.0v

IMU存在自校准问题导致开机数据不准异常输出多个任务同时执行的情况下影响自动校准

  • 需要注意超时和异常处理机制,在没有设备的情况下,看门狗会复位
MPU6500 GPIO PAD MuxAlt M2324 miniDKB
SDA GPIO14 29 ALT3
SCL GPIO15 30 ALT3
IRQ GPIO36 42 ALT0 LSP-SDO
  • IMU测试软件I2C读取异常

MPU-6500-Register

中断唤醒输出的高电平150ms,使用AGPIO作为唤醒目前在miniDKB上无法测试因为没有可用的AGPIOWAKE通道

Pad0 Wakeup 	                            2023-08-03 09:54:13.095
MPU_INIT	ID 0x70 , INT 0x43 , MOT 0x0 	2023-08-03 09:54:13.095
Enter_Hibernate	Enter Hibernate 	        2023-08-03 09:54:20.199

由于唤醒通道无法配置成中断管脚,所以后续需要将其配置成无中断的轮询模式,可以兼容更多模组

运动中断应用所涉及到的相关内部寄存器主要包括:

  • 中断使能寄存器INT_ENABLE 寄存器地址0x38为MPU6050所有中断输出的开关寄存器用于使能运动中断、FIFO溢出中断和数据中断等
  • FIFO控制寄存器USER_CTRL寄存器地址0x6A该寄存器用于使能FIFO并可控制MPU6050的I2C主机。应用运动中断功能时应关闭FIFO和I2C主机
  • FIFO使能寄存器FIFO_EN寄存器地址0x23该寄存器用于使能各个FIFO功能在应用运动中断功能时应关闭
  • 中断引脚配置寄存器INT_PIN_CFG寄存器地址0x37该寄存器用于设置INT中断引脚的电平标准和驱动方式推挽、开漏
  • 运动状态寄存器MOT_DETECT_STATUS寄存器地址0x61该寄存器用于在触发运动中断自由落体中断、加速度中断和静止中断时标示中断的类型。
  • 自由落体中断阈值寄存器FF_THR寄存器地址0x1D当使能自由落体中断时该寄存器的值决定中断的触发阈值数值越高对自由落体的检测越不灵敏
  • 自由落体中断时间寄存器FF_DUR寄存器地址0x1E当使能自由落体中断时该寄存器的值决定中断的持续时间阈值当自由落体的持续时间达到设定阈值时触发中断。数值越高对自由落体检测的时间阈值越长
  • 加速度中断阈值寄存器MOT_THR寄存器地址0x1F当使能加速度中断时该寄存器的值决定中断的触发阈值数值越高触发中断所需的加速度越大。
  • 加速度中断时间寄存器MOT_DUR寄存器地址0x20当使能加速度中断时该寄存器的值决定中断的持续时间阈值当加速度值持续时间达到设定阈值时触发中断。数值越高触发中断所需的加速度持续时间越长
  • 静止中断阈值寄存器ZRMOT_THR寄存器地址0x21当使能静止中断时若当前加速度计输出的三轴值均小于静止中断阈值则产生静止中断。数值越高触发静止中断的要求越宽松。
  • 静止中断时间寄存器ZRMOT_DUR寄存器地址0x22当使能静止中断时该寄存器的值决定触发静止中断所需的持续时间数值越高触发中断所需的静止持续时间越长。

在低功耗监控状态下,需要的配置包括:

  • INT_ENABLE 0x38 - 0xf0
  • USER_CTRL

//DMP使能=0x80,FIFI使能=0x40,辅助I2C总线主机使能=0x20,

MPU-IMU

想要高频率的获取数据就用MPU中断不需要使用时关闭中断等要数据时打开中断高频率获取数据再滤波。

编译器相关宏配置:

EMPL_TARGET_EC718 EMPL MPL_LOG_NDEBUG = 0/1 没有用官方python上位机的话设置为0 MPU6500 你使用的型号 USE_DMP 是否使用DMP REMOVE_LOGGING 是否使用日志

初始化步骤为:

  • 硬件初始化MPU初始化
  • MPL初始化MPL 库是 InvenSense Motion Apps 专有算法的核⼼,由 Mllite 和 mpl ⽬录组成。)
  • 设置MPL与DMP
  • 调用函数获取数据

注意DMP传感器融合仅适用于+ -2000dps和Accel + -2G的陀螺仪大部分情况下我们都需要使用DMP除非你需要很大的量程否则没有必要关闭DMP。

  • 支持 MPU9250/6500/6050 驱动和姿态解算
  • 通过中断输出数据,提供高频操作,通过定时读取,实现低功耗操作

MPU6500的FIFO缓存可以存储512个16位数据。其中可以同时存储三轴加速度计、三轴陀螺仪和三轴磁力计数据。

由于这些数据不是同时采集的因此实际上FIFO缓存的可用空间不是完全相同的。

在MPU6500芯片FIFO使用过程中需要注意以下几个方面

    1. 在读取FIFO数据之前要确保MPU6500芯片已经进入FIFO缓存模式并且已经配置好数据类型和采样频率。
    1. 在读取FIFO数据前要清除FIFO溢出标志。
    1. 在处理FIFO数据时要考虑到FIFO数据可能会因为溢出而丢失数据因此要使用合适的算法来处理数据丢失的情况。
    1. 为了避免FIFO数据被多次读取建议在读取完FIFO数据后立即清除FIFO缓存中的数据。

在2Hz的情况下存在大量噪声和误唤醒

Motion Driver 6.12

├── driver
    ├── eMPL
         ├── inv_mpu.c
         ├── inv_mpu_dmp_motion_driver.c
         ├── ...
    ├── include...
    └── vendor...
├── eMPL-hal...
├── mllite...
├── mpl...
└── README.md

文件放置路径在 subsys/sensorhub/mpu其中适配硬件接口适配依赖新增路径 mpu/driver/vendor其余路径皆是原文件和路径

相关库工程依赖 subsys/sensorhub/mpu/mpl/liblibmplmpu.a 需要根据实际芯片选择对应架构修改工程下Makefile导入预编译库

ifeq ($(SUBSYS_SENSORS_ENABLE),y)
PREBUILDLIBS += $(TOP)/PLAT/subsys/sensorhub/mpu/mpl/liblibmplmpu.a
endif

主要适配修改的借口包括 mpu/driver/eMPL/inv_mpu.c 和 mpu/driver/eMPL/inv_mpu_dmp_motion_driver.c中有宏定义以供移植相关定义在mpu/driver/vendor路径下

#define i2c_write       ec_i2c_send
#define i2c_read        ec_i2c_read
#define delay_ms        ec_delay
#define get_ms          ec_ticks

相关定义

传感器相关配置宏定义在subsys/sensorhub/Makefile.inc

SUBSYS_SENSORS_DIR  := $(TOP)/PLAT/subsys/sensorhub
CFLAGS += -DFEATURE_SUBSYS_SENSORHUB_ENABLE 
CFLAGS += -DMPU6500
CFLAGS += -DEMPL
CFLAGS += -DEMPL_TARGET_EC718
CFLAGS += -DUSE_DMP

CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/inc
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/driver/eMPL
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/driver/vendor
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/driver/include
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/mllite
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/mpl
CFLAGS_INC += -I $(SUBSYS_SENSORS_DIR)/mpu/eMPL-hal

SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/src 
SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/mpu/mpl
SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/mpu/mllite
SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/mpu/driver/eMPL 
SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/mpu/driver/vendor 
SENSORHUB_SRC_DIRS += $(SUBSYS_SENSORS_DIR)/mpu/eMPL-hal 

有三个函数是关于储存校准数据:

inv_error_t inv_get_mpl_state_size(size_t *size);
inv_error_t inv_load_mpl_states(const unsigned char *data, size_t len);
inv_error_t inv_save_mpl_states(unsigned char *data, size_t len);