BMA020
Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.
BMA020
Bauteilseite
Bezugsquellen
ELV
Farnell
http://de.farnell.com/bosch/bma020-0330sb000b/daughter-board/dp/1795593?Ntt=BMA020
Speicheraufteilung
Adresse | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | Typ | Axis |
---|---|---|---|---|---|---|---|---|---|---|
16h - 7Fh | - | reserved | ||||||||
15h | SPI4E (4 wire SPI enable) (default: 1) |
EAI (enable advanced interrupt) |
NDI (new data interrupt) |
LI (latch interrupt) |
SD (shadow disable / read MSB only) |
WUP (wake up pause) |
WU (wake up) |
control | ||
14h | - !!! - (NEVER ever change this registers) |
range (+/-2/4/8g) |
bandwith (25...1500 Hz) |
control | ||||||
13h | customer reserved (can be used as memory) |
status | ||||||||
12h | status | |||||||||
11h | AMD (any motion duration) |
HGH (high gravitation hysteresis) |
LGH (low gravitation hysteresis) |
settings | ||||||
10h | AMT (any motion threshold) |
settings | ||||||||
0Fh | HGD (high gravitation duration) |
settings | ||||||||
0Eh | HGT (high gravitation threshold) |
settings | ||||||||
0Dh | LGD (low gravitation duration) |
settings | ||||||||
0Ch | LGT (high gravitation threshold) |
settings | ||||||||
0Bh | alert | AM (any motion) |
HGC (high gravitation counter) |
LGC (low gravitation counter) |
HGE (high gravitation enable) |
LGE (low gravitation enable) |
control | |||
0Ah | - | reset INT | - | - | self test 1 | self test 2 | soft reset | sleep | control | |
09h | STR (self test result) |
- | alert phase | LG latched | HG latched | HGS (high gravitation status) |
LGS (low gravitation status) |
status | ||
08h | - | data | ||||||||
07h | Z [9] | Z [8] | Z [7] | Z [6] | Z [5] | Z [4] | Z [3] | Z [2] | data | Z |
06h | Z [1] | Z [0] | - | NDZ (new data Z) |
data | |||||
05h | Y [9] | Y [8] | Y [7] | Y [6] | Y [5] | Y [4] | Y [3] | Y [2] | data | Y |
04h | Y [1] | Y [0] | - | NDY (new data Y) |
data | |||||
03h | X [9] | X [8] | X [7] | X [6] | X [5] | X [4] | X [3] | X [2] | data | X |
02h | X [1] | X [0] | - | NDX (new data X) |
data | |||||
01h | al version | ml version | data | |||||||
00h | - | chip ID | data |
Register
Shadow disable
Ist diese Bit gesetzt ist es möglich die MSBs der Beschleunigungswerte (03h, 05h, 07h) zu lesen ohne vorher die LSBs (02h, 04h, 06h) gelesen zu haben.
Range
Es sind 3 verschiedene Bereiche einstellbar:
14h | ||
---|---|---|
Bit 4 | Bit 3 | Bereich |
0 | 0 | +/- 2g (default) |
0 | 1 | +/- 4g |
1 | 0 | +/- 8g |
1 | 1 | - |
Bandwith
Folgende Aktualisierungsraten sind möglich:
14h | ||||
---|---|---|---|---|
Bit 2 | Bit 1 | Bit 0 | Rate | reale Rate |
0 | 0 | 0 | 25 Hz (default) |
23 Hz |
0 | 0 | 1 | 50 Hz | 47 Hz |
0 | 1 | 0 | 100 Hz | 94 Hz |
0 | 1 | 1 | 190 Hz | 188 Hz |
1 | 0 | 0 | 375 Hz | 375 Hz |
1 | 0 | 1 | 750 Hz | 750 Hz |
1 | 1 | 0 | 1500 Hz | 1500 Hz |
1 | 1 | 1 | - | - |
Konfiguration
I2C
Adresse
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | R/W |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 0 | 0 | 0 | x |
7 Bit Sichtweise
Gemeint ist hierbei Bit 7 - 1.
Hexadezimal | Dezimal |
---|---|
0x38 | 56 |
Zum lesen muss das 0. Bit gesetzt werden.
8 Bit Sichtweise
Richtung | Hexadezimal | Dezimal |
---|---|---|
schreiben | 0x70 | 112 |
lesen | 0x71 | 113 |
Beschleunigungsdaten lesen
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.
Richtung | Adresse | Daten |
---|---|---|
schreiben | 0x70 | 0x02 |
Die Beschleunigungsdaten sind pro Achse (X, Y, Z) 10 Bit lang. Diese liegen in 6 Bytes ab Adresse 0x02h (0x02h - 0x08h). Siehe dazu den Abschnitt Speicheraufteilung. Um an die Daten zu kommen muessen 6 Byte von der Adresse des BMA020 gelesen werden:
Richtung | Adresse | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 |
---|---|---|---|---|---|---|---|
lesen | 0x71 | LSB_x | MSB_x | LSB_y | MSB_y | LSB_z | MSB_z |
Berechnung
8 Bitwerte
Sind die Beschleunigungswerte ausgelesen geht es nun an die Interpretation. Reicht eine Genauigkeit von 8 Bit so kann man nur den MSB-Teil der Werte nehmen. Achtung: Es müssen dennoch die LSBs eingelesen werden, da die MSBs und LSBs solange blockiert bleiben bis beide eingelesen wurden. Um dies zu verhindern muss das Shadow disable Bit gesetzt werden (15h, Bit 3; siehe Speicheraufteilung).
10 Bitwerte
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der Variable
values[]
liegen. Die Variable enthält die 6 Bytes für X, Y und Z.
Als Beispiel wird hier X erzeugt (zusammengefügt).
uint values[6];
int x;
//X MSB (02h) um zwei Stellen nach links schieben um Platz für die beiden unteren Bits zu schaffen.
x = values[0] << 2;
//X LSB (03h) um sechs Stellen nach rechts schieben um die zwei obersten Bits an den richtigen Platz für das Zusammenfügen zu bringen.
x = x | (values[1] >> 6);
Selbiges muss für Y und Z getan werden.
Gravitationsvektor
Der Gravitationsvektor ergibt sich aus: [math]\displaystyle{ \vec g = \begin{pmatrix} x \\ y \\ z \end{pmatrix} }[/math]
Gravitation berechnen
Die Gravitation ist gleich der Länge des Gravitationsvektors: [math]\displaystyle{ g = \sqrt{x^2+y^2+z^2} }[/math]