将来自陀螺仪的两个字节组合成有符号 angular 速率

Combine two bytes from gyroscope into signed angular rate

我有两个 8 位字符。它们是一些 16 位有符号浮点数在陀螺仪内被分解为 MSB 和 LSB 的产物。

我知道的合并两个字节的标准方法是这样的:

(signed float) = (((MSB value) << 8) | (LSB value));

只是 returns 垃圾。

我该怎么做?

你已经显示了两个字节,在大多数系统上 float 是 4 个字节。你对你解构的原始浮点数的其他两个字节做了什么?如果可能,您应该保留并重新构造所有四个原始字节。如果不能,并且您必须省略任何字节,将它们设置为零,并使它们成为浮点数小数部分中的最低有效位,希望您能得到令人满意的精度答案。

下图显示了位的位置,因此根据您系统的字节序,您应该能够根据您解构原始浮点数的方式构造一个有效的浮点数。编写一个函数来将值显示为二进制数并将它们排列起来并显示初始、中间和最终结果以确保您真正完成您认为(希望)的事情真的很有帮助。

要获得有效结果,您必须在这些位中加入一些合理的内容。

好的,所以,亲爱的,大约 4 年前的我:

首先,您使用的陀螺仪是 MAX21000。数据表,就您所见,实际上并没有描述 I2C 连接的字节顺序,这可能也让您感到困惑。然而,SPI 连接确实声明数据以 MSB 优先的方式传输,轴数据的前 8 位在第一个字节中,附加的 8 位在下一个字节中。

值得称赞的是,数据表并没有真正说明这 16 位代表什么类型——但是,那是因为它是跨制造商的标准化。

在转换为浮点数时得到如此无意义的值的真正原因是陀螺仪没有发送浮点数。为什么你甚至认为它会?

陀螺仪发送一个普通的 'ol int16(短)。简单搜索 "i2c gyro interface" 就可以清楚地知道这一点。如何将其转化为小数 angular 比率?你除以 32,768(int16 的最大正值),然后乘以陀螺仪上设置的满刻度范围。

简单!在这里,想要一个代码示例吗?

float X_angular_rate = ((((int16_t)((byte_1 << 8) | byte_2))/SHRT_MAX)*GYRO_SCALE

但是,我认为重要的是要注意,仅来自这些陀螺仪的数据本身并不像您想象的那么有用;据我目前所知,由于零速率漂移特性较差,MEMS 陀螺仪几乎总是用于带有加速度计和卡尔曼滤波器的传感器融合设置中,以制作合适的 IMU。

如果不增加这种复杂性,通过航位推算得出的任何位置和姿态在几分钟后就会变得非常不准确,这就是为什么你在板的下一次修订中添加了加速度计。