BMA020

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Der BMA020 ist ein 3-Achsen-Beschleunigungssensor von Bosch der über I2C oder ISP ausgelesen und konfiguriert werden kann.

BMA020

Bauteilseite

Zur Bauteilseite des BMA020


Bezugsquellen

ELV

http://www.elv.de/3-Achsen-Beschleunigungssensor-3D-BS,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_28515

Farnell

http://de.farnell.com/bosch/bma020-0330sb000b/daughter-board/dp/1795593?Ntt=BMA020

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

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:

BMA020 Range
14h
Bit 4 Bit 3 Bereich
0 0 +/- 2g
(default)
0 1 +/- 4g
1 0 +/- 8g
1 1 -

Bandwith

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 - -

Konfiguration

I2C

Adresse

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.

I2C Adressen
Hexadezimal Dezimal
0x38 56

Zum lesen muss das 0. Bit gesetzt werden.

8 Bit Sichtweise

I2C Adressen
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.

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

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]