Hallo zusammen, um die Lage eines Quadrocopters zu bestimmen möchte ich über einen Gyro wie aktuelle Lage/Winkel im verhältniss zur Startposition bestimmen. um diesen Wert möglichst genau zu bekommen lese ich bei dem MPU6000 die aktuelle Winkel-Geschwindigkeit, über das FiFo register aus und Intrigiere die. Dieser Vorgang Funktioniert auch so weit und ich erhalte Messwerte die eig nurnoch vom Rauschen verändert werden. jedoch erhalte ich immer wieder ganze FIfo-Blöcke in denen einfach komplett falsche Zahlen drinnen stehen. hat einer von euch eine Idee warum immer wieder das gesamte FiF voll mit falsche Werte ist? Programm logig : Gyro Fehler berechen (200 Messwerte) FIFO_enable While (1){ ... Fifo counter auslesen //wie Viele FIFO werte insgesammt vorhanden sind FOR (Counter /6 ){//(da pro sample 6 gyrowerte gespeichert werden g,y,z) FIFO Burst read mit 6 Byts // auslesen eines Samples Daten berechnen und aufsummieren } } nun kommt es vor das alle werte die aus solch einer FOR-Schleife ausgelesen werden komplett falsch sind
Ich weiß es auich nicht - Vorzeichenfehler vieleicht? Ansonsten würde ich erstmal abgucken, wie die das gemacht haben: http://www.multiwii.com/Software (ganz unten ist ein Link zum Quelltext)
gegen einen Vorzeichen Fehler / Logigfehler spricht, dass normaler weise die richtigen werte ausgelesen werden. wo genau bei dem Code ist Gyro stelle?
:
Bearbeitet durch User
ich hänge mal 2 Beispiele als Anhang hinzu welche werte ich durhc einmal FIFO auslesen erhalte
Wie sieht deine Initialisierung vom mpu aus?
Der Sensor wird folgernder Maßen Initialisiert Sensor_reset(); Sensor_cykle(); Sensor_sleep_disable(); gyro_kalibrieren(); // falsch Messungen analysieren fifo_enable();
Vielleicht auch etwas genauer? Was verbirgt sich hinter den Funktionen? Welche Register werden wie beschrieben?
Sebastian Balz schrieb: > ich hänge mal 2 Beispiele als Anhang hinzu welche werte ich durhc einmal > FIFO auslesen erhalte Wenn man den 2. Satz genau ansieht, dann haben die Wetre jeweils 0x00 als low Byte. Off-by-one im FiFo?
wie meinst du Off-by-one? Sensor_reset(); Register : 107 Inhalt: 128 Sensor_cykle(); Register : 107 Inhalt: 32 Sensor_sleep_disable(); Register : 107 Inhalt: 0 // Kein Speep etc... gyro_kalibrieren(); // falsch Messungen analysieren //liest "XXX" sensortwerte beim Start einmalig , um dadurch den mittleren Fehler zu bestimmen. fifo_enable(); Register : 106 Inhalt: 64 //fifo Enbale Register : 35 Inhalt: 112 //XYZ Achsen enable
Bitte etwas detaillierter. Und gewöhnt dir mal Hex-Schreibweise an und nicht dezimal, kann ja keine lesen :) Mit hex sieht man sofort welche Bits gesetzt sind. Und irgendwie glaube ich immernoch dass du uns verheimlichst was tatsächlich in den Registern landet. Ich schreibe ja auch nicht "ich initialisiere meinen Sensor folgendermaßen: init_mpu6050()"
:
Bearbeitet durch User
Mein Eindruck von dem MPU-6000 ist, dass der wohl scheinbar Bugs hat. Das aktuelle Datenblatt enthält weniger Features als ältere Versionen, da wurde wohl scheinbar im nachhinein was rauskorrigiert was nicht ganz wie erwartet funktioniert hat. Ein Ersatz wäre der MPU-9250. Oder vielleicht auch ein BMI-055 von Bosch. Aber während der MPU-9250 schon schwierig von Hand zu löten ist, den BMI-055 kann man garnicht mehr konventionell löten.
Ich schreibe es so da der Prozessor ein AT32 ist und der Register Syntax komplett anders ist als bei den AVR-Prozessoren ist. das mit den Hex-Zahlen läst sich einrichten. für den Fall das es wirklich notwendig den Sensor zu ersetzen wäre es mir wichtig das der Gyro ein möglichst geringes Rauschen hat. Beim BMI-055 finde den Rauschfaktor aber zum MPU 9250 nicht. hatt da einer einen Wert bzw Erfahrung mit dem Sensor?
Schau mal erstmal, ob Du ein älteres Datenblatt findest und was dort zu den FIFOs steht. FIFO hatten wir garnicht benutzt, unser Controller war sehr schnell wach und den SPI haben wir auf 10MHz laufen lassen. Aber das Wecken per Schwellwert des Beschleunigungs-Sensors und zumindest das wurde entfernt.
okay, man könnte natürlich den Fifo weglassen oder "Kaputte werte" weg filtern, aber das is ja auch nicht Sinn der Sache. und die genauichkeit geht dabei Flöten. leider habe ich nur die i2C (twi) Variante. und mir steht ein Max Frequenz ca 10 - 40 khz zu. kann der überhaupt so viel? ich dachte die max-Sample-Rate läge bei 8mhz
:
Bearbeitet durch User
Der MPU-6050 hat nur I2C, der MPU-6000 hat SPI und ist damit viel schneller.
Datenblatt Seite 10, 400kHz mit I2C und 1MHz für SPI bei allen Registern plus bis 20MHz für die Sensor und Interrupt Register.
um die Hex-Werte noch nachzureichen :) [0] 0x000000c8 int@0x0014 [1] 0xffffc000 int@0x0018 [2] 0xffffb900 int@0x001c [3] 0xffffaa00 int@0x0020 [4] 0xffffa200 int@0x0024 [5] 0xffff9b00 int@0x0028 [6] 0xffff9c00 int@0x002c [7] 0xffff9f00 int@0x0030 [8] 0xffffa200 int@0x0034 [9] 0xffffad00 int@0x0038 hier scheint es so das nach dem ersten Datensatz alle weiteren Werte "Falsch" sind. beim auslesen des nächsten FIFO-counters stimmen die werte aber wieder.
Wenn ich die Sample rate heruntersetzen würde, würde der Sensor mir den aktuellen wert ausgeben, oder den Durchschnitt seit der letzten Messung. und müsste dies nicht auch die Genauigkeit des Sensors erhöhen, da ich dann weniger Fehler durch eigen-rausche auslese ´(da weniger Messwerte)
Sebastian Balz schrieb: > und müsste dies nicht auch die Genauigkeit des Sensors erhöhen, da ich > dann weniger Fehler durch eigen-rausche auslese ´(da weniger Messwerte) Dann nehm ich eine Messung vor und die stimmt dann....neeee, so nicht! Das Rauschen ist doch immer da, auch wenn du nur einen verrauschten Wert aufnimmst...da wird nix besser...
aber müsste sich das im Sensor dann nicht selber filtern bzw negiert sich das Rauschen direkt an der quelle nicht viel schneller ?
Da filtert sich nix selber. Du tastest nur zu einem Zeitpunkt ab. Der Wert ist ebenfalls so verrauscht, als würdest du mehrfach abtasten, stochastisch gesehen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.