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