Forum: Mikrocontroller und Digitale Elektronik Absolutwertgeber graycodiert. Eigenwilliges Zählverhalten.


von Maybert (Gast)


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

von Wolfgang (Gast)


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.

von A. S. (Gast)


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.

von Maybert (Gast)


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!

von Christian M. (Gast)


Lesenswert?

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.
von A. S. (Gast)


Lesenswert?

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.

von John (Gast)


Lesenswert?

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.

von Peter D. (peda)


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.

von piet (Gast)


Lesenswert?

Maybert schrieb:
> 0 bis ca. 262000

Meinst Du 262000 oder 262143?

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.