Forum: Mikrocontroller und Digitale Elektronik Bosch Beschleunigungssensor 2er Komplement


von sqrt_9 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich häng jetzt schon eine ganze Weile an der Auswertung der 
Rückgabewerte meines BMA020 Beschleunigungssensor von Bosch! 
(Datenblatt: s. Anhang)

Im Datenblatt sind auf S. 21 auch Beispiele dargestellt, wie z.B. -2g 
dargestellt wird.

Die Aufteilung der einzelnen Bits auf die einzelnen Register hab ich 
verstanden, 2er Komplementendarstellung sagt mir eigentlich auch was.

ABER ich kann das Ganze trotzdem einfach nicht nachvollziehen, wie man 
z.B. mit "01 1111 1110" auf 1,992g (S.21) kommen soll! Vor allem, wie 
schaff ich den Übergang von 2er Kompl. auf Fließkomma? (Oder brauch ich 
hier keine Fließkommadarstellung?)

Vielleicht kann mir das jemand illustrieren...

THX

von asdf (Gast)


Lesenswert?

sqrt_9 schrieb:
> ABER ich kann das Ganze trotzdem einfach nicht nachvollziehen, wie man
> z.B. mit "01 1111 1110" auf 1,992g (S.21) kommen soll!
einfach das nicht vorhandene Komma richtig setzen. Also ein paar mal 
durch 2 teilen bzw. rechts schieben.

sqrt_9 schrieb:
> Oder brauch ich
> hier keine Fließkommadarstellung?
Brauchst du eigentlich nicht. Was würdest du dir davon erwarten außer 
Ungenauigkeiten?

von Timmo H. (masterfx)


Lesenswert?

Das Teil hat 10 Bit Auflösung (-512 - +511) .
-512 entspricht eben -2g
Als Zweierkomplement wird auch in den Standard ganzzahligen "singed" 
Datentypen gespeichert. Der Sensor macht es dir relativ leicht das ganze 
in ein int16_t zu packen, da das MSB schon richtig aligned ist und du 
nur noch 6 mal nach rechts schiften musst.
1
uint8_t x_msb,x_lsb;
2
uint16_t x_acc_val;
3
4
x_msb = get_reg(0x03);  //register 03 auslesen
5
x_lsb = get_reg(0x02);  //register 02 auslesen
6
7
x_acc_val = (int16_t)(x_msb<<8) | x_lsb;
8
x_acc_val >>= 6;  //6 mal nach rechts schieben
Das ganze in float umrechnen musst du nur dann wenn du es brauchst. Das 
machst du dann einfach so:
1
float g_wert;
2
3
g_wert = x_acc_val/256.;  //bei +-2g; +-4g "/128", +-8g "/64"

von Timmo H. (masterfx)


Lesenswert?

Doh,
es musst natürlich ein signed int sein, sonst klappt es natürlich nicht
1
uint8_t x_msb,x_lsb;
2
int16_t x_acc_val;
3
4
x_msb = get_reg(0x03);  //register 03 auslesen
5
x_lsb = get_reg(0x02);  //register 02 auslesen
6
7
x_acc_val = (int16_t)(x_msb<<8) | x_lsb;
8
x_acc_val >>= 6;  //6 mal nach rechts schieben

von sqrt_9 (Gast)


Lesenswert?

Timmo H. schrieb:
> Das Teil hat 10 Bit Auflösung (-512 - +511) .
> -512 entspricht eben -2g


Achja, natürlich! Das wars was ich gebraucht hab - Jetzt ist alles klar!

Danke für die Antworten!
LG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.