ADXL345加速度计数据输出转换
ADXL345 Accelerometer data output conversion
我使用的是带有 ATMEL ATmega128 的 Synapse 无线模块。我已将 ADXL345 3 轴加速度计连接到它,并通过 I2C 与其通信。 Synapse 模块使用 python 的子集作为脚本语言。
当我读取 XYZ 数据时,我得到了一个 6 字节的数组。
EC FF EF FF 14 01
输出数据是二进制补码,DATAx0 作为最低有效字节,DATAx1 作为最高有效字节。所以在上面的例子中,EC FF 是 x 轴的输出。
我正在为如何将其转换为 G 力而苦恼。数据表说在全分辨率模式下(我处于这种模式)输出分辨率随着 g 范围的增加而增加
由范围位设置以保持 4 mg/LSB 比例因子。
我试过以下方法:
x0 = ord(data[0])
x1 = ord(data[1])
raw = x0+(256*x1)
但是 raw 的值没有任何意义。如何将这两个字节转换为有符号整数?
附加信息
当我打电话阅读 adxl345 时:
data = readAdxls(6)
它returns从外部I2C设备读回的字节串。
Xlsb = data[0] # EC - 236
Xmsb = data[1] # FF - 255
Ylsb = data[2] # EF - 239
Ymsb = data[3] # FF - 255
Zlsb = data[4] # 14 - 20
Zmsb = data[5] # 01 - 1
所以 Xlsb 是最不重要的 byte 而 Xmsb 是最重要的 byte。这些是整数
我想我只是不明白二进制补码以及如何将这 2 integers/bytes 组合成一个有符号整数。
我不确定你在用 ord()
做什么... ord(c)
接受 c
,一个字符,并输出它的 ASCII 字符代码。
无论哪种方式,要将表示为二进制补码的数字转换为 Python 中的有符号整数,可以这样做:
def tc(val, bits):
if val >= 2**(bits-1):
return val - (2**bits)
return val
>>> tc(0xECFF, 16)
-4865
至于如何使用您的数据实际调用该函数,我需要在 Python 中查看您的数据是什么样的。您希望看到什么样的 G-force 数字?
我使用的是带有 ATMEL ATmega128 的 Synapse 无线模块。我已将 ADXL345 3 轴加速度计连接到它,并通过 I2C 与其通信。 Synapse 模块使用 python 的子集作为脚本语言。
当我读取 XYZ 数据时,我得到了一个 6 字节的数组。 EC FF EF FF 14 01
输出数据是二进制补码,DATAx0 作为最低有效字节,DATAx1 作为最高有效字节。所以在上面的例子中,EC FF 是 x 轴的输出。
我正在为如何将其转换为 G 力而苦恼。数据表说在全分辨率模式下(我处于这种模式)输出分辨率随着 g 范围的增加而增加 由范围位设置以保持 4 mg/LSB 比例因子。
我试过以下方法:
x0 = ord(data[0])
x1 = ord(data[1])
raw = x0+(256*x1)
但是 raw 的值没有任何意义。如何将这两个字节转换为有符号整数?
附加信息 当我打电话阅读 adxl345 时:
data = readAdxls(6)
它returns从外部I2C设备读回的字节串。
Xlsb = data[0] # EC - 236
Xmsb = data[1] # FF - 255
Ylsb = data[2] # EF - 239
Ymsb = data[3] # FF - 255
Zlsb = data[4] # 14 - 20
Zmsb = data[5] # 01 - 1
所以 Xlsb 是最不重要的 byte 而 Xmsb 是最重要的 byte。这些是整数
我想我只是不明白二进制补码以及如何将这 2 integers/bytes 组合成一个有符号整数。
我不确定你在用 ord()
做什么... ord(c)
接受 c
,一个字符,并输出它的 ASCII 字符代码。
无论哪种方式,要将表示为二进制补码的数字转换为 Python 中的有符号整数,可以这样做:
def tc(val, bits):
if val >= 2**(bits-1):
return val - (2**bits)
return val
>>> tc(0xECFF, 16)
-4865
至于如何使用您的数据实际调用该函数,我需要在 Python 中查看您的数据是什么样的。您希望看到什么样的 G-force 数字?