介绍
MPU-6050 是一种流行的模块,包含温度传感器、加速度计和陀螺仪。用户可以通过 I2C 或 SPI 读取传感器信息。有两个文档可公开获得,用于从 IC 寄存器中读取数据。这些是:
语境
由于总线通信延迟,通过 I2C 读取 IMU 的各个寄存器会使样本随时间偏移。因此,传感器的 X、Y 和 Z 轴寄存器的顺序读取是不同步的。为了解决这个问题,该器件提供了一个 1024 字节的内部 FIFO 队列。配置为推送到队列的数据以采样率推送到一起。因此读取 FIFO 会产生同步数据。
参见 (2),第 7.17 节:
MPU-60X0 包含一个 1024 字节的 FIFO 寄存器,可通过串行接口访问。FIFO 配置寄存器决定将哪些数据写入 FIFO。可能的选择包括陀螺仪数据、加速度计数据、温度读数、辅助传感器读数和 FSYNC 输入。FIFO 计数器跟踪 FIFO 中包含的有效数据字节数。FIFO 寄存器支持突发读取。中断函数可用于确定何时有新数据可用
问题
数据表规定,为了从 FIFO 中读取,您必须执行以下操作:
- 启用 FIFO(位 6,寄存器
0x6A
,文档 (1),第 4.29 节) - 使用要推送的传感器信息配置 FIFO(寄存器
0x23
,文档 (1),第 4.7 节)。我通过分别设置位 6、5、4 和 3 来启用XG_FIFO_EN
、YG_FIFO_EN
、ZG_FIFO_EN
和。ACCEL_FIFO_EN
如果您已执行这些步骤,则它声称(文档 (1),第 4.33 节):
数据按寄存器编号的顺序(从最低到最高)写入 FIFO。如果所有 FIFO 启用标志(见下文)均已启用并且所有外部传感器数据寄存器(寄存器 73 至 96)都与从设备相关联,则寄存器 59 至 96 的内容将以采样率顺序写入。当 FIFO_EN(寄存器 35)中相应的 FIFO 使能标志设置为 1 时,传感器数据寄存器(寄存器 59 至 96)的内容被写入 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。这是我面临的问题
问答
- 您确定您正确写入寄存器吗?:是的,我可以设置各种配置,例如采样率、中断等。我相信我能够正确地从 FIFO 中读取数据
- 您确定 FIFO 中有什么要读取的吗?: 是的,我启用了 FIFO 溢出中断。我目前在等待中断,然后从 FIFO 寄存器中读取。
- 您是否在读取之前检查了 FIFO 长度寄存器?是的,当 FIFO 溢出中断发生时,它包含 1024 字节(最大容量)。
- 其他人以前没有这样做过吗?:没有人对如何读取 FIFO 有具体的解释(例如:另一个论坛上的类似问题得到了 RTFM)。大多数与读取 FIFO 相关的可搜索问题是(a)未回答,(b)被告知使用通用 XYZ Arduino 库(我不能使用它),(c)被告知阅读数据表(我有)。