Ich habe einen Grayhill Inkrementalgeber, den ich an meinem Arduino Nano nicht zum Laufen bekomme.
Mein Programm:
volatile int zaehler = 0;
void setup()
{
Serial.begin(9600);
pinMode(3, INPUT); //Pin 3 als Eingang
pinMode(2, INPUT); //Pin 2 als Eingang
attachInterrupt(digitalPinToInterrupt(2), encoder_interrupt, CHANGE); //Interruptprogramm erstellen
}
void loop()
{
Serial.print(zaehler, DEC);
delay(250);
}
void encoder_interrupt()
{
if(digitalRead(2) != digitalRead(3)) // A und B Signal des Inkrementalgebers vergleichen
zaehler++; // wenn A und B ungleich ist, Wert um 1 erhöhen
else
zaehler--; //wenn A und B gleich sind Wert um 1 verringern
}
Habe den Inkrementalgeber laut Datenblatt angeschlossen.
Kann mir jemand helfen, warum er nicht funktioniert?
Das Datenblatt mit Deinen Infos sind nicht eindeutig.
Die Versionen 62A22, 62A15 und 62A11 sind Encoder mit Totem Pole Ausgang. diese geben H und L aus.
Alle anderen Modele haben Open Collekltor Ausgänge und da braucht es wie im Datenblatt auf Seite 4 unten gezeigt Pullupwiderstände.
Ohne mit Interrupt herumzuprobieren. Kannst Du einfach mal den zustand von pin 2 auf pin 13 ausgeben und so siehst Du am LED L was da reinkommt.
Mit den Pullup Widerständen funktionierts.
Aber der Zähler zählt nur be jedem zweiten "klicken" rauf und runter. Gibt es da noch eine Lösung, dass er bei jedem "klicken" zählt?
Wie wertest du denn die ersten 2 Flanken aus....?
Evtl. kann dir das ja als Vorlage für die anderen beiden dienen.
Später dann, wird in dir die Erkenntnis wachsen, dass der Pin Interrupt doch keine gute Idee ist, und dass es besser ist, die Angelegenheit in einen Timer Interrupt auszulagern.
Die ersten 2 werden so ausgewertet, dass der Zähler bei einem Flankenwechsel raufzählt. Aber bei den nächsten 2 gibt es ja wieder einen Flankenwechsel und er müsste raufzählen oder? So denke ich mir das?
dieser Code kann niemals sauber die Richtung erkennen und erst recht nicht sauber zählen. Der Zähler müßte damit immer nur um eins hoch und wieder runter wechseln.
if(digitalRead(2) != digitalRead(3)) // A und B Signal des Inkrementalgebers vergleichen
zaehler++; // wenn A und B ungleich ist, Wert um 1 erhöhen
else
zaehler--; //wenn A und B gleich sind Wert um 1 verringern
Es müssen immer beide Signale gleichzeitlich eingelesen und alle 4 möglichen Zustände betrachtet werden.
Grundlagen dafür gibts hier Drehgeber – Mikrocontroller.net
Der Sketch-Snipped oben ist die Billig-Auswertung eines Drehencoder.
Bei Flankenwechsel an A (alternativ B) wird der andere Pin eingelesen und darüber bestimmt, wie herum wir drehen.
Dadurch haben wir aber den Flankenwechsel an B völlig ignoriert - somit nur die halbe Auflösung und bei prellenden Kontakten geht die ganze Maschinerie nach hinten los.
Bei so zeitkritischen Abläufen wie ein händisches Drehen sollte loop() vollkommen ausreichend sein, um diese Eingänge zu pollen.
Beim Prellen wird halt vor/zurück gezählt - Alles kein Problem, da eh immer nur ein Eingang prellen wird (der Andere ist schon laange damit fertig).
Und spätestens nach den 4 Impulsen pro Rastung hast Du den internen Zähler 4 höher oder tiefer - je nach Drehrichtung.
Dein Sketch verwendet intern von diesem Zähler halt nur 1/4tel des Zähler - da die Zwischenpositionen, also zwischen den Rasten, für z.B. eine geänderte Variable überhaupt keine Rolle spielen.
Wenn der Encoder in Ruhestellung prellt/wackelt, nimmt man halt die dem Punk gegenüber liegende Flanke als Null an.
Die Wenigsten hier werden aber mit einem Industrie-Encoder um die Ecke kommen.
(wobei ich auch ein/zwei demontierte Industrie-Encoder in meinem Funds habe, wo die CNC-Drehbank halt nicht immer so wollte)
Viel häufiger dürften die 'Zwölf für Eins Fuffzich' Encoder sein - und dort könnte so Etwas ggf. vorkommen.
combie:
Du solltest dir eine Logiktabelle aufmalen und die Antwort nochmal überdenken.
(schätze ich mal so)
Das ist doch Unsinn.
Der Code kann nur feststellen ob beide Signale gleich oder unterschiedlich sind.
Der Code kann nicht feststellen welches Signal sich geändert hat.
Daraus kann man keine Drehrichtung ableiten.
Man muss sich merken wie die Signale vorher waren und was sich geändert hat.
Das ist kein Unsinn.
Diese Prüfung kommt IMMER nach der gleichen Flanke des anderen Kanal.
Somit ist die Drehrichtung bekannt.
Ist halt anfällig für Prellen und man verringert die Anzahl der auswertbaren Flanken.
Siehe: Drehgeber#Warum_Sparvarianten_nicht_gut_sind, mc.net