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};
|