Forum: Mikrocontroller und Digitale Elektronik Beschleunigungssensor Unklarheiten


von a.d (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich muss für ein Projekt einen Beschleunigungssensor Ansteuern.
Dies geschieht über I2C. Die Auswertung wird mit einem PIC der 16F-Serie 
abgewickelt.
Der Beschleunigungssensor ist der ADXL350 (Datasheet im Anhang). Der 
Beschleunigungssensor wird als Neigungsmesser benutzt. Er wird also auf 
einen Bereich von 1G (Erdbeschleunigung) eingestellt.

Nach der Verarbeitung möchte ich in einer Variable ein Wert in 
Stufenform (z.B
0..40), also z.B 40 Stufen, wo "20" die Mitte darstellt, "0" -90°, und 
"40" 90°. Es müssen auch nicht so feine Abstufungen sein, das Gerät ist 
ein Spiel, in dem ein Ball balanciert wird, es wird also nicht zum 
Messen o.ä. benutzt.

Ich bin mir jetzt nicht ganz sicher, wie das Ausgangssignal des Sensors 
aussieht, und wie es zu verarbeiten ist.
Fangen wir an beim 0g Wert (Winkel 0°). Stimmt es, dass dies die Hälfte 
des möglichen Maximumwertes ist (bei 10-Bit: 1024, also 512)? Und dann 
der Wert einfach Proportional bei minus nach unten und bei positiver 
Neigung nach oben variiert?

Und was mich auch noch verwirrt, ist, dass der Ausgang als 
Zweierkomplement ausgegeben wird. Ich meine, wenn der Ausgangswert 
zwischen 0 und 1023 sein sollte, dann hat man ja keine negativen Werte, 
braucht also kein 2er Komplement.

Auf jeden Fall ist der 10-Bit Wert auf 2 Register verteilt. Das untere 
Byte ist komplett in einem Register. Die oberen 2 Bits sind im 2. 
Register rechtsbündig (einstellbar). (Bei der Übertragung mit I2C bin 
ich davon ausgegangen, dass der Sensor autoincrement hat, also ins 
nächsthöhere Register springt (in dem Fall das Register mit den 2 MSB) 
nach einem empfangenen Byte mit Multiple Byte Read.)

Zum zusammenfügen habe ich zuerst die höherwertigen 2 Bits in einen 
signed int kopiert, anschliessend um 8 Stellen nach links geschoben. 
Dann das niederwertige Byte ODER Verknüpft. Somit sollte der 10-Bit Wert 
komplett sein. Stimmt das soweit?

Das Zweierkomplement hat ja das Vorzeichen als erstes Bit. Deshalb 
müsste also bei einem signed int das Vorzeichen auch an 16. Stelle sein 
meines Wissens nach. Also habe ich im Code mit Bitmanipulationen die 10. 
Stelle des Ausgabewerts auf die letzte Stelle verlegt.
Meiner Vorstellung nach sollte jetzt der Wert fertig verarbeitet sein.
(Bis auf die Abstufung). Was denkt ihr? Hoffe es ist einigermassen 
verständlich und jemand kann mir helfen. Vielen Dank.

von Wusel D. (stefanfrings_de)


Lesenswert?

Wegen dem Messbereich:

Die Erdanziehungskraft beträgt ungefähr 1G. Eine Achse des Sensors wird 
also schon in Ruhelage mit 1G beschleunigt, deswegen brauchst Du den 2G 
Meßbereich.

Ohne Beschleunigung liefern alle drei Achsen einen Wert um 0 (könnte 
auch -1 oder +1 sein).

> Das untere Byte ist komplett in einem Register.
> Die oberen 2 Bits sind im 2. Register rechtsbündig (einstellbar).

Du wirst also eine 16bit Integer Variable verwenden. Du musst dann nach 
dem Auslesen des Chips alle Bits nach ganz links schieben, damit das 
Vorzeichen Bit (das höchste Bit) an der Richtigen Stelle steht.

int i=read_sensor()<<6;

Nun erhälst Du Werte im Bereich -32768...+32767.

Bedenke dass der Sensor nicht den Neigungswinkel liefert, sondern die 
Erdanziehungskraft, die auf die drei Achsen liefert. Das kannst Du mit 
Winkelfunktionen umrechnen.

Stelle Dir ein Kugelförmiges Anzeigeinstrument vor. Im Zentrum befindet 
sich ein Punkt, wenn Schwerelosigkeit vorliegt. Aus dem Zentrum heraus 
wächst ein Zeiger, dessen Länge die Kraft anzeigt und der in Richtung 
der Kraft ziegt (also zum Fußboden).

Nun lege dieses Kugelförmige Anzeigeinstrument in ein gedachtes 
dreidimensionales Koordinatensystem. Im Zentrum ist der Nullpunkt. Die 
drei Messwerte des Sensors geben an, an welchen Punkt im 
Koordinatensystem die Spitze des Zeigers endet.

von Wusel D. (stefanfrings_de)


Lesenswert?

Wenn Du z.B. den Sensor ein bisschen nach links neigst, dann geht die 
Kraft nicht mehr senkrecht nach unten.
1
              +1G (Y-Achse)
2
              |
3
              |
4
              |
5
              |
6
              |
7
              |
8
-1G-----------O-----------+1G (X-Achse)
9
             /|
10
            / |
11
           /  |
12
          /   |
13
         *    |
14
              |
15
              -1G
Der Sensor liefert die Position der Spitze des Zeichers. Im Obigen Fall 
liefert er ungefähr die Werte X=-0,4, Y=-0,8 und Z=0 (die Z-Achse habe 
ich nicht eingezeichnet).

Wenn der Sensor um 90 Grad nach links geneigt wird, bekommst Du die 
Werte X=-1, Y=0 und Z=0.

von a.d (Gast)


Lesenswert?

Vielen Dank.
Also ich verwende ja zum Messen der Neigung nur die X-Achse.
Und die ist ja bei gerader Lage 0g, oder?
Muss ich trotzdem auf den 2g-Bereich einstellen? (wegen -1...0..+1=2?)

Und wenn ich den 10-Bit Wert im Zweierkomplement an die vorderste Stelle 
der 16-Bit Variable schiebe, dann erhalte ich direkt einen Wertebereich 
von
-32768...+32767 als Ausgang?
Lg

von a.d (Gast)


Lesenswert?

Könnte mir das noch jemand beantworten? Vielen Dank!

von Wusel D. (stefanfrings_de)


Lesenswert?

> Also ich verwende ja zum Messen der Neigung nur die X-Achse
> Und die ist ja bei gerader Lage 0g, oder?
Ja.

> Muss ich trotzdem auf den 2g-Bereich einstellen? (wegen -1...0..+1=2?)
Die Erdanziehungskraft kann auch etwas mehr als 1G betragen. Du willst 
sicher nicht schon bei weniger als 90° am "anschlag" sein.

By the way: Wenn Du die Y Achse nicht verwendest, kannst Du den 
Neigungswinkel nur ungefähr schätzen, weil die Erdanziehung nämlich 
nicht exakt 1G ist. Ich würde alle 3 Achsen verwenden und den >Winkel 
dann daraus berechnen. Dann ist es ganz egal, wie stark die Erdanziehung 
ist.

> Und wenn ich den 10-Bit Wert im Zweierkomplement an die vorderste
> Stelle der 16-Bit Variable schiebe, dann erhalte ich direkt einen
> Wertebereich von -32768...+32767 als Ausgang?
Ja, hab ich doch geschrieben.

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.