【问题标题】:ADXL345 Accelerometer data output conversionADXL345加速度计数据输出转换
【发布时间】:2016-07-02 22:56:24
【问题描述】:

我正在使用带有 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)

它返回从外部 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 个整数/字节组合成有符号整数。

【问题讨论】:

  • 这个子集有多完整?可以使用struct 模块吗?
  • 不,结构模块不是语言的一部分。 FWIW,也不支持浮点数。它的设计重量极轻。
  • 对不起,如果两个字节是 EC 和 FF,第二个最重要的,正确的顺序是 FF EC。因此,要进行转换,您只需要:(大多数

标签: python accelerometer


【解决方案1】:

我不确定你在用 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 获得什么样的数字?

【讨论】:

  • 我应该更仔细地查看 ord() 。它解释了为什么结果没有意义。
  • 我最终转移了 msb 然后和 lsb。 msb
  • 您如何将 MSB 与 LSB 进行 ORing?你肯定想要一个简单的+...?
  • 每个轴的设备输出为 16 位,它们存储在 2 个 8 位寄存器中。我应该说我移动 msbyte
  • 当然可以,但你为什么要 ORing?您可以添加它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多