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.
Bin begeistert! danke, daß du zum Stande gebracht hast: Es geht auch mit Interupt. VG Tany
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.
Gibt es einen bestimmten Grund, warum du Spam-ähnlich alle paar Monate deine abstrusen falschen Gedanken zur Inkrementaldrehgeberauswertung wie eine neue Erfindung des Rades hier abladen musst ? Beitrag "4-fach Flankenauswertung per Interrupt mit ATmega48/88" Beitrag "IC zum decodieren von Drehencoder" Wie man es richtig macht, ist hinlänglich bekannt http://www.mikrocontroller.net/articles/Drehgeber http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29 Tobias hat spontan begriffen, wo die Probleme deiner "Lösung" liegen.
Tany schrieb: > Bin begeistert! > danke, daß du zum Stande gebracht hast: Es geht auch mit Interupt. Das freut mich; dann war es die Arbeit ja wert.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.