Jan H. schrieb:> Und muss feststellen das mein Encoder zwei Impulse liefert bis er> einrastet.>> Wie kann ich dies am besten umgehen?
Immer genau 2 oder nur manchmal?
Entprellung ist das Stichwort, nach dem Du suchst.
wendelsberg
Entferne die blind kopierte ISR und werte bei einer Flanke an Signal A
das signal B aus. Ist B high dann incrementierst du deinen Zähler, ist B
low dacrementierst du ihn.
Ganz einfach und viel kleiner als dein Code. So ist das bei den
Billig-Drehencodern auch gedacht...
Leo B. schrieb:> Entferne die blind kopierte ISR und werte bei einer Flanke an> Signal A das signal B aus. Ist B high dann incrementierst du deinen> Zähler, ist B low dacrementierst du ihn.> Ganz einfach und viel kleiner als dein Code. So ist das bei den> Billig-Drehencodern auch gedacht...
Ach du Scheisse, ein Gehirnloser der auch nach dem hundertsten Thread
immer noch nicht weiss wie ein Drehencoder zuverlässig auszuwerten ist.
Da ist Jan ja schon erheblich weiter.
Jan H. schrieb:> Und muss feststellen das mein Encoder zwei Impulse liefert bis er> einrastet.
Und du wolltest mit der Abänderung von table dagegen angehen ? Damit
funktioniert es aber nicht mehr. Folge lieber dem Vorschlag von Peter C.
Leo B. schrieb:> werte bei einer Flanke an Signal A> das signal B aus. Ist B high dann incrementierst du deinen Zähler, ist B> low dacrementierst du ihn.
Das hört wohl niemals auf :-)
Ist aber auch gemein, ich bin selbst vor Jahren darauf hereingeflogen.
Man sieht so schöne Zustandsdiagramme, programmiert drauf los - und es
funktioniert mit ordentlichen Encodern sogar erst mal super, leider
nicht lange.
Meine Jura-Kaffemaschine leidet auch an dem Problem, ein Encoder-Tausch
half nur kurzzeitig. Irgendwann bau ich einen Tiny25 zwischen Encoder
und Kaffemaschinen-Elektronik :-)
CNC schrieb:> Beitrag "Drehencoder bullet proof und einfach"
Diesen Thread hatte ich vor ca. Wochen erstmals gesehen und habe den
dortigen Buxtronic-Link in Anspruch genommen:
http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
Funktioniert tadellos und dies mit einem 10 Jahre alten rostigen Rotary
Allerdings ist dem Buxtronic ein kleiner Tabellen-Typo unterlaufen,der
in einem seiner Beispiele dazu fuehrte ,dass egal wie man den Encoder
bewegte immer nur eine Richtung ausgab.Dies Korrektur kann jeder,der den
Code einsetzen will selbst durchfuehren .(Ich schau jetzt da nicht mehr
nach,weil sich in der Regel sowieso niemand dafuer interessiert)
Man kann mit seinem Code auch sehr einfach (durch "Kommentierung")nur
einen Impuls oder 2 Impulse pro Rastung erzeugen.
Ich mag das Tabellengedöns nicht beim Drehencoder.
Mann kann auch folgendermaßen vorgehen:
nach Flanke an A erkannt (egal ob fallend oder steigend):
wenn A und B gleich sind Richtung 1 (pos++)
wenn A und B unterschiedlich sind Richtung 2 (pos--)
nach Flanke an B erkannt:
wenn A und B gleich sind Richtung 2 (pos--)
wenn A und B unterschiedlich sind Richtung 1 (pos++)
Mann kann jetzt sehr schön A und B als Edge Triggert Interrupt einlesen,
(oder natürlich auch pollen) und ohne sich sehr viel von der
Vorgeschichte zu merken die Richtung bestimmen.
hab ich mal so implementiert, und funktioniert einwandfrei.
Norbert H. schrieb:> Ich mag das Tabellengedöns nicht beim Drehencoder.
Es geht nicht um mögen, sondern es geht um zuverlässige Programme
> hab ich mal so implementiert, und funktioniert einwandfrei.
In jedem Incrementalencoderthread kommen irgendwelche Noobs aus den
Höhlen gekrochen, die das letzte Jahrhundert nicht mitbekommen haben,
daß ihre Lösung falsch ist und die richtige Lösung schon lange bekannt
ist.
> Mann kann jetzt sehr schön A und B als Edge Triggert Interrupt einlesen,
Man KANN keine Kontakte als Interrupt verwenden, weil Kontaktprellen
schneller sein kann als die Interrupt-Abarbeitungszeit und daher beim
prellen einzelne Flankenwechselsinterrupts verloren gehen und daher
falsch zählt.
Nein, DEINER zählt ja nicht falsch (als ob du das merken würdest..),
DEINER Ist ja auch der grösste Incrementalencoder, noch ist er ja nicht
verstaubt.
Man müsste die Kontakte vorher mit externer Hardware entprellen.
Der Algorithmus
> nach Flanke an A erkannt (egal ob fallend oder steigend):> wenn A und B gleich sind Richtung 1 (pos++)> wenn A und B unterschiedlich sind Richtung 2 (pos--)> nach Flanke an B erkannt:> wenn A und B gleich sind Richtung 2 (pos--)> wenn A und B unterschiedlich sind Richtung 1 (pos++)
ist jedoch nicht grundfalsch, er funktioniert wenn er per
ZEITGEBER/Hauptschleife aufgerufen wird.
Das mit dem Interrupt ist ein Beispiel, natürlich muss der Konntakt
dementsprechend angeschlossen sein, und ist Durch das Tastenprellen
nicht sinnvoll, wenn mann keine HW-Entprellung hat, - ein kleines R-C
wirkt da manchmal Wunder.
Zum Anderen würde ich mich nicht nur auf den Interrupt Verlassen, mann
kann auch innerhalb des Interrupts noch einmal eine
plausibilitätsprüfung Durchführen, un den eingenen Port kontrollieren ob
sich der tatsächlich geändert hat - so ist dieser zumindest 2mal gelesen
worden.
Zum anderen hab ich ja auch geschrieben, dass man die Ports auch pollen
kann, dann kannst Du alle entprellalgorythmen einsetzten die Du magst,
wenn du schnell genug bist.
-> letztlich ist es mit egal, wie die Flanke zuverlässig erkannt wird.
Dies muß bei jedem Algorythmus irgendwie zuverlässig geschehen.
Ich wollte nur eine möglichkeit aufzeigen daraus die Richtung zu
erkennen.
Bei meiner Anwendung wurde der Drehimpulsgeber durch einen Motor gedreht
zur Positionserkennung einer Spindel, da kommen schon ein paar KHz
zusammen, und Du musst ziemlich schnell sein, wenn Du da noch eine
größere Softwareentprellung einbauen willst.
Mein Drehencoder zählt auch von einem Rastpunkt zum anderen Rastpunkt 2
weiter. Wenn ich ihn aus dem 1. Rastpunkt löse zählt er 1 und wenn er im
nächsten Rastpunkt fast einrastet zählt er 1. Hat nichts mit Prellung
und Kaputt zu tun. Sonst könnten sie ja nicht vorwärts und rückwärts
unterscheiden.
@ Karl M. (Gast)
>es geht auch schnell wie die Herren, speziell auch Falk Brunner, hier>zeigt haben:>Beitrag "Versetzte Rechtecksignale auswerten, kein drehgeber"
Bitte keine Lobgesänge auf die Falschen, die Idee kam von Ulrich, ich
hab das nur ins AVR-Studio eingehackt und assembliert. Ich war nur der
Wasserträger.
Ich weiß nicht was ihr gegen die Tabellen Variante habt. Funktioniert
doch prima. Schneller kann man mit der Hand sowieso nicht drehen.
Auch wenn ich die Tabelle noch nicht ganz verstanden habe.
Norbert H. schrieb:> da kommen schon ein paar KHz zusammen, und Du musst ziemlich schnell sein
Wir hatten schon endlose Threads zum Drehencoder,
die polling Methode ist in Assembler auf einem 16MHz AVR in der Lage,
4 Drehgeber mit bis zu 960000kHz abzutasten und die Positionen zu
zählen, da hast du mit Interrupts keine Chance, denn du muss ja
sicherstellen, daß auch im ungünstigsten Fall alle Interrups
abgearbeitet werden können.
MaWin schrieb:> Wir hatten schon endlose Threads zum Drehencoder,> die polling Methode ist in Assembler auf einem 16MHz AVR in der Lage,> 4 Drehgeber mit bis zu 960000kHz abzutasten
Wahnsinn!
Und jeden Kanal kann man mit 10 kSamples abtasten?
Wie werden denn die Indeximpulse des Encoders ausgewertet?
MaWin schrieb:> Ach du Scheisse, ein Gehirnloser der auch nach...
Ach, wir üben uns mal wieder in gehobenem Disput, oder?
Das Thema ist schon lange durch - und wer es nicht gelernt hat, seine
Signale vor der Auswertung zuverlässig zu konditionieren (hier: sprich
per HW zu entprellen), der ist selber schuld.
Sowas ist ne Grundkenntnis für Elektroniker, die man einfach
voraussetzen muß - und wer das nicht kann (z.B. Programmierer), sollte
seine Nase lieber mal ein paar Wochen in den Tietze-Schenk stecken.
W.S.
Jan H. schrieb:> Ich weiß nicht was ihr gegen die Tabellen Variante habt. Funktioniert> doch prima. Schneller kann man mit der Hand sowieso nicht drehen.
Mit Geschwindigkeit hat das auch nichts zu tun. Tatsächlich sind
Tabellen sehr oft die schnellere Variante.
> Auch wenn ich die Tabelle noch nicht ganz verstanden habe.
Ist doch trivial. Zu jedem der 4 Zustände des Encoders gibt es zwei
erlaubte Nachbarzustände. Falls der Encoder in den verbotenen Zustand
übergehen sollte, dann bedeutet das daß man zu langsam abtastet. Die
Tabelle gibt nun für jeden Zustand und den unmittelbar vorher gelesenen
Zustand an, ob man um 1 vorwärts oder rückwärts zählen muß.
Am besten denkt man sich die Tabelle als 4x4 Matrix mit Zeilen und
Spalten in der Graycode(!) Reihenfolge. Auf der Hauptdiagonale stehen
dann logischerweise Nullen (von einem Zustand zu sich selber wird nicht
weitergezählt). Auf den Positionen oberhalb und unterhalb der Diagonale
(mit Überlauf über den Rand der Matrix) sind die erlaubten Nachbar-
positionen mit -1 und +1. Bei Viertelschrittauswertung alle 4. Bei
Halbschrittauswertung nur zwei und bei Vollschrittauswertung nur einer.
Die fertige Tabelle im Code sieht geringfügig anders aus, weil sie eben
nicht nach dem Graycode, sondern nach dem Binärcode sortiert ist.
Ob man jetzt die Tabelle nutzt oder von Hand mit logischen Verknüpfungen
rechnet ist Geschmackssache. Je nach µC, Pinbelegung und Compiler ist
mal das eine oder andere schneller bzw. kürzer.
Wenn einem die Auflösung zu hoch ist, könnte man auch die Tabelle
anpassen und so nur jeden 4. Übergang zählen. Es gibt halt auch noch
eine Form für 1/4 der Auflösung.