Guten Tag,
ich habe vor mir einen Multiturn-Absolutwertdrehgeber, der sein
Messsignal graycodiert ausgibt. Ich versuche nun, die Multi- und die
Singleturndaten auszulesen und mittels eines Atmegas auf einem kleinen
Display auszugeben.
Die elektrische Anbindung des Sensors funktioniert bereits und in einem
entsprechenden Register des µC wird das Sensortelegramm richtig (noch
graycodiert) abgelegt. Geprüft habe ich dieses mit hilfe eines
Oszilloskops. Daher möchte ich hier einen Fehler zunächst ausschließen.
Das Telegramm besteht aus:
12 Bit Multiturninformation
18 Bit Singleturninformation
3 Bit Fehlerstatus.
Die drei Worte separiere ich aus dem Telegramm und wandele sie
anschließend in binäre Informationen um. Diese Umwandlung scheint auch
einwandfrei zu funktionieren, wie sich an nachgerechneten Einzelwerten
zeigen lässt.
Soweit scheint die Funktion gegeben zu sein.
Mein Problem:
Die primär interessanten Singleturnwerte verhalten sich jedoch
uneindeutig:
Drehe ich die Achse einmal vollständig herum, so wächst der graycodierte
Wert von 0 bis ca. 262000 an. Im Graycode zeigt sich das durch die
Wertfolge [000xxx001,...,100xxx000]. Die x sind Platzhalter für die
restlichen 12 Bit.
Überschreite ich den Rotationsanfangspunkt jedoch (>=360°), so fällt
dieser Wert nicht auf 0 zurück (wie zu erwarten), sondern wird von
262000 wieder von 262000 herab gezählt. Bei 0 wiederholt sich der
Vorgang, und der Sensor zählt wieder bis 262000 hinauf. Es entsteht eine
winkelabhängige "Dreiecksfunktion". Ein Nullwert wird immer erst nach 2
Vollumdrehungen erreicht.
Hat einer von euch schon einmal ein solches Verhalten gesehen und kann
mir sagen, wie ich hiermit umgehen kann? Ich würde einen Überlauf bei
>=360° erwarten, so dass der Zähler wieder bei 0 beginnt und ich somit
eine eindeutige Winkelzuordnung durchführen kann.
Ich hoffe sehr auf einen guten Tipp von euch.
MfG Maybert
Maybert schrieb: > Überschreite ich den Rotationsanfangspunkt jedoch (>=360°), so fällt > dieser Wert nicht auf 0 zurück (wie zu erwarten), sondern wird von > 262000 wieder von 262000 herab gezählt. So eine Spiegelung ist bei Gray-Code doch völlig richtig. Ein höherwertiges Bit ändert sich und alle darunterliegenden werden an dem Punkt gespiegelt.
Es darf ja nur immer ein Bit geändert werden. Ist die führende 1 gesetzt und der Rest 0 (1000xxx000), dann würde sich im nächsten Schritt die (hier fehlende) höherwertige 1 ändern, folglich darf sich die sichtbare Zahl NICHT ändern. Nachvollziebar wird das, wenn Du dir ein Bild zum Graycode suchst, wo die Bits mit Flächen (Hell/Dunkel) dargestellt werden. Deck die vorderste Spalte ab und suche Dir die Zeile, die 1000 der restlichen Stellen zeigt.
Hallo, vielen Dank an euch für die schnellen Antworten. ja, die Spiegelung der Bits ist mir nun klar. Nur, wie kann ich bei einem n-Bit Graycode einen binären "Überlauf" bei der Auswertung erzeugen? Denn einfach aus dem Singleturnwert lässt sich dieser nicht erzeugen. Am Beispiel eines 3-Bit Graycodes: gray - dezimal 0 000 - 000 0 001 - 001 0 011 - 002 0 010 - 003 0 110 - 004 0 111 - 005 0 101 - 006 0 100 - 007 --> Hier Überlauf, Dezimalzähler nullen --------- 1 100 - 008 1 101 - 009 ... Wenn ich die ersten 3 Bit des Graycode berechne, ist nicht ableitbar, dass nach der 007 wieder die 000 folgen soll. Auch wenn ich eine Veränderung des MSB berücksichtige und hier eine Umwandlung vornehmen würde, wäre das nicht eindeutig. Wie kann ich also z.B. die ersten 3 Bit Graycode so umwandeln, dass ein dezimales Zählen nur von 0,...,7 erfolgt und dieses eindeutig ist? Dafür muss! es doch mittlerweile eine Standardfunktion geben :) MlG Maybert Das muss doch eine Standardfunktion sein!
Maybert schrieb: > Wie kann ich also z.B. die ersten 3 Bit Graycode so umwandeln, dass ein > dezimales Zählen nur von 0,...,7 erfolgt und dieses eindeutig ist? Tabelle. Gruss Chregu
Beitrag #5547343 wurde von einem Moderator gelöscht.
Beitrag #5547357 wurde von einem Moderator gelöscht.
Wenn du 19 Bit brauchst, aber nur 18 hast (bzw findest) kannst Du nicht wissen, in welcher Hälfte du bist. Darum wäre es komisch, wenn das eine, wichtigste Bit fehlt.
Maybert schrieb: > Dafür muss! es doch mittlerweile eine Standardfunktion geben Maybert schrieb: > Das muss doch eine Standardfunktion sein! Was steht dazu im Datenblatt. Dafür muss es doch ein Datenblatt geben. Wie so oft ist es wieder mal geheim, um welches Bauteil es sich genau handelt.
Es handelt sich um einen 30 Bit Graycode. Du mußt erst alle 30 Bit dekodieren, danach kannst Du die gewünschten Bits abschneiden. Wenn Dich die oberen 12 Bit nicht interessieren, kannst Du sie mit EXOR zur Zählrichtung der unteren 18 Bits verknüpfen. Manche MCs haben ein Parity-Flag, was man dafür benutzen kann.
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.