2016-07-02 13 views
0

Ich benutze ein Synapse Wireless-Modul, das eine ATMEL ATmega128 hat. Ich habe einen 3 Achsen Beschleunigungsmesser ADXL345 damit verbunden und ich kommuniziere mit ihm über I2C. Das Synapse-Modul verwendet eine Untergruppe von Python als Skriptsprache.ADXL345 Accelerometer Datenausgabe Konvertierung

Wenn ich die XYZ-Daten lese, bekomme ich ein Array von 6 Bytes zurück. EC FF EF FF 01 01

Die Ausgangsdaten sind zwei Komplemente mit DATAx0 als niedrigstwertiges Byte und DATAx1 als höchstwertiges Byte. Im obigen Beispiel ist EC FF der Ausgang für die x-Achse.

Ich habe Probleme damit, dies in G-Force umzuwandeln. Das Datenblatt sagt im Vollauflösungsmodus (in dem ich bin), dass die Ausgabeauflösung mit dem g Bereich steigt, der durch die Entfernungsbits eingestellt wird, um einen 4 mg/LSB Skalierungsfaktor beizubehalten.

Ich habe versucht, die folgenden:

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

aber der Wert der rohen keinen Sinn machen. Wie konvertiere ich diese zwei Bytes in eine vorzeichenbehaftete Ganzzahl?

Weitere Informationen Als ich den Anruf die ADXL345 zu lesen:

data = readAdxls(6) 

es die Folge von Bytes zurück zurück gelesen von dem externen I2C-Gerät.

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 

So XLSB ist das am wenigsten signifikante Byte und XMSB ist das bedeutendste Byte. Dies sind ganze Zahlen

Ich denke, ich verstehe einfach nicht die Zweier-Komplement und wie diese 2 Integer/Bytes zu einer vorzeichenbehafteten Ganzzahl kombinieren.

+0

Wie vollständig ist diese Teilmenge? Kannst du das 'struct' Modul benutzen? – MaxNoe

+0

Nein, das Strukturmodul ist nicht Teil der Sprache. FWIW, es gibt auch keine Unterstützung für Floats. Es wurde entwickelt, um extrem leicht zu sein. – cce1911

+0

Es tut mir leid, aber wenn die zwei Byte EG und FF sind, wobei die zweite die signifikanteste ist, ist die richtige Reihenfolge FF EC. Zum Konvertieren benötigen Sie also nur: (die meisten << 8 | mindestens) Dies wird Ihnen die Rohdaten geben, dann multiplizieren Sie es für die gewählte Sensorauflösung. Wenn Sie für die maximale Auflösung gehen, multiplizieren Sie einfach für 0,0039 – Lornioiz

Antwort

0

Ich bin mir nicht sicher, was Sie mit ord() dort tun ... ord(c) dauert c, ein einzelnes Zeichen, und gibt seinen ASCII-Zeichen-Code.

So oder so, eine Zahl, deren Darstellung in Zweier-Komplement ist in Python zu Signed Integer zu konvertieren, würde man so etwas tun:

def tc(val, bits): 
    if val >= 2**(bits-1): 
     return val - (2**bits) 
    return val 

>>> tc(0xECFF, 16) 
-4865 

Obwohl wie wie man tatsächlich diese Funktion mit Ihren Daten aufrufen Ich müsste sehen, wie Ihre Daten in Python aussehen. Welche Art von Zahlen erwarten Sie für G-Force?

+0

Ich hätte ord() näher angeschaut. Es erklärt, warum das Ergebnis keinen Sinn ergab. – cce1911

+0

Ich landete die Verschiebung der msb und dann die lsb. msb << 8 | lsb Dann habe ich Adams Funktion aufgerufen.Danke für den Tipp. – cce1911

+0

Wie kommst du das MSB auf das LSB? Sicher willst du ein einfaches '+' ...? –

Verwandte Themen