Forum: Mikrocontroller und Digitale Elektronik Frage zu dem hier beschriebenen Thema "Encoder"


von Jan H. (janiiix3)


Lesenswert?

Hallo,

Kann mir einer erklären, wie man auf die Werte in der Tabelle kommt? 
Soll das der GrayCode sein?

https://www.mikrocontroller.net/articles/Drehgeber
1
// Dekodertabelle für wackeligen Rastpunkt
2
// halbe Auflösung
3
const int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};

von fop (Gast)


Lesenswert?

Nö, das ist ein ganz eigenes Encoding. Hier wird aus 4 Eingangsbits die 
Info vorwärts (+1), rückwärts (-1) oder stehen bleiben (0) gewonnen.
Wobei die 4 Bits den jetzigen Zustand von Signal A, den jetzigen Zustand 
von Signal B, den vorigen Zustand von Signal A und den vorigen Zustand 
von Signal B repräsentieren.

von Jan H. (janiiix3)


Lesenswert?

Welche 4 Bits?

von R. M. (Gast)


Lesenswert?

Jan H. schrieb:
> Welche 4 Bits?

2 Bit alt, 2 Bit neu.
Damit ist jeder mögliche (und auch die unmöglichen: Ergebnis 0 ) 
Übergang abgedeckt und bewertet.

von Jan H. (janiiix3)


Lesenswert?

Achso.
Darum auch 2 mal schieben...
Wie aber kommt man auf die Werte in der Tabelle...  Da muss es doch eine 
Überlegung / Rechnung zu geben?

von Dieter F. (Gast)


Lesenswert?

