我有一個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)。 –