我有两个8位字符。它们是一些16位有符号浮点数在陀螺仪内被分解为MSB和LSB的乘积。
我知道组合两个字节的标准方法是:
(signed float) = (((MSB value) << 8) | (LSB value));
只是返回垃圾。
我该怎么做?
答案 0 :(得分:0)
好的,所以,亲爱的大约4年前:
首先,您正在使用的陀螺仪是MAX21000。就您所看到的未来而言,该数据手册实际上并未描述I2C连接的字节序,这也可能使您失望。但是,SPI连接确实声明数据是先MSB传输的,轴数据的高8位在第一个字节,另外8个在后一个字节。
值得称赞的是,数据表并未真正涉及这16位所代表的类型-但是,这是因为这已在各个制造商之间进行了标准化。
在转换为浮点数时得到如此无意义的值的真正原因是陀螺仪没有发送浮点数。您为什么甚至会认为呢?
陀螺仪发送一个普通的'ol int16(short)。只需搜索“ i2c陀螺仪界面”,就可以弄清楚。您如何将其转换为十进制角速率?您除以32,768(int16的最大正值),然后乘以陀螺仪上设置的满量程范围。
简单!在这里,想要一个代码示例吗?
float X_angular_rate =(((((int16_t)((byte_1 << 8)| byte_2))/ SHRT_MAX)* GYRO_SCALE
但是,我认为重要的是要注意,仅来自这些陀螺仪的数据本身并没有您想象的有用。据我目前的了解,由于陀螺仪的零速率漂移特性差,因此几乎总是用于带有加速度计和卡尔曼滤波器的传感器融合装置中,以制成合适的IMU。
在没有这种增加的复杂性的情况下,死机导致的任何姿势和姿态都将在短短几分钟内变得毫无希望,这就是为什么您要在板的下一个修订版中添加加速度计。
答案 1 :(得分:-1)
您已经显示了两个字节,并且在大多数系统上float都是4个字节。你用你解构的原始浮动的其他两个字节做了什么?如果可能,您应该保留并重新构造所有四个原始字节。如果你不能,你必须省略任何字节,将它们设置为零,并使它们成为浮点小数部分中最不重要的位,希望你能得到满意精度的答案。
下图显示了位位置,因此根据系统的字节顺序执行操作,您应该能够根据解构原始的方式构造有效的浮点数。它可以真正帮助编写一个函数来显示值作为二进制数字并排列它们并显示初始,中间和结束结果,以确保您真正完成您的想法(希望)。
要获得有效的结果,你必须在这些位上放置一些合理的东西。