Encoder zählt erst bei 2 Rasterschritten, richtig so?

Hallo,

ich teste derzeit mit einen Encoder und dabei ist mir aufgefallen, der zählt (aufwärts und abwärts) immer erst nach zwei Rasterschritten. Dann zählt er zwar jeweils "richtig" aber für mein Empfinden zu langsam.

Als Library verwende ich https://github.com/mathertel/RotaryEncoder

Also drehe ich einen Rasterschritt, passiert nicht. Erst beim zweiten Schritt zählt er auf 1, der dritte Schritt wieder nichts, der vierte Schritt auf 2, usw. Rückwärts geht es genau so. Insgesamt zählt er sauber und fehlerfrei hoch und runter, nur eben jeden zweiten Schritt.

Den Code habe ich direkt und ohne Änderung (mit bzw. ohne Interrupt) aus den Beispielen übernommen. Wenn gewünscht, poste ich den hier.

Ist das so ok, oder liegt das am Encoder (sind sehr preiswerte aus der Bucht) oder gibt die Library das so vor.

Sollte am GreyScale Verfahren liegen, der braucht 4 Werte um zu erkennen, in welcher Richtung gedreht wurde. Die Werte werden nach x ms verworfen. Dann fehlen dir beim erneuten drehen immer wieder 2 Werte.

Ansonsten mal im mikrocontroller.net Wiki schaun. Dort ist auch ein sehr brauchbarer Code, aber nach gleichen Verfahren. Das ist nun einmal bei stark prellenden mechanischen Tastern so. Alternative optische Encoder, die sind aber um einiges teurer.

Danke sschultewolter,

dann werde ich mich nochmal damit auseinandersetzen. Ein optischer kommt erst mal nicht infrage, war ja nur ein Versuch. ;)

Hier gibt es den Code auch schon für den Arduino aufbereitet: http://www.arduinoforum.de/arduino-Thread-Pins-am-Drehregler-Rotary-Encoder?pid=13314#pid13314

loop() ist etwas blödsinnig da, aber das ist bei dir eh anders. Was man aber generell anders machen sollte ist dass man die Interrupts sperrt bevor man den Wert ausliest und danach wieder freigibt.

So ist es auch auf Mikrocontroller.net:

int encoder_read() 
{
  int val;

  cli();
  val = encoder_wert;
  encoder_wert = 0;
  sei();
  return val;
}

Welche Encoder benutzt du?

Die preiswerten (blauer Körper, 5 Beine, 12 Schritte, 5mm Achse) ?

Die Dinger prellen bei mir kein bisschen. Ich betreibe sie mit einer abgewandelten Version von

https://www.circuitsathome.com/mcu/programming/reading-rotary-encoder-on-arduino

Finde ich prima, weil alles im Hintergrund abläuft und Pinchange IRQs auf allen Pins (eingeschränkt) erlaubt.

Die Technik erzeugt bei jedem Raster einen Schritt, das Prinzip kann man auch gepollt verwenden.

Ja super, :D, Danke Serenifly, danke Whandall,

das werde ich dann morgen testen, für heute ist erst mal Schluss.

Whandall: Finde ich prima, weil alles im Hintergrund abläuft und Pinchange IRQs auf allen Pins (eingeschränkt) erlaubt.

Der Code verwendet gar keine Interrupts. Der pollt einfach so schnell wie das Programm durchläuft.

Das Lesen der Pins ist optimiert und es werden beide Pins gleichzeitig gelesen. Das muss aber nicht superschnell sein. Die Pins ca. jede ms abzufragen reicht auch. Das kann man auch in einem Timer Interrupt machen.

Dann habe ich den falschen link erwischt, sorry.

Aber vielleicht ist der ohne irq ja für den OP brauchbar.

https://www.circuitsathome.com/mcu/rotary-encoder-interrupt-service-routine-for-avr-micros

Hängt vom Encoder ab. Die mechanische Rasterung und die elektrische Impulse müssen nicht gleichviele Schritte pro Umdrehung haben. Hast Du im Datenblatt Deines Encoders nachgeschaut? Grüße Uwe

Wenn zu wenige Impulse ankommen, liegt das vielleicht am Verständnis des Encoders. Der braucht ja zwei phasenverschobene Signale, um die Drehrichtung zu erkennen. Wenn dann ein Schlaumeier die Impulse beider Signale zusammenzählt, um die doppelte Auflösung vorzutäuschen, dann muß man diese Angabe durch 2 teilen. Deshalb wäre ein Datenblatt oder mindestens die Anschlußbelegung des Encoders ganz interessant.

Kommt es auf die Drehrichtung nicht an, dann kann man natürlich jeden einzelnen Rasterschritt zählen, d.h. jede Änderung (Flanke) eines Signals.

Hallo,

vielen Dank für die zahlreichen Infos.

Ich verwende derzeit (Testphase) diesen Encoder (KY-040):

http://www.ebay.com/itm/KY-040-Rotary-Encoder-Module-for-Arduino-AVR-PIC-/370889677544

und habe trotz längerer Suche kein Datenblatt (außer in chinesisch) gefunden.

Mit dem Code im Link von Serenifly funktioniert es jetzt so wie ich es möchte (pro Rasterschritt zählt er um 1 weiter).

Damit ist dieser Test erst mal abgeschlossen und ich werde mir ein passendes Projekt dafür aussuchen. ;)

Nochmals viel Dank und Gruß

Da ist exact das preiswerte Teil verbaut, das ich betreibe.

Die oben von mir geposteten Links solltest du dir dennoch mal ansehen, die verwendete Technik (Lookup-Table) ist ungemein effizent und elegant.

10 Stück 4,90€

http://www.amazon.de/SODIAL-10pcs-Encoder-Switch-Schl%C2%A8%C2%B9sselschalter/dp/B00JZEU458/ref=sr_1_1?s=diy&ie=UTF8&qid=1442999880&sr=1-1&keywords=SODIAL%28R%29+10pcs+12mm+Dreh+Encoder+Switch

Da ist exact das preiswerte Teil verbaut, das ich betreibe.

Ja, nur dass ich damals nicht so viel brauchte und nur zwei für zusammen ca. 1,50 € bestellt habe.

Die oben von mir geposteten Links solltest du dir dennoch mal ansehen, die verwendete Technik (Lookup-Table) ist ungemein effizent und elegant.

Das habe ich mir angesehen und der von mir verwendete Code (Link Serenifly) verwendet auch solch eine Tabelle, die sogar für verschiedene Encoder vorbereitet ist.

Vielen Dank