Forum: Mikrocontroller und Digitale Elektronik BMA180 - Offsetfehler


von Christian S. (swoc)


Lesenswert?

Hallo zusammen

Ich beschäftige mich gerade mit einem Projekt, bei dem ich 
Beschleunigungsdaten x,y,z aus einem BMA180 auslese und über Bluetooth 
auf den PC übertrage. Ich habe die Breakout Boards von Sparkfun im 
Einsatz (SEN-09723). Ansteuerung habe ich über SPI realisiert. Es 
funktioniert auch alles soweit, nur ist mir folgendes aufgefallen:
x,y,z Werte stimmen nicht wenn ich auf den Erdmittelpunkt zeige. 
Normalerweise müssten dann ca. 9,81m/s² angezeigt werden. Ich habe jetz 
4 verschiedene Boards verwendet, aber es gibt immer eine Abweichung.
Die maximale Abweichung, die ich beobachtet habe beträgt immerhin fast 
1m/s² (Anzeigewert -10,8m/s²). In der "Gegenrichtung" bekomme ich ca. 
9m/s²
d.h. die Daten sind mit einem Offset von ca. 0,9m/s² behaftet.
Falls ich das richtig im Datenblatt gelesen habe, wird der Sensor 
werkskalibriert ausgeliefert, allerdings gilt diese Kalibrierung nur für 
mode_config=00 (ich benutze diesen Modus). Weiters steht, dass es durch 
Veränderungen des Offsets kommen kann, wenn der Sensor auf einen Print 
gelötet wird. Kann es sein, dass durch diesen Prozess ein Offset von 
1m/s² zustande kommt?
Hat jemand einen Vorschlag, was man hier machen könnte?
Kommt man um eine Kalibrierung herum?
Gibt es vielleicht Sensoren, die nicht kalibriert werden müssen oder 
einen geringeren Offset haben?
Übrigens, ich habe auch die Temperaturen von 4 verschiedenen Boards 
ausgelesen -> Temperatur reichte von 23°C bis 27°C.
Zum Auslesen habe ich ein und dasselbe "Testboard" benutzt, habe nur die 
Breakout Boards umgesteckt, also Hard- und Software sind immer 
dieselben.

Freue mich auf ein Feedback von euch

Gruß
Christian

von Guido Körber (Gast)


Lesenswert?

Also der Offset ist definitiv zu groß. Hast Du da vielleicht 
Ausschussware angedreht bekommen?

Welchen Messbereich benutzt Du und filterst Du die Werte die vom Sensor 
kommen noch? In den kleinen Messbereichen wird nämlich das Rauschen 
relativ heftig, da sollte man dann noch ein Filter drauf packen.

Sind auf dem Bord die Kondensatoren direkt am Sensor mit drauf?

von Christian S. (swoc)


Lesenswert?

Hallo Guido

Danke für deinen Beitrag.

Das sind meine Einstellungen:
Messbereich: +/-2g
Modus: Low noise mode (Standard Modus)
Bandwidth: 10Hz
Sample skipping ist aktiviert -> Interrupt wird 20mal pro Sekunde 
generiert

Die Breakoutboars habe ich von Waterott bestellt
-> http://www.watterott.com/de/Breakout-Board-BMA180
Die Kondensatoren sind ca. 2mm vom jeweiligen Pin entfernt

Hier ist der Code für 1mal auslesen + Umrechnung:
    while (!PIF4);  //auf Interrupt warten
    PIF4 = 0;

    CS_BMA180 = 0;

    SPIWriteByte(0x82);         //Write control byte to BMA180 
Read, start address 0x02 -> x-Achse LSB

    x_LSB = SPIReadByte();
    x_MSB = SPIReadByte();
    y_LSB = SPIReadByte();
    y_MSB = SPIReadByte();
    z_LSB = SPIReadByte();
    z_MSB = SPIReadByte();
    temp = SPIReadByte();

    CS_BMA180 = 1;

    if (x_MSB >> 7)
      x = - (0x2000 - ((x_MSB & 0x7F) << 6) | (x_LSB >> 2));
    else
      x = ((x_MSB & 0x7F) << 6) | (x_LSB >> 2);

    if (y_MSB >> 7)
      y = - (0x2000 - ((y_MSB & 0x7F) << 6) | (y_LSB >> 2));
    else
      y = ((y_MSB & 0x7F) << 6) | (y_LSB >> 2);

    if (z_MSB >> 7)
      z = - (0x2000 - ((z_MSB & 0x7F) << 6) | (z_LSB >> 2));
    else
      z = ((z_MSB & 0x7F) << 6) | (z_LSB >> 2);

Ich habe in der Zwischenzeit 4 Boards getestet:
eines zeigt auf allen 3 Achsen große Abweichungen (~60mg)
eines zeigt nur auf einer Achse eine große Abweichung (~40mg)
eines stimmt relativ genau (Abweichung bei einer Achse ~20mg)
eines würde ich als genau bezeichnen

Hier noch ein Auszug aus den Registern (nach der Initialisierung), 
vielleicht ist das auch noch hilfreich
Adresse Inhalt
0x00    0x03    0b00000011
0x01    0x14    0b00010100
0x02    0x1D    0b00011101
0x03    0x0E    0b00001110
0x04    0x2D    0b00101101
0x05    0xFD    0b11111101
0x06    0xF1    0b11110001
0x07    0x3F    0b00111111
0x08    0x04    0b00000100
0x09    0x00    0b00000000
0x0A    0x00    0b00000000
0x0B    0x00    0b00000000
0x0C    0x00    0b00000000
0x0D    0x10    0b00010000
0x0E    0x00    0b00000000
0x0F    0x00    0b00000000
0x10    0x00    0b00000000
0x20    0x08    0b00001000
0x21    0x04    0b00000100
0x22    0x15    0b00010101
0x23    0x00    0b00000000
0x24    0xEE    0b11101110
0x25    0xEE    0b11101110
0x26    0xA0    0b10100000
0x27    0x65    0b01100101
0x28    0x00    0b00000000
0x29    0x17    0b00010111
0x2A    0x50    0b01010000
0x2B    0x00    0b00000000
0x2C    0x4D    0b01001101
0x2D    0x54    0b01010100
0x2E    0x75    0b01110101
0x2F    0xA6    0b10100110
0x30    0x88    0b10001000
0x31    0x84    0b10000100
0x32    0xA4    0b10100100
0x33    0xAC    0b10101100
0x34    0xAA    0b10101010
0x35    0x25    0b00100101
0x36    0x56    0b01010110
0x37    0x6A    0b01101010
0x38    0x7C    0b01111100
0x39    0x6A    0b01101010
0x3A    0x68    0b01101000

Gruß
Christian

von Guido Körber (Gast)


Lesenswert?

Bei 60mg Abweichung kann das auch gut eine mechanische Abweichung durch 
die Montage auf den Boards sein, das Lot stellt ja nicht absolut sicher, 
dass die Sensoren immer ganz genau grade sitzen. Dazu kommt dann noch 
der Offsetfehler des Sensors.

Ich würde es mal mit einer Nullpunktkalibrierung versuchen.

von Christian S. (swoc)


Lesenswert?

das werde ich mal versuchen
Vielen Dank für deine Hilfe

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.