INHOUDSOPGAWE:

Eenvoudige roterende dekodeerder: 4 stappe
Eenvoudige roterende dekodeerder: 4 stappe

Video: Eenvoudige roterende dekodeerder: 4 stappe

Video: Eenvoudige roterende dekodeerder: 4 stappe
Video: Ongewone 4-takt motor - ZONDER KLEPPEN draait de mouw Wat voor beest is dit ??? 2024, November
Anonim
Image
Image
Eenvoudige roterende dekodeerder
Eenvoudige roterende dekodeerder

Hierdie instruksies beskryf 'n eenvoudige metode om 'n opeenvolgende roterende enkodeerder te ontsyfer met 'n Arduino Uno R3.

Kompakte sagteware -roetines word gebruik om die aantal oorgange te tel, kontakstoot uit te skakel en die draairigting te bepaal. Bykomende komponente en soektabelle is nie nodig nie.

Onderbroke en nie-onderbrekende weergawes van die kode word verskaf.

Die onderbrekingsweergawe van die kode benodig slegs 'n enkele onderbrekingspen.

Beelde:

  • Die openingsfoto toon die saamgestelde encoder.
  • Die skermkiekie toon die kode vir die onderbrekingsweergawe en die telling wanneer die encoder -as kloksgewys en linksom gedraai word.
  • Die video toon die telling tydens vinnige rotasie.

Stap 1: Kringdiagram

Stroombaandiagram
Stroombaandiagram

Die bedradingsdiagram van die encoder word in figuur 1 getoon.

Die jumper drade word direk aan die encoder penne gesoldeer.

Verander die twee blou drade as die telrigting omgekeer word.

Stap 2: Onderdele lys

Die volgende onderdele is verkry vanaf

  • 1 slegs Arduino UNO R3 met USB -kabel.
  • 1 slegs opeenvolgende roterende encoder (EC11 of ekwivalent) met skakelaar.
  • 1 knop slegs vir die as.
  • 3 slegs Arduino man-tot-man trui.

Stap 3: Teorie

Teorie
Teorie

Opeenvolgende roterende enkoders genereer twee vierkantgolwe wat elk met 90 grade verplaas word, soos getoon in figuur 1.

Die logiese patrone by kontak A en kontak B verskil wanneer die as kloksgewys (CW) en linksom (CCW) deur posisies 1 tot 6 gedraai word.

Algemene metodes om die draairigting te bepaal, sluit in:

  • hardeware
  • tweeling onderbreek
  • patrone opsoek tafels

Hierdie projek maak gebruik van 'n sagtewaremetode wat geen opzoektabelle benodig nie. [1]

Rigting

In plaas van na die uitvoerpatrone van Contact A en Contact B te kyk, fokus ons op Contact A.

As ons kontak B na elke kontak A -oorgang neem, let ons op dat:

  • Kontak A en kontak B het teenoorgestelde logiese toestande wanneer die encoder CW gedraai word
  • Kontak A en kontak B het dieselfde logiese toestand wanneer die encoder CCW gedraai word

Werklike kode:

// ----- Tel oorgange

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

Hierdie metode bied die volgende voordele:

  • Soektabelle is nie nodig nie
  • slegs 'n enkele onderbrekingslyn is nodig

Ontken

Alle meganiese encoders ly aan 'kontakstoot'.

As 'n skakelaarkontak nie skoon maak/breek nie, sal die logiese toestand vinnig ossilleer van HOOG na LAAG totdat die skakelaarkontak gaan lê. Dit lei tot vals tellings.

Een metode om kontakstoot te onderdruk, is om 'n klein kondensator by elke skakelkontak te voeg. Die kapasitor en gepaardgaande optrekweerstand vorm 'n integrator wat effektief hoë frekwensies kortmaak en die skakelaarspanning grasieus laat styg/daal.

Die nadeel van hierdie benadering is dat oorgange gemis kan word as die encoder -as vinnig gedraai word.

Sagteware -ontbinding

Hierdie metode gebruik twee tellers (oop, geslote) wat op nul gestel is. [2]

Sodra 'n oorgang op kontak A opgespoor is:

  • Deurlopende peiling Kontak A.
  • Verhoog die oop toonbank en stel die geslote toonbank terug wanneer kontak A HOOG is.
  • Verhoog die geslote toonbank en stel die oop toonbank terug wanneer kontak A laag is.
  • Verlaat die lus wanneer een van die tellers 'n voorafbepaalde telling bereik. Ons is effektief op soek na 'n bestendige toestand na kontakbotsing.

Werklike kode:

// ----- Ontbreek kontak A

terwyl (1) {if (digitalRead (ContactA)) {// ----- ContactA oop is gesluit = 0; // Leë teenoorstaande integrator Open ++; // Integreer as (Open> MaxCount) opbrengs HOOG; } anders {// ----- ContactA is gesluit oop = 0; // Leë teenoorgestelde integrator Geslote ++; // Integreer as (Geslote> MaxCount) opgawe LAAG is; }}

Dit is nie nodig om kontak B af te weer nie, aangesien die oorgang van kontak A en kontak B nie saamval nie.

Tel

'N Meganiese' detent 'verdubbel u telling effektief, aangesien twee tellings tussen kliks geregistreer word (sien fig. 1).

Die aantal "detents" kan bepaal word met behulp van rekenkundige modulo 2 soos hieronder getoon.

Werklike kode:

// ----- Tel "detensies"

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

Verwysings

Verdere inligting kan gevind word by:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Stap 4: sagteware

Hierdie projek benodig 'n onlangse weergawe van die Ardino Uno R3 IDE (geïntegreerde ontwikkelingsomgewing) wat beskikbaar is by

Laai elk van die volgende twee Arduino -sketse af (aangeheg)

  • rotary_encoder_1.ino (peilingsweergawe)
  • rotary_encoder_2.no (onderbreek weergawe)

Dubbelklik op die weergawe wat u verkies en volg die instruksies op die skerm.

Geniet…

Klik hier om my ander instruksies te sien.

Aanbeveel: