【问题标题】:Combine two bytes from gyroscope into signed angular rate将陀螺仪的两个字节组合成有符号角速率
【发布时间】:2015-04-05 21:54:26
【问题描述】:

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

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

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

只返回垃圾。

我该怎么做?

【问题讨论】:

  • 16 位浮点数?这可能吗?
  • 只是出于好奇,如果交换字节会发生什么?另外,请记住,那里有两个字节,而在大多数系统上 float 是 4 个字节。你对解构的原始浮点数的另外两个字节做了什么?考虑保存并使用那些:-)
  • 浮点数不像 2 的补码整数。它们是复杂的 IEEE 标准。您实际上可能需要原始浮点数的所有 4 个字节来重构一个合理的浮点数。
  • 在不知道他们是如何被“分解”和/或看到一个例子的情况下,很难说这里的正确行为是什么。但可以肯定的是,您需要重新解释这些位,而您的代码并没有这样做。
  • 也许你已经交换了字节顺序?或者你必须投到unsigned char

标签: c byte signed


【解决方案1】:

好吧,亲爱的,从 ~4 年前开始:

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

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

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

陀螺仪发送一个普通的 'ol int16 (short)。对“i2c gyro interface”的简单搜索就可以清楚地说明这一点。您如何将其转换为十进制角速率?你除以 32,768(int16 的最大正值),然后乘以陀螺仪上设置的满量程范围。

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

float X_angular_rate = ((((int16_t)((byte_1

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

如果没有这种额外的复杂性,任何从航位推算得出的立场和态度在几分钟后就会变得非常不准确,这就是为什么您在下一个版本的董事会中添加了加速度计。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这没有回答问题。
    • 最好不要将反对票建模为“惩罚性”;他们只是为了反映相应的答案没有用(在这种情况下,不回答问题)。
    • 有;只需链接到 wiki 页面。
    • 好的,我可以,但在我看来它仍然是一种更好的展示图片的方式,所以评论帖子的人可以立即看到价值 1000 字的图片并准确了解分数是。
    • 也许,与其仅仅因为他为 OP 完成了 一些 研究而否决了这个答案,不如因为@DC177E 而否决 question似乎没有做足够的研究来自己提出这个问题(以及其他重要细节)。
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2010-12-07
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多