Forum: Mikrocontroller und Digitale Elektronik BMA020 Beschleunigungssensor


von Michael G. (groebar)


Angehängte Dateien:

Lesenswert?

http://media.digikey.com/pdf/Data%20Sheets/Bosch/BMA020.pdf
http://www.mikrocontroller.net/articles/BMA020
So, hallo wieder mal :D
Hier drüber ist gleich mal das Datenblatt von dem Sensor um den es geht!
1
Initialisierung (Funktioniert auch, nur ein Teil davon, weil ich auch LCD und Abstands-sensor initialisiere!)
2
//Einrichten Beschleunigungssensor, bit 7-5 von Register 0x14 müssen gespeichert werden !  
3
uint8_t control;
4
i2c_start(addr_asens_norm + I2C_WRITE);      
5
  i2c_write(0x14);                  
6
  i2c_rep_start(addr_asens_norm + I2C_READ);  
7
  control=i2c_readAck();
8
  control=control & 0xE0;        // save bits 7,6,5    
9
  control = control | (0x02 << 3);   // Range 8G (10)
10
    control = control | 0x06;          // Bandwidth 25 Hz 000
11
  i2c_rep_start(addr_asens_norm + I2C_WRITE);
12
  i2c_write(0x14);
13
  i2c_write(control);
14
15
  i2c_rep_start(addr_asens_norm + I2C_READ);
16
  i2c_write(0x15);
17
  control=i2c_readAck();
18
  control=control & 0x80;        //Save Default settings  (SPI4=1)
19
  control|=(1<<5);
20
  i2c_rep_start(addr_asens_norm + I2C_WRITE);
21
  i2c_write(0x15);
22
  i2c_write(control);
23
  i2c_stop();  
24
//END a_sens
25
26
27
void messung_asens_pointer_interrupt(int *pointer_asens)
28
{
29
  int messwert;
30
  unsigned char HiB,LoB;    
31
  i2c_start_wait(addr_asens_norm + I2C_WRITE);      //Start Sequenz, Asens-Adresse + Write-Bit
32
  i2c_write(0x02);                    //Register wird ausgewählt
33
                              //Register werden automatisch um 1 inkrementiert
34
                              //wenn es ausgelesen wird 
35
  i2c_rep_start(addr_asens_norm + I2C_READ);
36
      
37
  for(char i=0;i<3;i++)
38
  {
39
    LoB = (i2c_readAck()>>6);                //LoB=0b0000 00XX
40
    HiB = i2c_readAck();                  //HiB=0bXXXX XXXX
41
42
    messwert=HiB;
43
    messwert=(messwert<<2);   
44
    messwert=messwert+LoB;
45
46
47
    if(messwert<512)  
48
    messwert = messwert*4;            //Messwert mit 1000 Multipliziert!0b00 0000 0001 = 0,004 normalerweise!
49
50
    else
51
    {
52
      messwert = (messwert-512)*4 - 2000;
53
      messwert = -messwert;            //Negatives Vorzeichen Setzen!  
54
    }
55
  
56
    *pointer_asens=messwert;
57
    pointer_asens++;             
58
  }
59
}
60
61
62
//Hauptprogramm, starten der Messung 
63
64
messung_asens_pointer_interrupt(&(asens_messwert[0]));

So.. das Problem ist folgendes:
Ich bekomme die Daten schon (fast) richtig raus -.-
Also wenn g=0 ist in der realität spuckt mir das Programm in das Array 
Werte +/- 50 ungefähr (in g*1000)

Wenn ich den Sensor aber jetzt so halte dass auf einer Achse die 
komplette Erdbeschleunigung sein sollte, kommt ungefähr der Wert 260-280 
raus...
Und ich weiß einfach nicht warum.....

Eigentlich müsste ja +/- 1000 ungefähr rauskommen!


Bitte falls Ihr noch irgendwas brauchen solltet, nicht zögern zu fragen 
:D
Aber ich spinn schön langsam total ^^

Lg, Groebar

PS: Achso, am Sensor liegt es wahrscheinlich nicht, ich hab zwei hier 
liegen, wobei ich bei dem einen beim ersten mal die "NEVER ever change 
these Register" gechanged hab (14h).. deswegen dachte ich dass die Werte 
bei dem anderen daran liegen und hab mir einen neuen organisiert!


Edith:

Achso, ich hab natürlich wieder mal die hälfte vergessen...
Ich programmier mit AVR Studio4,
Code in C (^^)
Atmega8
USB-Programmer

Kontaktiert sollte alles richtig sein, mit anderen Programmen läuft es, 
Abstandsensor beispielsweise wird richtig verwendet...
Ich häng auch gleich noch ein bild dran wo ich markier wie ich den 
beschleunigungssensor kontaktiert habe...

von Stefan (Gast)


Lesenswert?

Im Sourc steht, dass Du den Range 8G gewählt hast (wobei ich die 
Register-Werte nicht kontrolliert habe).

Der Sensor hat 10 Bit, die Erdanziehungskraft ist 1/8 von 8G, also 
liefert der Sensor 1/8 von seinem Maximalwert bzw Minimalwert (je nach 
Richtung).

Der Sensor liefert Werte von -512 bis +511 (entsprechend 10 Bit). Ein 
Achten davon ist -64 oder +63.

Du multiplizierst den Wert mit 4, bekommst also -256 oder +252 heraus.

Also ist Dein Ergebnis von 260 bis 280 nahe an dem, was erwartet wird.

von Michael G. (groebar)


Lesenswert?

OMG omg omg omg :D

Vielen vielen dank :D

Da hätt ich wahrscheinlich noch ewig am Programm herumgeschrieben -.-

Noch eine Frage, er funktioniert jetzt soweit, aber die Werte sind etwas 
komisch...

Achse  |  positiv  |  negativ
-------------------------------
  X    |   1000    |  - 820
  Y    |    960    |  -1000
  Z    |   1100    |  - 910

Werte in g*1000
Sind ungefähr Werte, pendeln so um die +/-40 was ich so erkenne am 
Display :D

Irgendwelche Ideen an was das liegen kann, also, ist da einfach der 
Sensor so "schlecht", oder kann das an mir liegen?

lg Groebar

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.