Die übliche Form der Drehgeberauswertung ist das periodische Abfragen
der Phasen A und B an zwei IO-Pins in einem Timerinterrupt. Für
mechanische Drehgeber ist keine hohe Abtastrate erforderlich, sodass
diese Art der Auswertung hinreichend schnell arbeitet. Der µC muß
allerdings periodische Interrupts bearbeiten, die ihn aktiv halten und
eine gewisse Stromaufnahme bedingen.
Hier werden eine Teilschaltung/Programm gezeigt, welche die
Drehgeberauswertung per Interrupt erledigen. Der µC muß lediglich bei
einer Änderung des Inkrementalgebers (hier PHASE_A) aktiv werden.
Bei mechanischen Drehgebern können deren Kontakte prellen, was
unerwünscht ist und zu Auswertungsfehlern führt. Vermieden wird dies in
dieser Schaltung durch den Tiefpass R1/C1, der zu schnelle
Flankenwechsel am INT0-Eingang verhindert. Ferner verriegelt das
Programm während der Auswertung den INT0-Eingang und bringt den Pegel an
C1 auf den vollen Eingangspegel (VCC oder GND), wie er beim Aufruf von
INT0-ISR erkannt wurde. Dadurch wird die Eingangshysterese deutlich
vergrößert und eine zu schnelle Änderung am Eingang nach Verlassen der
ISR verhindert.
Für mechanische Schalter sind Werte für R1/C1 von 100k und 1-10nF
sinnvoll. Verwendet man optoelektrische Drehgeber, die in der Regel
keine Entprellung benötigen, kann man R1/C1 auf 10k verkleinern bzw. auf
1nF belassen.
Bei optoelektrischen Drehgebern oder solchen mit Hall-Sensoren, die eine
hohe Auflösung besitzen, ist die Auswertung per Interrupt von großem
Vorteil bzw. unausweichlich. Ohne eine periodische Hintergrundlast durch
'Polling' zu erzeugen, können die Eingangsfrequenzen bei geschickter
Programmierung der sonstigen Prozessor-Interrupts durchaus bis zu 50kHz
betragen. Der µC wird nur dann durch die Auswertung belastet, wenn auch
eine Änderung des Drehgebers stattfindet.
Wer sich mit dieser Art Drehgeberauswertung nicht anfreunden kann, muß
dies nicht machen.
Wen es stört, dass auf Grund des einfachen Hardware-Aufbaus ein Arduino
UNO R3 verwendet wurde, kann das Programm unverändert unter AVR Studio
4.19 verwenden.
Das Zusammenspiel von Programm und Tiefpass R1/C1 am INT0 ist hier näher
dargestellt: Beitrag "EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
Die zunächst verwendete Dateiendung .ino kann zur Irritation bei der
Ansicht führen, obwohl es eine .c-Datei ist. Daher hänge ich eine
.c-Datei an, die ein bißchen aufgeräumter formatiert ist.
Für die Arduino Liebhaber gibt es eine neue .ino-Datei, die die wohl
schmerzlich vermissten Funktionen setup() und loop() beinhaltet, sowie
die ser. Datenausgabe mit Hausmitteln erledigt. Vielleicht hilft dies,
schneller die Drehgeberauswertung zu nutzen.
Bei beiden neuen Versionen wird nun der PCINT18 an PortD.2 über die
PCINT2-Gruppe genutzt. Die Änderungen sind minimal, erlauben es aber nun
mit einer kleinen Anpassung, beliebige Eingangspins mit PCINTx-Option
für die Auswertung zu nutzen.
Mir fallen zwei Dinge auf:
1. Ausgang vom RC-Glied ist eigentlich analog. Die Spannung geht
"langsam" hoch und "langsam" runter. Das schliesst man nicht so an einen
digitalen Eingang an, ausser er hat Schmitt-Trigger Charakteristik. Wenn
er das nicht hat, dann muss da ein Schmitt-Trigger dazwischen.
2. Überleg dir mal, was passiert, wenn der Drehgeber pendelt.
3. Wenn der Drehgeber schnell genug sich dreht, dann wird mit dem C die
Spannung prima gemittelt und man hat dort einfach VCC / 2. Kein tolles
digitales Signal um einen IRQ auszulösen :-(
Fazit: Es funktioniert nicht wirklich mit Sparlösungen :-) Einfach beide
Phasen gleichermassen auswerten. Wenn man mit dem Timer-Interrupt die
Pins abfragt, dann hat man ja auch quasi eine interruptgesteuerte
Auswertung. Zwischen den Interrupts kann der uC notfalls in einen
Stromsparmodus geschaltet werden.
Tany schrieb:> danke, daß du zum Stande gebracht hast: Es geht auch mit Interupt.
Nun, wenn man Drehgeber mit Kontakten hat, funktioniert es wohl
nur solange, wie der Drehgeber noch neu ist. Wenn man sowieso
einen µC verwendet, ist es doch kein Mehraufwand, gleich die
"richtige" Lösung mit Pegelauswertung zu nehmen.
Gruss
Harald
Der Unterschied zwischen Tany und Tobias ist folgender:
Tany freut sich, daß er etwas präsentiert bekommt, was er ohne eigenes
Nachdenken nutzen will.
Tobias hat sich die Sache erstmal angeschaut, selbst die Schwachstellen
rausgefunden und das dann auch geschrieben.
Jetzt frage ich mich, wessen Urteil mir mehr wert wäre ;-)
(unabhängig davon, ob ich am Bauch gestreichelt werde oder ob ich
kritisiert werde)
ich schrieb:> Tobias hat sich die Sache erstmal angeschaut, selbst die Schwachstellen> rausgefunden
Das Gegenteil ist der Fall.
Tut mir Leid, seine Ausführungen sind mir um Größenordnungen zu dumm, um
darauf einzugehen. Aber da befindet er sich ja in "bester Gesellschaft".
Ihr könnet weiter diskutieren wie ihr's wollt. Auch die "richtige"
Lösung habe ich probiert, nicht immer zu meiner Zufriedenheit.
Ich hab mich nur gewundert, daß die andes als "richtige" Lösung immer
als schlecht, manchmal als dumm bezeichnet. Es kommt immer darauf an,
was man für Möglichkeit hat und wie man's programmiert.
Ich habe für mein Projekt keine Möglichkeit gehabt, die "richtige"
Variante anzuwenden, mußte mit Interupt machen und es klappt auch.
Also bitte nicht versuchen, Andesdenkende gleich abzuschmertern.
>Tany freut sich, daß er etwas präsentiert bekommt, was er ohne eigenes>Nachdenken nutzen will.
Nein, ich hab's nicht nötig. Ich hab schon mein eigenes. Ich kann und
will kein C :-)
Gruß
m.n. schrieb:> Tut mir Leid, seine Ausführungen sind mir um Größenordnungen zu dumm, um> darauf einzugehen.
Der Standardsatz, wenn einem die Argumente ausgehen...
Wenn man tatsächlich Schalter in einem Drehgeber hat, so sollte man
diese auch wie Schalter auswerten.
In den meisten Diskussionen hier war der Tenor der: Ein Interrupt ist
hierfür nicht das Gelbe vom Ei.
Kann mir mal jemand erklären, warum man zwei, eigentlich gleiche
Ausgänge, unterschiedlich auswertet/anschließt?
Am besten gefällt mir der Kondensator. Mit ein paar Mikrofarad sollten
sich alle Probleme lösen lassen:-)
manche von euch kann nur bis 10 zählen, MEHR NICHT!
>Der Standardsatz, wenn einem die Argumente ausgehen...
Na klar, der Timer1 kann nicht anders als das, was man ihm sagt. Man
futtert ihn bestimmte Werte und er macht's lebenslang ohne müde zu
werden!
Wenn ihr das nicht sieht, was dahinter steck, kann ich nur sagen: PGH.
Bleibt dann lebenslang mit einziger "richtige" Lösung sitzen.
@Amateur
>Kann mir mal jemand erklären, warum man zwei, eigentlich gleiche>Ausgänge, unterschiedlich auswertet/anschließt?
weil nur eine der Phase zur Interuptauflösung herangezogen wird.
>Am besten gefällt mir der Kondensator. Mit ein paar Mikrofarad sollten>sich alle Probleme lösen lassen
das ist eben das schönes dabei. Man kann anpassen: von langsamen
mechanischen Drehgeber bis schneller opt. Encoder. Entprellt
(zuverlässig!) wird duch R1 und C1, zusätzlich duch software (trigger).
Tany schrieb:> Ich kann und will kein C :-)
Grund genug für mich, auch Assembler-Programmierer zu beglücken.
Assembler hat den großen Vorteil, sehr schnell den ext. Zustand der
Phasen zu erfassen, ohne erst viele Register zu retten, die garnicht
benötigt werden.
'dg_sub.s' muß ggf. an den eigenen Assembler angepaßt werden; hier ist
es einer von IAR, wobei die Ausgaberoutinen in der .c-Datei belassen
wurden.