我有一个ADXL355(EVAL-ADXL355-PMDZ),我试图用它来测试非常昂贵的工业级传感器。我正在使用I2C,并且能够读取设备属性和设置,如datasheet中所述。Arduino从3个寄存器中读取20位数字
我遇到的问题是如何读取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.0克。它们从0.0克升到4.0克。这告诉我我有一个迹象问题,我肯定来自使用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位值?
还要注意,这个实现依赖于字节顺序。 –
@Alexandre Perrin你也是。这是不必要的坏评论 –
@PeterJ据我所知,我的解决方案只使用按位操作,它的工作是一样的,而不管最终性如何(不像union union-punning)。看到[这个问题](https://stackoverflow.com/questions/1041554/bitwise-operators-and-endianness)。 –