Hallo, habe folgendes Problem: Der ADXL345 liefert mir einen Messwert, diesen möchte ich in g [m/s^2] umrechnen um dann den Neigungswinkel zu bestimmen. Laut Datenblatt hat der Messwert eine Auflösung von 10 Bit. Den Messbereich habe ich auf +/- 4 g eingestellt. Dann sollte die Umrechnung doch nach folgender Formel durchzuführen sein: g[m/s^2]= messwert * (messbereich/2^10) (Für meinem Fall: messwert * 8/1024) Als Ergebnis bekomme ich in Nulllage 0 m/s^2 (ok), um 90° geneigt +/- 2 g. Ich hatte jedoch eigentlich +/- 4 g erwartet!? Oder liege ich da falsch? Danke!!!
Kleiner Tip am Rande: 1g (eine Erdbeschleunigung) sind rund 10m*s^-2 bzw 10N/kg
Was soll mir das bringen? Das weiß ich auch das 1g 9.81 m/s^2 entspricht...
Andreas schrieb: > Hallo, > habe folgendes Problem: > Der ADXL345 liefert mir einen Messwert, diesen möchte ich in g [m/s^2] > umrechnen um dann den Neigungswinkel zu bestimmen. > Laut Datenblatt hat der Messwert eine Auflösung von 10 Bit. Den > Messbereich habe ich auf +/- 4 g eingestellt. > > Dann sollte die Umrechnung doch nach folgender Formel durchzuführen > sein: > g[m/s^2]= messwert * (messbereich/2^10) > (Für meinem Fall: messwert * 8/1024) > > Als Ergebnis bekomme ich in Nulllage 0 m/s^2 (ok), um 90° geneigt +/- 2 > g. Ich hatte jedoch eigentlich +/- 4 g erwartet!? > > Oder liege ich da falsch? > Danke!!! Hallo, sicher dass das FULL_RES Bit auch auf 0 gesetzt ist, da ansonsten 4 mg/LSB und das ist kompatibel mit der Messung von +-2 g (entspricht nach deiner Formel einem Messwert von 256 DU und damit etwa +- 1 g wie es auch sein sollte. Bye Matthias
Jetzt bin ich verwirrt. Wenn ich den Sensor um 90° kippe sollte dieser doch 1 g messen, wenn ich den Sensor parallel zum Boden halte (0°) sollte dieser 0 g messen. Ist das korrekt?
Andreas schrieb: > Jetzt bin ich verwirrt. > > Wenn ich den Sensor um 90° kippe sollte dieser doch 1 g messen, wenn ich > den Sensor parallel zum Boden halte (0°) sollte dieser 0 g messen. > > Ist das korrekt? Hallo, ja, in deinem Beispiel liefert er aber +- 2 g (und das sollte eigentlich aber +- 1 g sein, je nach Lage) bei 90 Grad und 0 g bei 0 Grad. Falls man nun deine Formel invertiert erhaelt man 2 g * 1024 / 8 = messwert ( = 256) was bei einer Aufloesung (FULL_RES Bit auf 1) von 4 mg/LSB nun etwa 1024 mg und damit 1 g liefert (was es auch sollte!). Bye Matthias
Ok danke. Das ganze funktioniert jetzt soweit, dass ich die richtigen Werte bekomme! Danke dafür! Mein nächstes Problem ist die Umrechnung in meinen Neigungswinkel. Das müsste über den arcsin zu realisieren sein: neigungswinkel=arcsin(messwert in g) Im Normalfall ohne Störungen messe ich ja max 1 g und damit der arcsin 90°, wenn jedoch Störungen auftreten (Vibrationen, Ruckeln) dann können Werte > 1 g auftreten und dafür ist der arcsin nicht mehr definiert. (Ziel ist ein selbstbalancierender Roboter)
Andreas schrieb: > Ok danke. Das ganze funktioniert jetzt soweit, dass ich die richtigen > Werte bekomme! > Danke dafür! > > Mein nächstes Problem ist die Umrechnung in meinen Neigungswinkel. > Das müsste über den arcsin zu realisieren sein: > > neigungswinkel=arcsin(messwert in g) > Das gilt aber nur dann wenn der Beschleunigungssensor nur geneigt (in Ruhe) ist und nicht auch noch beschleunigt wird. Es handelt sich ja auch um einen Beschleunigungssensor und nicht um einen Neigungssensor. > Im Normalfall ohne Störungen messe ich ja max 1 g und damit der arcsin > 90°, wenn jedoch Störungen auftreten (Vibrationen, Ruckeln) dann können > Werte > 1 g auftreten und dafür ist der arcsin nicht mehr definiert. > > (Ziel ist ein selbstbalancierender Roboter) Das ist ein gerne gemachter Fehler dass man einen Beschleunigungssensor in einem dynamischen System (Vibrationen und Bewegungen) nimmt und meint man koenne einen Neigungswinkel messen. Das was man messen kann ist die Staerke und Richtung (3-dimensional) einer Beschleunigung. Nur falls der Sensor selbst nicht beschleunigt wird kann man daraus eine Lage (und damit Neigung) ableiten. Falls man ein kinematisches Modell und die aktuellen Bewegungsablaeufe des Roboters kennt kann man versuchen diesen Einfluss auf die Beschleunigung (simple Vektorsubtraktion) herauszurechnen und anschliessend die Neigung zu berechnen. Bye Matthias
Ok danke. Das Problem war mir eigentlich bewusst, habe es jedoch verdrängt. Der nächste Schritt heißt also Messdaten von Beschleunigungssensor und Gyro fusionieren um einen stabilen Neigungswinkel zu bestimmen. http://www.gerold-online.de/cms/wheelie/mein-wheelie/quellcodes.html Die Quelle macht das über einen Kalmanfilter. Zur Vorhersage nimmt er den Wert aus dem Gyro, im Korrekturschritt den Wert aus dem Beschelunigungssensor. Ich kann jedoch keinerlei Systemmodell dahinter entdecken.
Du hasst doch ein 3 Achsen Sensor. Damit ist es genauer um eine Atan2(X,Y) zu verwenden um die neigungswinkel zu bekommen. Damit muss du auch nicht mehr die Werte Skalieren nach 1. Dass ist mein code :
1 | aXX=(adc5-4200); // 0 g = 4200 fur X-as |
2 | aYY=(adc6-4300); // 0 g = 4300 fur Y-as |
3 | winkel=atan2(aYY,-aXX)/M_PI*1800;//hieruit volgt dan de hoek |
Aber, wie schon gesagt, nur mit einen ADXL345 ein Balancierroboter zu regeln ist hochtst kompliziert, meisten nutzen auch noch eine Gyro sensor dabei.
Andreas schrieb: > Was soll mir das bringen? Ganz einfach: Wenn du deinen Sensor gemächlich in allen Richtungen trudeln läßt und die dabei aufgezeichneten Meßdaten als 3D-Vektoren aufträgst, müssen die alle auf einer Kugel liegen. Die Abweichung zwischen Rohdaten und der Kugel gibt dir deine Kalibrierfaktoren. Wenn der Mittelpunkt der Kugel nicht im Ursprung des Koord.-Systems liegt, hast du auch noch einen Offsetfehler.
Kalmann brauchst du meist gar nicht (für den Anfang weglassen). Nimm einfach den Gyro, errechne durch Integration den Winkel und kompensiere die Gyrodrift durch den Acc --> fertig. ArcSinus von irgendwas musst du nicht berechnen. Auf diese Weise habe ich meinen Quadro stabil bekommen. Fang erstmal einfach an und verbessere es später, wenn es erstmal einigermaßen funktioniert. Gruß
Achso: Im Ersten Schritt kannst du auch den ACC erstmal weglassen und nur mit dem Gyro arbeiten. Nach einiger Zeit (in der Regel im Bereich von einigen Sekunden) macht sich dann die Drift bemerkbar. Auf diese Weise balanciert er aber schonmal für ne Weile zuverlässig. Dann bekommst du auch ein Gefühl für die Drift. Anschließend durch Acc eine langsame Kompensation einfügen.
Korrektur: Für den ACC brauchst du natürlich schon den arcsin. Allerdings reicht es den mit einer linearen Gleichung anzunähern (spart Rechenpower). Leg die Tangente in einen Bereich in dem sich das Roboterchen in etwa neigen wird. Riesige Winkel wird es wohl kaum geben (dann ist der sicher schon längst umgekippt).
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.