Ich werde mal ein paar Messungen zum Vergleich machen.
Was verstehst du unter PLL Source? Ich finde es komisch das der einte Gyro praktisch keinen Drift hat und der andere so extrem.
Eine Idee wäre noch, nicht die Fixe Kurve zu verwenden, sondern beim Start den Start Offset und Temperatur speichern und danach anhand der Temperaturdifferenz zum Start und dem Start Offset den korrigierten Offset anhand der Kurve berechnen. Ich hoffe du verstehst was ich meine
Das Problem ist mir auch erst jetzt aufgefallen mit dem kleinen ACC Anteil (0.001) beim Komplementärfilter, jetzt hat der ACC-Anteil zu wenig "Kraft" den Winkel zu korrigieren und er läuft mir langsam davon wenn der Gyro wegdriftet... bei einem Anteil von 0.02 hatte der ACC genug "Kraft" den Absoluten Winkel zu korrigieren, obwohl der Gyro langsam wegdriftete....
Ja es wäre sehr intresssant einen Vergleich zu haben. Ich mache einfach einmal pro Sekunde einen Mittelwert und zeichne diesen auf
Hier mal ein paar Code Ausschnitte:
Code:
Dim LSB as Byte
Dim MSB as Byte
Dim Gyr_X as Integer
Dim Gyr_Y as Integer
Dim Gyr_Z as Integer
Dim Temperatur as Integer
Dim Gyr_X_Offset as Integer
Dim Gyr_Y_Offset as Integer
Dim Gyr_Z_Offset as Integer
Dim Gyr_X_Offset_Sum as Long
Dim Gyr_Y_Offset_Sum as Long
Dim Gyr_Z_Offset_Sum as Long
Dim i as Word
'Offset berechnen, Mittelwert aus 300 Messungen
Gyr_X_Offset_Sum = 0
Gyr_Y_Offset_Sum = 0
Gyr_Z_Offset_Sum = 0
For i = 1 to 300
gosub MPU6050_READ
Gyr_X_Offset_Sum = Gyr_X_Offset_Sum + Gyr_X
Gyr_Y_Offset_Sum = Gyr_Y_Offset_Sum + Gyr_Y
Gyr_Z_Offset_Sum = Gyr_Z_Offset_Sum + Gyr_Z
next
decr i
Gyr_X_Offset = Gyr_X_Offset_Sum / i
Gyr_Y_Offset = Gyr_Y_Offset_Sum / i
Gyr_Z_Offset = Gyr_Z_Offset_Sum / i
'---------- Beschleunigungssensor auslesen ----------
MPU6050_read:
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H3B 'Register h43 auswählen
I2cstop
I2cstart
I2cwbyte &HD1 'Leseadresse
I2crbyte Msb , Ack 'ACC X (Register 3B + 3C)
I2crbyte Lsb , Ack
ACC_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Y (Register 3D + 3E)
I2crbyte Lsb , Ack
ACC_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Z (Register 3F + 40)
I2crbyte Lsb , Ack
ACC_Z = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Temperatur (Register 41 + 42)
I2crbyte Lsb , Ack
Temperatur = Makeint(Lsb,Msb)
Temperatur = Temperatur / 34
Temperatur = Temperatur + 365
I2crbyte Msb , Ack 'Gyro X (Register 43 + 44)
I2crbyte Lsb , Ack
Gyr_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Y (Register 45 + 46)
I2crbyte Lsb , Ack
Gyr_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Z (Register 47 + 48)
I2crbyte Lsb , Nack
Gyr_Z = Makeint(Lsb,Msb)
Return
'---------- Beschleunigungssensor Initialisieren ----------
MPU6050_init:
'Sensor aktivieren
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H6B 'Register h6B Powermanagement
I2cwbyte &H00 'Wert 0 schreiben
I2cstop
waitms 200
Toggle LED_R
toggle LED_H
'Filter konfigurieren
' ACC Gyro
'Wert Bandbreite Delay Bandbreite Delay
'0 260Hz 0.0ms 256Hz 1.0ms
'1 184Hz 2.0ms 188Hz 1.9ms
'2 94Hz 3.0ms 98Hz 2.8ms
'3 44Hz 4.9ms 42Hz 4.8ms
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1A 'Register h1A Filter
I2cwbyte 6 'Wert schreiben
I2cstop
waitms 200
Toggle LED_R
toggle LED_H
'Gyro Bereich festlegen
'Wert Bereich
'0 +/- 250°/s
'8 +/- 500°/s
'16 +/- 1000°/s
'24 +/- 2000°/s
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1B 'Register h1B Gyro konfig
I2cwbyte 16 'Wert schreiben
I2cstop
waitms 200
Toggle LED_R
toggle LED_H
'ACC Bereich festlegen
'Wert Bereich
'0 +/- 2g
'8 +/- 4g
'16 +/- 8g
'24 +/- 16g
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1C 'Register h1C ACC konfig
I2cwbyte 0 'Wert schreiben
I2cstop
waitms 200
Toggle LED_R
Toggle LED_H
Return
Gruss Bluesmash
Lesezeichen