【发布时间】:2017-08-16 21:00:08
【问题描述】:
我有一个 ADXL355 (EVAL-ADXL355-PMDZ),我正在尝试针对非常昂贵的工业级传感器进行测试。我正在使用 I2C,并且能够读取datasheet 中所述的设备属性和设置。
我遇到的问题是如何将 3 个 ZDATA(或 XDATA、YDATA)寄存器读取为单个值。我尝试了两种方法。这是第一个:
double values[3];
Wire.beginTransmission(addr);
Wire.write(0x08); // ACCEL_XAXIS
Wire.endTransmission();
Wire.requestFrom(addr, 9, true); // Read 9, 3 for each axis
byte x1, x2, x3;
for (int i = 0; i < 3; ++i){
x3 = Wire.read();
x2 = Wire.read();
x1 = Wire.read();
unsigned long tempV = 0;
unsigned long value = 0;
value = x3;
value <<= 12;
tempV = x2;
tempV <<= 4;
value |= tempV;
tempV = x1;
tempV >>= 4;
value |= tempV;
values[i] = SCALEFACTOR * value;
}
这将产生接近 1g 负重力和 3g 正重力的值。此外,未加载的轴有时会显示超标高而不是 -0.0g。它们从 0.0 到 4.0 g 弹跳。这告诉我我有一个标志问题,我确信这来自使用unsigned long。所以我尝试将其读取为 16 位值并保留符号。
double values[3];
Wire.beginTransmission(addr);
Wire.write(0x08); // ACCEL_XAXIS
Wire.endTransmission();
Wire.requestFrom(addr, 9, true); // Read 9, 3 for each axis
byte x1, x2, x3;
for (int i = 0; i < 3; ++i){
x3 = Wire.read();
x2 = Wire.read();
x1 = Wire.read();
long tempV = 0;
long value = 0;
value = x3;
value <<= 8;
tempV = x2;
value |= tempV;
values[i] = SCALEFACTOR * value;
}
这个产生的值在符号方面是好的,但它们(正如预期的那样)比它们应该的要低得多。我试图创建一个像 long value:20; 这样的 20 位数字,但我收到了
':' 标记之前的预期初始化程序
int 出现同样的错误。
如何正确读取 3 个寄存器以获得正确的 20 位值?
【问题讨论】:
-
我正在尝试做同样的事情:用昂贵的加速器测试这个加速器。正如其他用户在here 中所描述的那样,由于输出值停留在所选范围内,我的日子很不好过。这个加速度计有同样的问题还是一切正常?
标签: arduino