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
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?
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" |
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.