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.
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.
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.
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
EineDrehrichtung:
2
Rastungaltneu
3
ABAB
4
-------
5
-->00011
6
|>01117FlankeanA
7
|111014
8
|>10008FlankeanA
9
|00011
10
|>01117FlankeanA
11
|111014
12
|>10008FlankeanA
13
--<00011
14
15
AndereDrehrichtung:
16
Rastungaltneu
17
ABAB
18
-------
19
-->01004
20
|>00102FlankeanA
21
|101111
22
|>110113FlankeanA
23
|01004
24
|>00102FlankeanA
25
|101111
26
|>110113FlankeanA
27
--<01004
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?
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.