Mit einem rotary-encoder mit AVR Mikro-controller
Ich habe Probleme dabei, ein rotary encoder, um richtig zu arbeiten mit dem AVR-Mikro-Controllern. Der encoder ist eine mechanische ALPS encoder, und ich bin mit Atmega168.
Klärung
Habe ich versucht mit einem Externen Interrupt zu hören, um die Stifte, aber es scheint, wie es ist zu langsam. Wenn der Pin Eine geht hoch, das interrupt-Verfahren beginnt und dann überprüft, ob die Pin B ist hoch. Die Idee ist, dass wenn Pin B hoch ist der moment, Pin, die Eine ging hoch, dann ist es drehen gegen den Uhrzeigersinn. Wenn der Stift B auf low, dann dreht sich im Uhrzeigersinn. Aber es scheint, wie der AVR zu lange dauert, um zu überprüfen, pol B, so ist es immer gelesen wie hoch.
Ich habe auch versucht zu erstellen, ein Programm, das einfach blockiert, bis Pin B Pin oder Eine verpasst. Aber es könnte sein, dass es zu viel Lärm, wenn der encoder gedreht wird, weil dies nicht funktioniert entweder. Mein letzter Versuch war eine timer-speichert die letzten 8 Werte in einen Puffer und prüft, wenn es geht von niedrig bis hoch. Das hat nicht funktioniert entweder.
Habe ich versucht scoping-encoder, und es scheint zwischen 2 und 4ms von der ersten Pin-änderungen, bis die andere Pin-änderungen.
InformationsquelleAutor Marius | 2008-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe eine Webseite über Drehgeber und wie man Sie benutzt, die Sie vielleicht nützlich finden.
Leider ohne mehr Informationen kann ich nicht beheben Ihr problem ist.
Die mikrocontroller-pins angeschlossen werden, um den encoder, und was ist der code, den Sie gerade verwenden zu Dekodieren, die Impulse?
Ok, du bist den Umgang mit ein paar verschiedene Themen, das erste Problem ist, dass diese mechanischen encoder, so muss man sich mit den schaltgeräuschen (bounce, Geschwätz). Die Datenblatt zeigt, dass es kann bis zu 3mS für die Teile zu stoppen, Prellen und die Schaffung von falschen Ausgänge.
Müssen Sie erstellen eine debounce-routine. Der einfachste von denen ist ständig zu überprüfen, um zu sehen, wenn Einer geht hoch. Wenn es das tut, startet einen timer und überprüfen Sie es wieder in 3 ms. Wenn es immer noch high, dann können Sie überprüfen, B -, wenn es nicht hoch ist, dann ignorieren Sie die gefälschten Puls und weiterhin auf der Suche nach Einem hoch. Wenn Sie überprüfen, B, schauen Sie es an, starten Sie einen timer für 3 ms, und betrachten Sie dann B erneut. Wenn es war das gleiche, beide Male, dann können Sie diesen Wert verwenden, wenn Sie änderungen innerhalb von 3 ms haben, dann müssen Sie es wieder tun (Lesen, B, warten, 3 ms, dann Lesen Sie es wieder und sehen, ob es passt).
Den atmega ist schnell genug, dass Sie sollten nicht sich sorgen über diese Prüfungen wird langsam, es sei denn, du bist auch ein slow-clock-speed.
Sobald Sie befassen sich mit den mechanischen Geräusche, dann wollen Sie schauen bei einer richtigen gray-code-routine - Algorithmus, dem du folgst, wird nicht funktionieren, es sei denn, Sie auch verringern, wenn A hoch ist, wenn B nach unten geht. Generell Menschen speichern den letzten Wert der beiden Eingänge, und dann vergleichen Sie es mit dem neuen Wert der beiden Eingänge und der Verwendung einer kleinen Funktion, die zum Inkrementieren oder Dekrementieren. (Schauen Sie sich die Rubrik "hohe Auflösung reading" auf der website, die ich oben erwähnt für die Tabelle). Kombiniere ich die beiden Werte in ein vier-bit-Zahl und verwenden Sie einen einfachen array, um mir zu sagen, ob ich inkrementiert oder dekrementiert den Zähler, aber es gibt Lösungen, die noch mehr erweiterte, und optimieren Sie für die code-Größe, die Geschwindigkeit oder die einfache code-Wartung.
InformationsquelleAutor Adam Davis
Hinzufügen eines analogen Tiefpass-filter verbessert das signal. Mit dem lowpass-filter, der code auf dem AVR war wirklich einfach.
Ah, die Wunder der ASCII-Kunst :p
Hier ist das Programm auf dem AVR. Verbinden Sie A und B auf Eingang PORTB auf dem avr:
Dieser code funktioniert, es sei denn, Sie drehen Sie den encoder sehr schnell. Dann könnte es verpassen, einen Schritt oder zwei, aber das ist nicht wichtig, wie die person, die mit der encoder nicht wissen, wie viele Schritte, die Sie gedreht haben.
Nette Sache über die hardware-Lösung, obwohl, ist, es bietet zusätzlichen Schutz vor ESD von dem user. Nicht optimiert für, dass, natürlich, aber einen kleinen bonus.
Ich denke, deine Schaltung nicht zeigen, eine passive LP-filter des encoders an den µC. Sie wechseln die Positionen der widerstände und kondensatoren.
vielen Dank, korrigiert!
Beachten Sie, dass dieser filter führt VCC, wenn der Schalter offen ist, und 18% von VCC, wenn der Schalter geschlossen ist. Ein filter wie empfohlen, in bourns-Datenblatt gehen sauber an VCC und GND, sowie mit einem weniger Wert Teil.
InformationsquelleAutor Marius
Geschwindigkeit sollte kein problem sein. Meist alle mechanischen Schalter müssen debounce-Routinen. Wenn Sie wollen, tun Sie dies mit interrupts deaktivieren Sie den interrupt, wenn es ausgelöst wird, starten Sie einen timer, schaltet es wieder auf nach ein paar ms. Halten Sie Ihr Programm polling-gratis - >:)
InformationsquelleAutor monowerker
Was genau haben Sie Probleme mit? Ich nehme an, Sie habe in der Lage, Haken Sie die pins der encoder auf deinem PIC, wie pro die technischen Spezifikationen in Verbindung mit dem Farnell-Seite, die Sie Gaben, so ist das problem mit dem Auslesen der Daten? Haben Sie keine Daten erhalten, aus dem encoder? Du weißt gar nicht, wie die Daten zu interpretieren, Sie sind immer wieder?
InformationsquelleAutor Daniel Jennings
InformationsquelleAutor