|
BMI085是系统级封装惯性测量单元,可提供精确的加速度和角速率测量。由于采用了系统级封装方法(两个传感器位于单个封装中),因此陀螺仪和加速度数据是以非同步方式获取的。但是,加速度计和陀螺仪之间的同步很容易实现。本文档介绍了如何在典型应用(例如增强现实或虚拟现实)中实现加速度计和陀螺仪之间的同步。
为了在BMI085上实现数据同步,需要将来自BMI085陀螺仪的数据就绪中断信号连接到BMI085加速度计的中断引脚之一(可以将其配置为输入引脚)。考虑到传感器的群时延,加速度计的内部信号处理单元使用来自陀螺仪的数据就绪信号来同步(synchronize)和内插(Interpolate)加速度计的数据。然后,加速度计部分可以将可用数据通知主机。使用此技术,可以实现同步数据并以2 kHz的ODR提供加速度计数据。
注意:数据同步是为需要高带宽的应用程序而设计的,而BMI085旨在用于此应用程序,但它也可与BMI088一起使用。然而,对于某些应用,具有非常低的带宽,并且对于加速度计和陀螺仪具有不同的带宽设置。这时,同步功能没有意义。
概念 同步数据意味着陀螺仪和加速度计数据的采集是同时发生的,并且信号具有相同的传播时间(propagation time)。从运动到寄存器读出之间的时间取决于主要由信号滤波路径引起的物理传播时间。加速度计和陀螺仪数据之间到公共时间点和公共组延迟之间的同步可以使用以下各节中描述的方法来实现。
BMI085的硬件中断引脚(INT1 / INT3)用于数据同步,必须将其连接。中断引脚INT2可用于BMI085将数据就绪通知给主机。
技术实现 数据同步功能需要PCB上的传感器的物理中断引脚连接以及BMI085的特殊配置。要求和步骤如下所述。
连接图
对于对延迟至关重要的多传感器应用,建议使用SPI接口以最快的速度读取传感器数据(建议SPI时钟频率> 2MHz)。
配置BMI085进行数据同步 包含bmi08x头文件 包含bmi085变量的头文件 在bmi08x_defs.h中启用以下宏以使用BMI085传感器功能 - /** \name enable bmi085 sensor */
- #ifndef BMI08X_ENABLE_BMI085
- #define BMI08X_ENABLE_BMI085 1
- #endif
复制代码要初始化BMI085进行数据同步,应创建bmi08x结构体的实例。用户需要在结构体中更新以下参数: 参数 | 描述 | | accel_id | I2C接口的设备地址(如果intf是BMI08X_I2C_INTF) | | gyro_id | I2C接口的设备地址(如果intf为BMI08X_I2C_INTF) | | intf | I2C或SPI | | read | 通过I2C / SPI接口进行读取的函数指针 | | write | 通过I2C / SPI接口进行写入的函数指针 | | delay_ms | 延时函数指针 |
通过SPI接口初始化 以下示例代码是简化代码,未添加返回值检查,以使其更易于阅读。 - struct bmi08x_dev bmi08xdev = {
- .accel_id = 0,
- .gyro_id = 0,
- .intf = BMI08X_SPI_INTF,
- .read = user_spi_read,
- .write = user_spi_write,
- .delay_ms = user_delay_milli_sec
- };
- int16_t rslt;
- /* Initialize bmi085 sensors (accel & gyro)*/
- rslt = bmi085_init(&bmi08xdev);
- /* Reset the accelerometer and wait for 1 ms - delay taken care inside the function */
- rslt = bmi08a_soft_reset(&bmi08xdev);
- /*! Max read/write length (maximum supported length is 32).
- To be set by the user */
- bmi08xdev.read_write_len = 32;
- /*set accel power mode */
- bmi08xdev.accel_cfg.power = BMI08X_ACCEL_PM_ACTIVE;
- rslt = bmi08a_set_power_mode(&bmi08xdev);
- bmi08xdev.gyro_cfg.power = BMI08X_GYRO_PM_NORMAL;
- bmi08g_set_power_mode(&bmi08xdev);
- /* API uploads the bmi08x config file onto the device and wait for 150ms
- to enable the data synchronization - delay taken care inside the function */
- rslt = bmi085_apply_config_file(&bmi08xdev);
- /*assign accel range setting*/
- bmi08xdev.accel_cfg.range = BMI085_ACCEL_RANGE_4G;
- /*assign gyro range setting*/
- bmi08xdev.gyro_cfg.range = BMI08X_GYRO_RANGE_2000_DPS;
- /*! Mode (0 = off, 1 = 400Hz, 2 = 1kHz, 3 = 2kHz) */
- sync_cfg.mode = BMI08X_ACCEL_DATA_SYNC_MODE_2000HZ;
- rslt = bmi085_configure_data_synchronization(sync_cfg, &bmi08xdev);
- /*set accel interrupt pin configuration*/
- /*configure host data ready interrupt */
- int_config.accel_int_config_1.int_channel = BMI08X_INT_CHANNEL_1;
- int_config.accel_int_config_1.int_type = BMI08X_ACCEL_SYNC_INPUT;
- int_config.accel_int_config_1.int_pin_cfg.output_mode = BMI08X_INT_MODE_PUSH_PULL;
- int_config.accel_int_config_1.int_pin_cfg.lvl = BMI08X_INT_ACTIVE_HIGH;
- int_config.accel_int_config_1.int_pin_cfg.enable_int_pin = BMI08X_ENABLE;
- /*configure Accel syncronization input interrupt pin */
- int_config.accel_int_config_2.int_channel = BMI08X_INT_CHANNEL_2;
- int_config.accel_int_config_2.int_type = BMI08X_ACCEL_SYNC_DATA_RDY_INT;
- int_config.accel_int_config_2.int_pin_cfg.output_mode = BMI08X_INT_MODE_PUSH_PULL;
- int_config.accel_int_config_2.int_pin_cfg.lvl = BMI08X_INT_ACTIVE_HIGH;
- int_config.accel_int_config_2.int_pin_cfg.enable_int_pin = BMI08X_ENABLE;
- /*set gyro interrupt pin configuration*/
- int_config.gyro_int_config_1.int_channel = BMI08X_INT_CHANNEL_3;
- int_config.gyro_int_config_1.int_type = BMI08X_GYRO_DATA_RDY_INT;
- int_config.gyro_int_config_1.int_pin_cfg.enable_int_pin = BMI08X_ENABLE;
- int_config.gyro_int_config_1.int_pin_cfg.lvl = BMI08X_INT_ACTIVE_HIGH;
- int_config.gyro_int_config_1.int_pin_cfg.output_mode = BMI08X_INT_MODE_PUSH_PULL;
- int_config.gyro_int_config_2.int_channel = BMI08X_INT_CHANNEL_4;
- int_config.gyro_int_config_2.int_type = BMI08X_GYRO_DATA_RDY_INT;
- int_config.gyro_int_config_2.int_pin_cfg.enable_int_pin = BMI08X_DISABLE;
- int_config.gyro_int_config_2.int_pin_cfg.lvl = BMI08X_INT_ACTIVE_HIGH;
- int_config.gyro_int_config_2.int_pin_cfg.output_mode = BMI08X_INT_MODE_PUSH_PULL;
- /* Enable synchronization interrupt pin */
- rslt = bmi085_set_data_sync_int_config(&int_config, &bmi08xdev);
复制代码读取原始加速度数据 - /* Declare an instance of the sensor data structure for accel */
- static struct bmi08x_sensor_data accel_bmi085;
- rslt = bmi08a_get_data(&accel_bmi085, &bmi08xdev);
复制代码读取同步数据 - /* Declare an instance of the sensor data structure for accel */
- static struct bmi08x_sensor_data accel_bmi085;
- /* Declare an instance of the sensor data structure for gyro */
- static struct bmi08x_sensor_data gyro_bmi085;
- rslt = bmi085_get_synchronized_data(&accel_bmi085,&gyro_bmi085, &bmi08xdev);
复制代码
|