2016-07-02 219 views
0

我正在使用一個具有ATMEL ATmega128的Synapse無線模塊。我已經將ADXL345 3軸加速度計連接到它,並且通過I2C與它進行通信。 Synapse模塊使用python的一個子集作爲腳本語言。ADXL345加速度計數據輸出轉換

當我讀取XYZ數據時,我得到一個6字節的數組。 EC FF EF FF 01 01

輸出數據與DATAx0作爲最低有效字節和DATAx1作爲最高有效字節進行二進制補碼。所以在上面的例子中,EC FF是x軸的輸出。

我正在努力如何將其轉換爲G力。數據表在全分辨率模式下(我所在的位置)輸出分辨率隨範圍位設置的g範圍 增加,以保持4 mg/LSB比例因子。

我已經試過如下:

x0 = ord(data[0]) 
x1 = ord(data[1]) 
raw = x0+(256*x1) 

,但原料的價值沒有任何意義。如何將這兩個字節轉換爲有符號整數?

其他信息 當我打這個電話來讀取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是最顯著字節和Xmsb是最顯著字節。這些是整數

我想我只是不明白二進制補碼,以及如何將這兩個整數/字節組合成一個有符號的整數。

+0

這個子集有多完整?你可以使用'struct'模塊嗎? – MaxNoe

+0

不,結構模塊不是該語言的一部分。 FWIW,也不支持浮動。它的設計非常輕便。 – cce1911

+0

對不起,但如果兩個字節是EC和FF,是第二個最重要的,正確的順序是FF EC。 因此,要轉換您只需: (大多數<< 8 |最少) 這會給你原始數據,然後乘以選擇傳感器分辨率。 如果你去的最高分辨率,只需乘以0.0039 – Lornioiz

回答

0

我不確定你在做什麼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?

+0

我應該更仔細地看待ord()。它解釋了爲什麼結果沒有意義。 – cce1911

+0

我結束了移動的MSB然後和LSB。 msb << 8 | lsb 然後我打電話給亞當的功能。謝謝你的提示。 – cce1911

+0

你如何將MSB置於LSB上?當然你想要一個簡單的'+'...? –