Absolutwertgeber graycodiert. Eigenwilliges Zählverhalten.

Gast #5547152
Lesenswert?

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
Gast #5547165
Lesenswert?

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.
Gast #5547183
Lesenswert?

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.
Gast #5547305
Lesenswert?

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!
Beitrag #5547343 wurde von einem Moderator gelöscht.
Beitrag #5547357 wurde von einem Moderator gelöscht.
#5547404
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren