Inhoudsopgave:

Eenvoudige roterende decoder - Ajarnpa
Eenvoudige roterende decoder - Ajarnpa

Video: Eenvoudige roterende decoder - Ajarnpa

Video: Eenvoudige roterende decoder - Ajarnpa
Video: Стивен Вольфрам: Рулиада, сознание и бесконечность 2024, Juli-
Anonim
Image
Image
Eenvoudige roterende decoder
Eenvoudige roterende decoder

Dit instructable beschrijft een eenvoudige methode voor het decoderen van een sequentiële roterende encoder met behulp van een Arduino Uno R3.

Compacte softwareroutines worden gebruikt om het aantal overgangen te tellen, contact bounce te elimineren en de draairichting te bepalen. Extra componenten en opzoektabellen zijn niet vereist.

Interrupt- en non-interruptversies van de code zijn beschikbaar.

De interrupt-versie van de code vereist slechts een enkele interrupt-pin.

Afbeeldingen:

  • De openingsfoto toont de gemonteerde encoder.
  • De schermafbeelding toont de code voor de interruptversie en de telling wanneer de encoderas met de klok mee en tegen de klok in wordt gedraaid.
  • De video toont de telling tijdens snelle rotatie.

Stap 1: Schakelschema

Schakelschema
Schakelschema

Het bedradingsschema van de encoder wordt getoond in fig.1.

De jumperdraden worden rechtstreeks op de encoderpinnen gesoldeerd.

Verwissel de twee blauwe draden als de telrichting wordt omgekeerd.

Stap 2: Onderdelenlijst

De volgende onderdelen zijn verkregen van

  • 1 alleen Arduino UNO R3 met USB-kabel.
  • 1 alleen sequentiële roterende encoder (EC11 of equivalent) met schakelaar.
  • 1 enige knop die bij de schacht past.
  • 3 alleen Arduino male-to-male jumperdraden.

Stap 3: Theorie

Theorie
Theorie

Sequentiële roterende encoders genereren twee blokgolven die elk 90 graden worden verplaatst, zoals weergegeven in Fig.1.

De logische patronen bij contact A en contact B zijn verschillend wanneer de as met de klok mee (CW) en tegen de klok in (CCW) wordt gedraaid door de posities 1 tot 6.

Gebruikelijke methoden voor het bepalen van de draairichting zijn onder meer:

  • hardware
  • dubbele onderbrekingen
  • patroonopzoektabellen

Dit project gebruikt een softwaremethode waarvoor geen opzoektabellen nodig zijn. [1]

Richting

In plaats van te kijken naar de uitvoerpatronen van Contact A en Contact B, laten we ons concentreren op Contact A.

Als we een steekproef nemen van Contact B na elke overgang van Contact A, merken we op dat:

  • Contact A en Contact B hebben tegengestelde logische toestanden wanneer de encoder CW wordt gedraaid
  • Contact A en Contact B hebben dezelfde logische status wanneer de encoder tegen de klok in wordt gedraaid

Actuele code:

// ----- Overgangen tellen

HuidigeStateA = staatContactA(); if (CurrentStateA! = LastStateA) { CurrentStateB = digitalRead (ContactB); if (CurrentStateA == CurrentStateB) Count++; if (CurrentStateA != CurrentStateB) Count--; LastStateA = HuidigeStateA; }

Deze methode biedt de volgende voordelen:

  • opzoektabellen zijn niet vereist
  • er is slechts een enkele onderbrekingsregel vereist

debounce

Alle mechanische encoders hebben last van "contact bounce".

Als een schakelcontact niet netjes maakt/verbreekt, zal zijn logische toestand snel oscilleren van HOOG naar LAAG totdat het schakelcontact tot rust komt. Dit resulteert in valse tellingen.

Een methode om contactbotsing te onderdrukken, is door een kleine condensator over elk schakelcontact toe te voegen. De condensator en de bijbehorende pull-up-weerstand vormen een integrator die hoge frequenties effectief kortsluit en de schakelspanning gracieus laat stijgen/dalen.

Het nadeel van deze benadering is dat overgangen kunnen worden gemist als de encoderas snel wordt geroteerd.

Software debouncen

Deze methode maakt gebruik van twee tellers (Open, Gesloten) die op nul zijn gezet. [2]

Zodra een overgang is gedetecteerd op Contact A:

  • Doorlopend contact opnemen met Contact A.
  • Verhoog de Open-teller en reset de Gesloten-teller wanneer contact A HOOG is.
  • Verhoog de Gesloten-teller en reset de Open-teller wanneer contact A LAAG is.
  • Verlaat de lus wanneer een van de tellers een vooraf bepaalde telling bereikt. We zijn in feite op zoek naar de stabiele periode na een contact bounce.

Actuele code:

// ----- Debounce Contact A

while (1) {if (digitalRead (ContactA)) { // ----- ContactA is Open Gesloten = 0; // Lege tegenoverliggende integrator Open++; // Integreer als (Open> MaxCount) HOOG retourneert; } else { // ----- ContactA is Gesloten Open = 0; // Lege tegenoverliggende integrator Closed++; // Integreer als (Gesloten > MaxCount) LOW retourneert; } }

Het is niet nodig om contact B te debouncen, omdat de overgangen van contact A en contact B niet samenvallen.

Tellen

Een mechanische "pal" verdubbelt effectief uw telling omdat er twee tellingen worden geregistreerd tussen klikken (zie fig. 1).

Het aantal “palletjes” kan worden bepaald met behulp van modulo 2 rekenkunde zoals hieronder getoond.

Actuele code:

// ----- Tel "detents"

if (Aantal % 2 == 0) { Serial.print("Aantal: "); Serial.println (Tellen / 2); }

Referenties

Verdere informatie is te vinden op:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Stap 4: Software

Dit project vereist een recente versie van de Ardino Uno R3 IDE (geïntegreerde ontwikkelomgeving) die beschikbaar is op

Download elk van de volgende twee Arduino-schetsen (bijgevoegd)

  • rotary_encoder_1.ino (polling-versie)
  • rotary_encoder_2.no (interrupt-versie)

Dubbelklik op uw voorkeursversie en volg de instructies op het scherm.

Genieten van …

Klik hier om mijn andere instructables te bekijken.

Aanbevolen: