Forum: Mikrocontroller und Digitale Elektronik l3g4200d Atmega644 - GYRO driftet extrem ab


von Marc H. (martrixmarc)


Lesenswert?

Guten Morgen, ich habe zurzeit das Problem das der l3g4200d Gyro extrem 
abdriftet bei den messergebnissen. Ich verwende ihn derzeit in meinem 
Quoadcopter. Ziel ist es mit dem GYRO den Kopter stabiel zu halten, 
jedoch macht es genau das gegenteil.
1
void setupL3G4200D()
2
{
3
  setRegister(0x20, 0b00001111);
4
  setRegister(0x21, 0b00000000);
5
  setRegister(0x22, 0b00001000);
6
  setRegister(0x23, 0b00110000);
7
  setRegister(0x24, 0b00000000);
8
  
9
}
10
11
double x_end,y_end, z_end;
12
double fX, fY, fZ;
13
void getgyro()  //Messung + Ausgabe
14
{  
15
  twiStart();
16
  twiWriteByte(0xD2);
17
  twiWriteByte(0x29);
18
  //twiWriteByte(0x28);
19
  twiStop();
20
  twiStart();
21
  twiWriteByte(0xD3);
22
  x[0] = twiReadByteAck();
23
  x[1] = twiReadByteNoAck();
24
  x_end = ((x[1] << 8) | x[0]);
25
  fX = 0.0175*0.02 * x_end;
26
27
  twiStart();
28
  twiWriteByte(0xD2);
29
  twiWriteByte(0x2B);
30
  //twiWriteByte(0x2A);
31
  twiStop();
32
  twiStart();
33
  twiWriteByte(0xD3);
34
  y[0] = twiReadByteAck();
35
  y[1] = twiReadByteNoAck();
36
  y_end = ((y[1] << 8) | y[0]);
37
  fY = 0.0175*0.02 * y_end;
38
39
40
  twiStart();
41
  twiWriteByte(0xD2);
42
  twiWriteByte(0x2D);
43
  //twiWriteByte(0x2A);
44
  twiStop();
45
  twiStart();
46
  twiWriteByte(0xD3);
47
  z[0] = twiReadByteAck();
48
  z[1] = twiReadByteNoAck();
49
  z_end = ((z[1] << 8) | z[0]);
50
  fZ = 0.0175*0.02 * z_end;
51
52
}
53
54
int gyro_drift_x = 0;
55
int gyro_drift_y = 0;
56
int gyro_drift_z = 0;
57
58
void g_drift(int anzahl)
59
{
60
  int i = 0;
61
    for(i = 0; i<(anzahl+1); i++)
62
  {
63
     getgyro();
64
     gyro_drift_x += fX;
65
     gyro_drift_y += fY;
66
     gyro_drift_z += fZ;
67
  
68
    }
69
    gyro_drift_x = gyro_drift_x/anzahl;
70
    gyro_drift_y = gyro_drift_y/anzahl;
71
    gyro_drift_z = gyro_drift_z/anzahl;
72
}
73
74
float angle_x = 0, angle_y = 0, angle_z = 0;
75
76
angle_x += fX-gyro_drift_x;
77
angle_y += fY-gyro_drift_y;
78
angle_z += fZ-gyro_drift_z;


Das sind die Programmteile wo der GYRO enthalten ist. Hat jemand von 
euch vieleicht verbesserungsvorschläge?

Bei g_drift verwende ich als anzahl 250.

mfg Marc

von <Inser random name> (Gast)


Lesenswert?

Das ist bei Gyros einfach so, mit einem zusätzlichen 
Beschleunigungssensor kann du mit Sensordatenfusion den Fehler 
minimieren.

von Marc H. (martrixmarc)


Lesenswert?

Danke, wie meinst du das denn genau? :)

mfg Marc

von Rangi J. (rangi)


Lesenswert?

Wie wäre es mit Kalibrierung im Ruhezustand? Einfach 100000 Werte 
aufzeichnen, Mittelwert bilden, speichern und zukünftig drauf rechnen.

von Alex S. (thor368)


Lesenswert?

Stichwort Kalmanfilter.

Allerdings sind die MEMS Gyros normalerweise sehr stabil. Hast du einen 
konstanten drift auf den Achsen? Den kannst du weg subrahieren wie rangi 
schon gesagt hat.

Ist der drift veränderlich solltest du das mal mit den Tolleranzen im 
Datenblatt abgleichen. Sollte da was im Busch sein könnte es mechansiche 
Ursachen geben (extreme Vibrationen) oder Software (falsch 
konfiguriertes Gyro).

Gruß
Thor

von Rangi J. (rangi)


Lesenswert?

Kalmanfilter auf einem 8Bit Mega rechnen? kann gehen aber ich glaube 
nicht, das dann noch Rechenzeit übrig bleibt.
Ausserdem ist der Kalman gegen solche systematischen Fehler wirkungslos. 
Wenn der Sensor schon sagt, ich drehe mich, wird der Kalman das am Ende 
auch glauben.

von Marc H. (martrixmarc)


Lesenswert?

Also es ist sehr komisch das Verhalten
Wenn der Kopter nach rechts dreht verschiebt sich die 0 grad linie nach 
rechts, wenn ich ihn nach links bewege, wandert die 0 grad linie wieder 
nach links, aber eben nicht immer und irgendwann ist es dann so schlimm 
das er 90 grad schräg steht und meint das es sich hier um die 0grad 
linie handelt.

von Pandur S. (jetztnicht)


Lesenswert?

> double x_end,y_end, z_end;
double fX, fY, fZ;
void getgyro()  //Messung + Ausgabe

vergiss double mal ganz schnell. Vergiss Float auch gleich. Beide sind 
voellig sinnlos. Verwende anstelle Longint, 32 bit signed.

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.