Ich habe mir das mal (vor einiger Zeit) von Peter ab- / 
zusammengeschrieben, damit ich es auch mal kapiere :-) - das war bei der 
Assembler-Version recht gut beschrieben:
1
/*
2
Darauf basiert die Tabelle ...
3
dgtab:      ;Tabelle mit Drehgeber-Werten (alt-alt-neu-neu als Index)
4
;aa nn,     aa nn
5
.db     0, 0        ;00 00,     00 01
6
.db     0, 0        ;00 10,     00 11
7
.db     1, 0        ;01 00,++   01 01
8
.db     0, 0        ;01 10,     01 11
9
.db    -1, 0        ;10 00,--   10 01
10
.db     0, 0        ;10 10,     10 11
11
.db     0, 0        ;11 00,     11 01
12
.db     0, 0        ;11 10,     11 11
13
14
Mein Alps Drehgeber liefert nur Impulse - hat also generell den Zustand
15
11 und liefert je nach Drehrichtung Impulsfolgen 01->00 oder 10->00 !!
16
17
18
Hier die generelle Erklärung:
19
20
Bei Drehgebern, die ihre Rastung auf 00 und 11 haben, gibt es pro
21
Rastung auf jeder Spur eine Flanke. Um diese Drehgeber auszuwerten,
22
prüft man ja eine Spur auf Flanke und die andere Spur auf Zustand. Bei
23
symmetrischen Drehgebern ist es egal, welche Spur man auf Flanke prüft.
24
Bei diesen "selten dämlichen" Drehgebern prüft man Spur A (also die
25
Spur, die im eingerasteten Zustand stabilen Pegel liefert) auf Flanke
26
und Spur B auf Zustand. Da der Zustand nur relevant ist, wenn eine
27
Flanke erkannt wurde, spielt der (eingerastet) undefinierte Zustand der
28
Spur B keine Rolle.
29
30
Zum Abtasten des Drehgebers wird das Bitmuster (der Zustand der beiden
31
Spuren) eingelesen und auf die beteiligten Bits maskiert. Dies wird dann
32
zu dem "gemerkten" und um 2 Bits verschobenen Bitmuster der letzten
33
Abtastung geORT. Es entsteht eine 4-Bit-Zahl, die als Index auf die LUT
34
genutzt wird. Von diesen 16 möglichen Zuständen sind bei diesen
35
Drehgebern aber nur 4 Zustände relevant.
36
37
In die LUT werden also nur dort Incremente eingetragen, wo Spur A den
38
Pegel wechselt (also eine Flanke hat).
39
40
Eine Drehrichtung:
41
Rastung alt neu
42
A B A B
43
-------
44
-->    0 0 0 1   1
45
|  >   0 1 1 1   7  Flanke an A
46
|      1 1 1 0  14
47
|  >   1 0 0 0   8  Flanke an A
48
|      0 0 0 1   1
49
|  >   0 1 1 1   7  Flanke an A
50
|      1 1 1 0  14
51
|  >   1 0 0 0   8  Flanke an A
52
--<    0 0 0 1   1
53
54
Andere Drehrichtung:
55
Rastung alt neu
56
A B A B
57
-------
58
-->    0 1 0 0   4
59
|  >   0 0 1 0   2  Flanke an A
60
|      1 0 1 1  11
61
|  >   1 1 0 1  13  Flanke an A
62
|      0 1 0 0   4
63
|  >   0 0 1 0   2  Flanke an A
64
|      1 0 1 1  11
65
|  >   1 1 0 1  13  Flanke an A
66
--<    0 1 0 0   4
67
68
Die eine Drehrichtung ergibt also bei Flanken an Spur A die Zahlenwerte
69
(als Index auf die LUT) 7 und 8, die andere Drehrichtung 2 und 13.
70
Daraus ergibt sich, dass bei Index 7 und 8 der Wert +1 (als Increment)
71
in die LUT eingetragen wird und bei Index 2 und 13 der Increment-Wert
72
-1. Alle anderen Elemente des Arrays (der LUT) werden mit dem Wert 0
73
aufgefüllt.
74
75
Wird Spur A und B vertauscht, so ergeben sich andere Index-Werte. Bei
76
symmetrischen Drehgebern ist das egal, die "selten dämlichen" spinnen
77
dann aber.
78
79
Somit wird der Zählerstand nur verändert, wenn eine Flanke an Spur A
80
erkannt wurde. Der Zustand von B ist in diesem Zeitpunkt ja stabil.
81
82
Dies alles läuft im Timer-Int oder einem per Timer synchronisierten Job
83
ab. Die Aufruf-Frequenz ist ein Kompromiss zwischen CPU-Last und
84
maximal möglicher Drehgeschwindigkeit. Bei Verwendung des Drehgebers
85
als manuelles Eingabegerät hat sich bei mir eine Abtastfrequenz von 1 kHz bewährt.
86
87
Die Mainloop (bzw. ein Job davon) addiert nun diesen Zählerstand auf
88
den zur Bearbeitung anstehenden Wert und löscht ihn danach. Somit gehen
89
keine Drehbewegungen verloren, wenn es in Main mal länger dauert.
90
*/
91
92
Passt zu Deinem Beispiel: 
93
94
// Dekodertabelle für wackeligen Rastpunkt
95
// halbe Auflösung
96
const int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0};

von Jan H. (janiiix3)


Lesenswert?

So wie ich sehe, ist es ja auch egal ob es jetzt eine steigende Flanke 
oder eine fallende Flanke ist?

Und es wird jedes mal +2 gezählt, das hat wohl damit zu tun, dass es pro 
Umdrehung 2 x einen passenden Wert aus der Tabelle passt?
1
Eine Drehrichtung:
2
Rastung alt neu
3
A B A B
4
-------
5
-->    0 0 0 1   1
6
|  >   0 1 1 1   7  Flanke an A
7
|      1 1 1 0  14
8
|  >   1 0 0 0   8  Flanke an A
9
|      0 0 0 1   1
10
|  >   0 1 1 1   7  Flanke an A
11
|      1 1 1 0  14
12
|  >   1 0 0 0   8  Flanke an A
13
--<    0 0 0 1   1
14
15
Andere Drehrichtung:
16
Rastung alt neu
17
A B A B
18
-------
19
-->    0 1 0 0   4
20
|  >   0 0 1 0   2  Flanke an A
21
|      1 0 1 1  11
22
|  >   1 1 0 1  13  Flanke an A
23
|      0 1 0 0   4
24
|  >   0 0 1 0   2  Flanke an A
25
|      1 0 1 1  11
26
|  >   1 1 0 1  13  Flanke an A
27
--<    0 1 0 0   4

Das mit den Flanken ist mir auch noch nicht ganz klar, jede Bitänderung 
ist doch eine Flanke, wieso "11" nicht? oder wieso "4" nicht?

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.