Forum: Mikrocontroller und Digitale Elektronik Beschleunigungssensor (ADXL345) Messwert in m/s^2 umrechnen


von Andreas (Gast)


Lesenswert?

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!!!

von René Z. (dens)


Lesenswert?

Kleiner Tip am Rande: 1g (eine Erdbeschleunigung) sind rund 10m*s^-2 bzw 
10N/kg

von Andreas (Gast)


Lesenswert?

Was soll mir das bringen?
Das weiß ich auch das 1g 9.81 m/s^2 entspricht...

von Matthias H. (mheininger)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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?

von Matthias H. (mheininger)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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)

von Matthias H. (mheininger)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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.

von Jan H. (jan_h74) Flattr this


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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.

von Oberlehrer (Gast)


Lesenswert?

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ß

von Oberlehrer (Gast)


Lesenswert?

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.

von Oberlehrer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.