Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.
Zur Bauteilseite des BMA020
http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515
http://de.farnell.com/bosch/bma020-0330sb000b/daughter-board/dp/1795593?Ntt=BMA020
[Bearbeiten] Speicheraufteilung
BMA020 Speicher
| 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
|
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.
Es sind 3 verschiedene Bereiche einstellbar:
BMA020 Range
| 14h
|
|
| Bit 4
| Bit 3
| Bereich
|
| 0
| 0
| +/- 2g (default)
|
| 0
| 1
| +/- 4g
|
| 1
| 0
| +/- 8g
|
| 1
| 1
| -
|
Folgende Aktualisierungsraten sind möglich:
BMA020 Bandwith
| 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
| -
| -
|
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
|
Gemeint ist hierbei Bit 7 - 1.
I2C Adressen
| Hexadezimal | Dezimal
|
| 0x38 | 56
|
Zum lesen muss das 0. Bit gesetzt werden.
I2C Adressen
| Richtung | Hexadezimal | Dezimal
|
| schreiben | 0x70 | 112
|
| lesen | 0x71 | 113
|
[Bearbeiten] Beschleunigungsdaten lesen
Um Daten zu lesen muss erst der Offset gesendet werden ab dem Daten gelesen werden sollen. Die Beschleunigungsdaten liegen ab Adresse 0x02h.
Offset senden
| 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:
Beschleunigungsdaten lesen
| 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
|
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).
Hat man die Werte ausgelesen gilt es diese zusammen zu fügen. Im folgenden Beispiel wird angenommen das die Werte in der variable
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 nach links schieben um Platz für die beiden unteren Bits zu schaffen.
x = values[0] << 2;
//X LSB (03h) um sechs nach rechts schieben um die zwei obersten Bits an den richtigen Platz das zusammenfügen zu bringen.
x = x | (values[1] >> 6); |
Selbiges muss für Y und Z getan werden.
[Bearbeiten] Gravitationsvektor
Der Gravitationsvektor ergibt sich aus:
[Bearbeiten] Gravitation berechnen
Die Gravitation ist gleich der Länge des Gravitationsvektors: