BMA180 I2C Beschleunigungssensor kalibrieren

Hallo,
ich befasse mich gerade mit dem Beschleunigungssensor BMA180.
Zum Einstieg baue ich auf folgenden Sketch auf:

Mir scheint, dass die ausgegebenen Werte zu stark schwanken:
Liegt der Sensor ruhig auf der Tischplatte erreicht Z-Wert ein Maximum von ca. 4300
Sollte beim normalen Liegen aber nicht ein Max-Wert von 4096 erreichbar sein?

Eine der anderen Achsen liegt +/- bei einem Wert von 300
Dass der Wert nicht 0 ist, liegt wahrscheinlich daran, dass der Sensor nicht genau in der Waagrechten liegt.
Soweit so gut, aber nun schwankt dieser Wert meines Erachtens doch erheblich; +/- um einen Wert von 50!
In Summe also eine Spanne von 100 Werte-Punkten.

Ist das normal????

Oder muß ich den Sensor kalibrieren? Und wenn wie?

Mein Projekt soll nämlich eine Winkeldifferenzberechnung von 2 getrennten Messungen mit einer Genauigkeit von 0,1° erreichen:
Sensor anlegen -> Messung -> Sensor an 2ten Messpunkt geben -> neue Messung -> Differenz berechnen

Kann ich die Genauigkeit erhöhen?
Mit welchem Wert auf welchem Speicher auf dem Sensor?

Danke im Voraus für Eure Hilfe
Reinhard

Hallo,
wenn ich das lese:

Alle Parameter und Funktionen sind vom Benutzer programmierbar
7 vom Benutzer programmierbare Schwerkraft-Messbereiche und 10 wählbare Bandbreiteneinstellungen
geringe Leistungsaufnahme
extrem energiesparender Self-Wake-Up-Modus
vom Benutzer programmierbare Interrupt-Engine
Zero-g-Offset-Regelung und Offset-Neukalibrierung im Feld mit extrem hoher Genauigkeit

dann wirst Du dem wohl etwas beibringen müssen:

Hier kannst Du Dich ja mal austoben:
http://www.geeetech.com/wiki/index.php/BMA180_Triple_Axis_Accelerometer_Breakout
und hier
http://arduino-hannover.de/tag/bma180/

Datenblatt:

KÖNNT IHR NICHT MAL SELBER SUCHEN ?
Gruß und Spaß
Andreas

Hallo lieber Andreas,
danke für Deine schnelle Antwort.

Tja, das mit dem Suchen ist halt so ne Sache. Tatsächlich hatte ich schon die 3 Links gefunden....
Ich bin aber halt ein Noob!
So hab ich die einzige deutsche (Hanover...) gleich mal aussortiert, weil sie bei mir nicht funktionierte. Im Nachhinein wars mein Fehler: eine kalte Lötstelle! :roll_eyes:
Aber da war die Seite schon hinter meinem Horizont verschwunden. :wink:
Die anderen sind halt in Englisch, und da bin ich schon beim Kern des Problems...
Bei meinem Semester waren Englisch und erst recht Computer in der Schule nicht wirklich Thema.
Und jetzt noch ein supertechnisches englisches Datenblatt!!!!

Da bitte ich um Nachsicht!
Ich hatte gehofft, dass jemand, der sich auch schon durch diese Materie gekämpft hat, mir ein paar konkrete Vorschläge machen könnte, (z.B.: Register XY ; Wert yz).

Gruß zurück...
... und der Spaß wird schon wieder kommen, wenns funktioniert!

Reinhard

Hallo,
also dieser Code läuft bei mir in der IDE, hast Du den probiert. Und wenn ja, was funktioniert dann nicht?

//BMA180 triple axis accelerometer sample code//
//www.geeetech.com//
//
#include <Wire.h> 
#define BMA180 0x40  //address of the accelerometer
#define RESET 0x10   
#define PWR 0x0D
#define BW 0X20
#define RANGE 0X35
#define DATA 0x02
//
int offx = 31;  
int offy = 47;   
int offz = -23; 
// 
void setup() 
{ 
 Serial.begin(9600); 
 Wire.begin(); 
 Serial.println("Demo started, initializing sensors"); 
 AccelerometerInit(); 
 Serial.println("Sensors have been initialized"); 
} 
//
void AccelerometerInit() 
//
{ 
 byte temp[1];
 byte temp1;
  //
  writeTo(BMA180,RESET,0xB6);
  //wake up mode
  writeTo(BMA180,PWR,0x10);
  // low pass filter,
  readFrom(BMA180, BW,1,temp);
  temp1=temp[0]&0x0F;
  writeTo(BMA180, BW, temp1);   
  // range +/- 2g 
  readFrom(BMA180, RANGE, 1 ,temp);  
  temp1=(temp[0]&0xF1) | 0x04;
  writeTo(BMA180,RANGE,temp1);
}
//
void AccelerometerRead() 
{ 
 // read in the 3 axis data, each one is 14 bits 
 // print the data to terminal 
 int n=6;
 byte result[5];
 readFrom(BMA180, DATA, n , result);
 
 int x= (( result[0] | result[1]<<8)>>2)+offx ;
 float x1=x/4096.0;
 Serial.print("x=");
 Serial.print(x1);
 Serial.print("g"); 
 //
 int y= (( result[2] | result[3]<<8 )>>2)+offy;
 float y1=y/4096.0;
 Serial.print(",y=");
 Serial.print(y1);
 Serial.print("g"); 
 //
 int z= (( result[4] | result[5]<<8 )>>2)+offz;
 float z1=z/4096.0;
 Serial.print(",z=");
 Serial.print(z1);
 Serial.println("g"); 
}
//
void loop() 
{ 
 AccelerometerRead(); 
 delay(300); // slow down output   
}
//
//---------------- Functions--------------------
//Writes val to address register on ACC
void writeTo(int DEVICE, byte address, byte val) 
{
  Wire.beginTransmission(DEVICE);   //start transmission to ACC
  Wire.write(address);               //send register address
  Wire.write(val);                   //send value to write
  Wire.endTransmission();           //end trnsmisson
}
//reads num bytes starting from address register in to buff array
 void readFrom(int DEVICE, byte address , int num ,byte buff[])
 {
 Wire.beginTransmission(DEVICE); //start transmission to ACC
 Wire.write(address);            //send reguster address
 Wire.endTransmission();        //end transmission
 
 Wire.beginTransmission(DEVICE); //start transmission to ACC
 Wire.requestFrom(DEVICE,num);  //request 6 bits from ACC
 
 int i=0;
 while(Wire.available())        //ACC may abnormal
 {
 buff[i] =Wire.read();        //receive a byte
 i++;
 }
 Wire.endTransmission();         //end transmission
 }

Gruß und Spaß
Andreas

Hallo,

Und wenn ja, was funktioniert dann nicht?

Die Kommunikation mit dem Sensor an sich funktioniert tadellos.
Allerdings machen mich die doch deutlich schwankenden Werte stutzig (oder ist das normal?) und auch die effektiven Werte.
Sollte bei ruhig liegendem Sensor nicht ein Max-Wert von 4096 ( = 1g ) vorliegen? Bei mir sind´s ein bischen über 4300!

Die offxyz-Werte in Deinem Sketch, sind das vorgegeben Werte oder durch Try&Error-Experimente ermittelte Werte?

Die Filterbandbreite-Einstellungen haben sich mir auch noch nicht ganz erschlossen. :blush:
Welchen Wert sollte ich setzen, um eine möglichst genaue Messung zu erhalten (oder weiß jemand ein deutschsprachiges Tutorial?).
Die Anwendung ist null zeitkritisch und der Sensor wird beim Messen auch nicht bewegt.

Danke im Voraus für die Hilfe
Reinhard

PS.: @Andreas: Deinen Code werd ich heut Abend probieren... thx

Hallo,
Das "zappeln" Deiner Werte kannst Du vermeiden, wenn Du den Sensor nur zu einer
bestimmten Zeit (alle 1sec, 0.5sec) ausliest.

Dann würde ich den Sensor einmal fixieren, damit der wirklich fest liegt.

"In Summe also eine Spanne von 100 Werte-Punkten"
"Sensor nicht ein Max-Wert von 4096 ( = 1g ) vorliegen?"

Der Sensor liefert eine Fehler von +/- 1°

Was hat Deine "50 / 4300" denn für eine Einheit?
Bei DEM- Ding, läuft ohne Datenblatt nichts.
Gruß und Spaß
Andreas

Hallo Andreas,

jetzt hab ich mal Deinen Sketch raufgeladen.
Der x-Wert schwankt zwischen 0,00g und 0,10g
Das kann doch wirklich nicht das Beste sein, was man rausholen kann?
Das muß doch besser gehen.... aber wie?

Oder ist eine so große Abweichung normal??????

PS.: der Sensor ist fix auf dem Bradboard montiert!
Liegt also gaaaaanz ruhig und ohne Erschütterungen.

Hallo,
das ist nicht "mein" Sketch. Den habe ich mit C&P einfach eingefügt.
Was soll denn dieses "g" sein, g-Kraft? Dort liegt doch das normale
max bei 2 "und ein paar Kleine" Da sind doch 0,10g in "Ruhe" nicht schlecht.
Und in was für einer Auflösung wird denn der Wert geliefert? Wohl kaum
in 1/100g.
Wenn das Tatsächlich "genauer (0,05)" gehen sollte, dann kommst Du ohne das
Datenblatt nicht weiter. Lt. demselben kann der "nur" 0,125mg.
Dann sind Deine 0,10 doch gut!?
Gruß und Spaß
Andrea