MPU 6050加速度计发送16位无符号值

时间:2019-04-20 16:11:47

标签: teensy mpu6050

我正在使用GY-521接线板,以在3.6英寸以下获得其加速度计数据。据我了解,我应该期望从中获得带符号的(正负)值,但是我会得到0到65535之间的值。

这就是我得到的:

当传感器平放在桌子上时,我的Z轴围绕预期的16384读数。当我沿任何方向旋转传感器直到90度时,该值都会降为0。一旦我旋转90度以上,该值跃升至65500,然后当我继续旋转时,一旦传感器上下颠倒(即180°),它就会下降至50000。

在我看来,对于旋转的前半部分,我获得了期望值,但是在下降到零后不再获得负值,而是跳到了无符号16位的最大值。

对于X和Y轴,我得到了类似的结果,但是旋转了90度。 因此,当传感器在桌子​​上平放时,两个轴的读数均为0。当我朝一个方向旋转传感器时,该值在90°时上升到16384,然后在180°后又下降到0。如果我朝另一个方向转动传感器,则该值会跳升至65500左右,然后在90°时下降至50000,然后在180°时返回至65500。

这是我使用的全部代码:

#include <Wire.h>

const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;

void setup() {
  Serial.begin(19200);
  Wire.begin();
  Wire.beginTransmission(MPU); 
  Wire.write(0x6B); 
  Wire.write(0b00000000); 
  Wire.endTransmission();
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1C);
  Wire.write(0b00000001);
  Wire.endTransmission();      
}

void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); 
  Wire.endTransmission();
  Wire.requestFrom(MPU, 6, true);
  AccX = (Wire.read()<<8|Wire.read()); 
  AccY = (Wire.read()<<8|Wire.read()); 
  AccZ = (Wire.read()<<8|Wire.read()); 

  Serial.print(AccX);
  Serial.print(",");
  Serial.print(AccY);
  Serial.print(",");
  Serial.println(AccZ);
  delay(100);
}   

1 个答案:

答案 0 :(得分:0)

好,所以我找到了适合我的解决方案。

我必须将变量AccX,AccY和AccZ定义为“ int16_t”。这给 通过Wire函数获得期望的有符号值。

这是一个变通办法,因为我想将这些值缩放为十进制数字,所以我需要创建另一组变量,直到我定义为float为止。

如果有人可以解释为什么我必须以这种方式定义变量,或者更好地解决这个问题,那么我很高兴听到这个消息。

目前,我可以使用已有的东西。