Inhaltsverzeichnis:

Einfacher Drehdecoder - Gunook
Einfacher Drehdecoder - Gunook

Video: Einfacher Drehdecoder - Gunook

Video: Einfacher Drehdecoder - Gunook
Video: Как сделать простой бумаге BB пистолет / Gun (Хенель 100) | Легко учебник 2024, Juli
Anonim
Image
Image
Einfacher Drehdecoder
Einfacher Drehdecoder

Dieses anweisbare beschreibt eine einfache Methode zum Decodieren eines sequentiellen Drehgebers mit einem Arduino Uno R3.

Kompakte Softwareroutinen werden verwendet, um die Anzahl der Übergänge zu zählen, Kontaktprellen zu eliminieren und die Drehrichtung zu bestimmen. Zusätzliche Komponenten und Nachschlagetabellen sind nicht erforderlich.

Interrupt- und Non-Interrupt-Versionen des Codes werden bereitgestellt.

Die Interrupt-Version des Codes erfordert nur einen einzigen Interrupt-Pin.

Bilder:

  • Das Eröffnungsfoto zeigt den zusammengebauten Encoder.
  • Der Screenshot zeigt den Code für die Interrupt-Version und den Zählerstand, wenn die Encoderwelle im Uhrzeigersinn und gegen den Uhrzeigersinn gedreht wird.
  • Das Video zeigt die Zählung während der schnellen Rotation.

Schritt 1: Schaltplan

Schaltplan
Schaltplan

Der Schaltplan des Encoders ist in Abb. 1 dargestellt.

Die Jumperdrähte werden direkt an die Encoderpins gelötet.

Vertauschen Sie die beiden blauen Drähte, wenn die Zählrichtung umgekehrt wird.

Schritt 2: Teileliste

Die folgenden Teile wurden von https://www.aliexpress.com/ bezogen.

  • 1 nur Arduino UNO R3 mit USB-Kabel.
  • 1 nur sequenzieller Drehgeber (EC11 oder gleichwertig) mit Schalter.
  • 1 einziger Knopf passend zur Welle.
  • 3 nur Arduino-Stecker-zu-Stecker-Überbrückungsdrähte.

Schritt 3: Theorie

Theorie
Theorie

Sequentielle Drehgeber erzeugen zwei Rechteckwellen, von denen jede um 90 Grad verschoben ist, wie in Abb. 1 gezeigt.

Die Logikmuster an Kontakt A und Kontakt B sind unterschiedlich, wenn die Welle im Uhrzeigersinn (CW) und gegen den Uhrzeigersinn (CCW) durch die Positionen 1 bis 6 gedreht wird.

Gängige Methoden zur Bestimmung der Drehrichtung sind:

  • Hardware-
  • Zwillingsunterbrechungen
  • Mustersuchtabellen

Dieses Projekt verwendet eine Softwaremethode, die keine Nachschlagetabellen erfordert. [1]

Richtung

Anstatt die Ausgabemuster von Kontakt A und Kontakt B zu betrachten, konzentrieren wir uns auf Kontakt A.

Wenn wir Kontakt B nach jedem Übergang von Kontakt A abtasten, stellen wir Folgendes fest:

  • Kontakt A und Kontakt B haben entgegengesetzte logische Zustände, wenn der Encoder im Uhrzeigersinn gedreht wird
  • Kontakt A und Kontakt B haben den gleichen logischen Zustand, wenn der Encoder gegen den Uhrzeigersinn gedreht wird

Tatsächlicher Code:

// ----- Übergänge zählen

CurrentStateA = stateContactA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Anzahl++; if (CurrentStateA != CurrentStateB) Anzahl--; LastStateA = CurrentStateA; }

Diese Methode bietet folgende Vorteile:

  • Nachschlagetabellen sind nicht erforderlich
  • nur eine einzige Unterbrechungsleitung erforderlich

Entprellen

Alle mechanischen Encoder leiden unter „Kontaktprellen“.

Wenn ein Schaltkontakt nicht sauber schließt/unterbricht, schwingt sein logischer Zustand schnell von HIGH nach LOW, bis der Schaltkontakt zur Ruhe kommt. Dies führt zu falschen Zählungen.

Eine Methode zum Unterdrücken des Kontaktprellens besteht darin, jedem Schaltkontakt einen kleinen Kondensator hinzuzufügen. Der Kondensator und der zugehörige Pull-up-Widerstand bilden einen Integrator, der hohe Frequenzen effektiv kurzschließt und ein gleichmäßiges Ansteigen/Abfallen der Schaltspannung ermöglicht.

Der Nachteil dieses Ansatzes besteht darin, dass Übergänge übersehen werden können, wenn die Encoderwelle schnell gedreht wird.

Software-Entprellung

Diese Methode verwendet zwei Zähler (Offen, Geschlossen), die auf Null gesetzt wurden. [2]

Sobald bei Kontakt A ein Übergang erkannt wird:

  • Kontinuierlich befragen Kontakt A.
  • Erhöhen Sie den Open-Zähler und setzen Sie den Closed-Zähler zurück, wenn Kontakt A HIGH ist.
  • Erhöhen Sie den Geschlossen-Zähler und setzen Sie den Offen-Zähler zurück, wenn Kontakt A NIEDRIG ist.
  • Verlassen Sie die Schleife, wenn einer der Zähler einen vorbestimmten Zählerstand erreicht. Wir suchen effektiv nach der Dauer des stationären Zustands nach einem Kontaktabprall.

Tatsächlicher Code:

// ----- Kontakt entprellen A

while (1) { if (digitalRead (ContactA)) {// ----- ContactA ist offen geschlossen = 0; // Leeren Sie den entgegengesetzten Integrator Open++; // Integrieren if (Open > MaxCount) return HIGH; } else { // ----- ContactA ist geschlossen Open = 0; // Entleeren Sie den gegenüberliegenden Integrator Closed++; // Integrieren if (Closed > MaxCount) return LOW; } }

Es besteht keine Notwendigkeit, Kontakt B zu entprellen, da die Übergänge von Kontakt A und Kontakt B nicht zusammenfallen.

Zählen

Eine mechanische „Einrastung“verdoppelt effektiv Ihre Zählung, da zwischen den Klicks zwei Zählungen registriert werden (siehe Abb. 1).

Die Anzahl der "Einrastungen" kann mit Modulo-2-Arithmetik wie unten gezeigt bestimmt werden.

Tatsächlicher Code:

// ----- "Rastungen" zählen

Wenn (Anzahl % 2 == 0) {Serial.print ("Anzahl: "); Serial.println (Anzahl / 2); }

Verweise

Weitere Informationen finden Sie unter:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Schritt 4: Software

Dieses Projekt erfordert eine aktuelle Version der Ardino Uno R3 IDE (integrierte Entwicklungsumgebung), die unter https://www.arduino.cc/en/main/software verfügbar ist

Laden Sie jede der folgenden beiden Arduino-Skizzen herunter (beigefügt)

  • rotation_encoder_1.ino (Abfrageversion)
  • rotation_encoder_2.no (Unterbrechungsversion)

Doppelklicken Sie auf Ihre bevorzugte Version und folgen Sie den Anweisungen auf dem Bildschirm.

Genießen …

Klicken Sie hier, um meine anderen instructables anzuzeigen.

Empfohlen: