我想读一下加速度计的值。在加速度计的数据寄存器中,值存储在two's complement。
中 Wire.read函数返回一个字节;这意味着返回正值。我必须组合两个字节并从16位保留14(向右移动>> 2)。这个值是两个补码。我只是读取了我存储在数组中的字节,然后我尝试将它们组合起来(没有函数来计算两个补码的转换)并将它们存储到int(我可能必须将它设置为int16_t
)。
正如我所说,这应该是错误的,因为这应该只返回正值,但我也得到负值。我可以说我不在乎,但我担心如果我做错了什么并且使价值变为负值,并且与逻辑问题的正确值不同。
代码是:
我用这段代码读了加速度计和值:
void BMA180Acc::readAccel() {
int n = 6;
byte result[6];
readRegValue(DATA, n, result);
int x = (( result[0] | result[1]<<8)>>2);
Serial.println(x);
if (x&0x2000) {
x = x|0xc000;
}
xAxes = x*(getSensivity()/8192.0);
int y = (( result[2] | result[3]<<8)>>2);
if (y&0x2000) {
y = y|0xc000;
}
yAxes = y*(getSensivity()/8192.0);
int z = (( result[4] | result[5]<<8)>>2);
if (z&0x2000) {
z = z|0xc000;
}
zAxes = z*(getSensivity()/8192.0);
}
getSensitivity()设置为返回枚举的int(这不是问题)。
函数readRegValue()也是:
void BMA180Acc::readRegValue(int adr,int addcount,byte buffer[]) {
Wire.beginTransmission(BMA180);
Wire.write(adr);
Wire.endTransmission();
Wire.requestFrom((int)BMA180, addcount);
int i = 0;
while (Wire.available())
{
buffer[i] = Wire.read();
i++;
}
Wire.endTransmission();
}
结果是:
553
580
636
-1311
-271
418
2029
2020
411
2969
-7633
1650
6210
7878
-1222
-5030
-3733
282
-5006
-4806
结果位于Serial.print
内的readAccel()
。