MPU-6050:从FIFO寄存器正确读取数据

问题描述 投票:0回答:1

简介

MPU-6050是一种流行的模块,其中包含温度传感器,加速度计和陀螺仪。用户可以通过I2C或SPI读取传感器信息。公开提供了两个文档,用于从IC寄存器中读取数据。这些是:

  1. The MPU-6000 and MPU-6050 Register Map and Descriptions Document

  2. The MPU-6000 and MPU-6050 Product Specification


上下文

由于总线通信等待时间的原因,通过I2C读取IMU的各个寄存器会导致时间跨度偏差。因此,不同步读取传感器的X,Y和Z轴寄存器。为了解决这个问题,设备提供了一个1024字节的内部FIFO队列。配置为推送到队列的数据以采样率一起推送。因此,读取FIFO将产生同步数据。

请参阅(2),第7.17节] ::

MPU-60X0包含一个1024字节的FIFO寄存器,可通过串行接口进行访问。 FIFO配置寄存器确定将哪些数据写入FIFO。可能的选择包括陀螺仪数据,加速度计数据,温度读数,辅助传感器读数和FSYNC输入。 FIFO计数器跟踪FIFO中包含多少字节的有效数据。 FIFO寄存器支持突发读取。中断功能可用于确定何时有新数据可用


问题

数据表指定,为了从FIFO中读取数据,您必须执行以下操作:

  1. 启用FIFO(位6,寄存器0x6A,文档(1),4.29节)
  2. 用要推送的传感器信息配置FIFO(寄存器0x23,文档(1),第4.7节)。我分别通过设置位6、5、4和3来启用XG_FIFO_ENYG_FIFO_ENZG_FIFO_ENACCEL_FIFO_EN
  3. 如果执行了这些步骤,则它声明(文档(1),第4.33节):

按照寄存器编号的顺序(从最低到最高)将数据写入FIFO。如果所有FIFO使能标志(见下文)均被使能,并且所有外部传感器数据寄存器(寄存器73至96)都与从设备相关联,则将按采样率顺序写入寄存器59至96的内容。当传感器数据寄存器(寄存器59至96)的相应FIFO使能标志在FIFO_EN(寄存器35)中设置为1时,它们的内容将写入FIFO缓冲区。

但是,我发现这并不成立。给定我已在配置寄存器中启用的标志,我希望以下序列来自FIFO:

 * ----------------------------------------------------------- *
 *     BYTE #    |         VALUE          |    Register (dec)  *
 * ----------------------------------------------------------- *
 *       0       |     ACCEL_XOUT[15:8]   |         59         *
 *       1       |     ACCEL_XOUT[7:0]    |         60         *
 * ----------------------------------------------------------- *
 *       2       |     ACCEL_YOUT[15:8]   |         61         *
 *       3       |     ACCEL_YOUT[7:0]    |         62         *
 * ----------------------------------------------------------- *
 *       4       |     ACCEL_ZOUT[15:8]   |         63         *
 *       5       |     ACCEL_ZOUT[7:0]    |         64         *
 * ----------------------------------------------------------- *
 *       6       |     GYRO_XOUT[15:8]    |         67         *
 *       7       |     GYRO_XOUT[7:0]     |         68         *
 * ----------------------------------------------------------- *
 *       8       |     GYRO_YOUT[15:8]    |         69         *
 *       9       |     GYRO_YOUT[7:0]     |         70         *
 * ----------------------------------------------------------- *
 *      10       |     GYRO_ZOUT[15:8]    |         71         *
 *      11       |     GYRO_ZOUT[7:0]     |         72         *
 * ----------------------------------------------------------- *

尚未从FIFO读取12个字节确实读取单个寄存器时不与相同数据对应

。当我加速或旋转IMU时,这似乎也没有多大意义。因此,我不确定如何准确读取FIFO。这是我面临的问题

Q&A
  1. 您确定正确写入寄存器吗?

:是的,我能够设置各种配置,例如采样率,中断等。我相信我能够正确地从FIFO读取]]
  • 您确定要在FIFO中读取任何内容吗?:是的,我已启用FIFO溢出中断。我目前正在等待中断,然后从FIFO寄存器中读取。
  • [是否在读取前检查FIFO长度寄存器?是的,当FIFO溢出中断发生时,它包含1024个字节(最大容量)。
  • 其他人以前没有这样做吗?:没有人对如何读取FIFO有具体的解释(例如:this similar question on another forum that gets an RTFM)。与读取FIFO相关的大多数可搜索问题是(a)未回答,(b)被告知使用通用XYZ Arduino库(我不能使用),(c)被告知读取数据表(我拥有)。
  • 简介MPU-6050是一个流行的模块,其中包含温度传感器,加速度计和陀螺仪。用户可以通过I2C或SPI读取传感器信息。两个文件公开...

    i2c esp32 mpu6050
    1个回答
    0
    投票

    好的,我已经解决了问题。问题是我在读取FIFO之前未能reset

    FIFO-否则一切都差不多。我将向您确切说明我现在如何设置IMU。
    © www.soinside.com 2019 - 2024. All rights reserved.