Forum: Projekte & Code Drehgeber per Interrupt auswerten, AVR


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.ä."

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Tany (Gast)


Lesenswert?

Bin begeistert!
danke, daß du zum Stande gebracht hast: Es geht auch mit Interupt.
VG
Tany

von Tobias P. (hubertus)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von Harald W. (wilhelms)


Lesenswert?

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

von ich (Gast)


Lesenswert?

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)

von m.n. (Gast)


Lesenswert?

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".

von Tany (Gast)


Lesenswert?

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ß

von Timer1 (Gast)


Lesenswert?

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...

von Amateur (Gast)


Lesenswert?

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:-)

von Tany (Gast)


Lesenswert?

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).

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.