Innehållsförteckning:

Enkel roterande avkodare: 4 steg
Enkel roterande avkodare: 4 steg

Video: Enkel roterande avkodare: 4 steg

Video: Enkel roterande avkodare: 4 steg
Video: Бесшовные следки на 2-х спицах с красивой регланной линией. Подробный мастер класс ДЛЯ НАЧИНАЮЩИХ. 2024, Juli
Anonim
Image
Image
Enkel roterande avkodare
Enkel roterande avkodare

Denna instruerbara beskriver en enkel metod för att avkoda en sekventiell roterande kodare med en Arduino Uno R3.

Kompakta programvarurutiner används för att räkna antalet övergångar, eliminera kontaktstopp och bestämma rotationsriktningen. Ytterligare komponenter och uppslagstabeller krävs inte.

Avbrotts- och icke-avbrottsversioner av koden tillhandahålls.

Avbrottsversionen av koden kräver bara en enda avbrottsstift.

Bilder:

  • Öppningsfotot visar den monterade kodaren.
  • Skärmbilden visar koden för avbrottsversionen och räkningen när givaraxeln vrids medurs och moturs.
  • Videon visar räkningen under snabb rotation.

Steg 1: Kretsdiagram

Kretsdiagram
Kretsdiagram

Kodarens kopplingsschema visas i fig.1.

Bygeltrådarna löds direkt på pinnarna.

Byt ut de två blå ledningarna om räkningsriktningen är omvänd.

Steg 2: Dellista

Följande delar erhölls från

  • 1 endast Arduino UNO R3 med USB -kabel.
  • 1 endast sekventiell roterande givare (EC11 eller motsvarande) med switch.
  • 1 ratt som passar axeln.
  • 3 endast Arduino man-till-han-bygelkablar.

Steg 3: Teori

Teori
Teori

Sekventiella roterande kodare genererar två kvadratvågor som var och en är förskjutna med 90 grader som visas i figur 1.

Logikmönstren vid kontakt A och kontakt B är olika när axeln vrids medurs (CW) och moturs (CCW) genom positionerna 1 till 6.

Vanliga metoder för att bestämma rotationsriktningen inkluderar:

  • hårdvara
  • tvillingavbrott
  • mönsteruppslagstabeller

Detta projekt använder en mjukvarumetod som inte kräver uppslagstabeller. [1]

Riktning

Istället för att titta på utmatningsmönstren från Kontakt A och Kontakt B, låt oss fokusera på Kontakt A.

Om vi provar kontakt B efter varje kontakt A -övergång noterar vi att:

  • Kontakt A och kontakt B har motsatta logiska tillstånd när kodaren vrids CW
  • Kontakt A och kontakt B har samma logiska tillstånd när kodaren vrids CCW

Faktisk kod:

// ----- Räkna övergångar

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

Denna metod erbjuder följande fördelar:

  • uppslagstabeller krävs inte
  • endast en enda avbrottslinje krävs

Debounce

Alla mekaniska givare lider av "kontaktstopp".

Om en omkopplare inte bryter/bryts rent kommer dess logiska tillstånd att pendla snabbt från HÖG till LÅG tills omkopplarkontakten löser sig. Detta resulterar i falska räkningar.

En metod för att undertrycka kontaktstopp är att lägga till en liten kondensator över varje switchkontakt. Kondensatorn och tillhörande uppdragningsmotstånd bildar en integrator som effektivt kortar höga frekvenser och låter omkopplingsspänningen stiga/falla graciöst.

Nackdelen med detta tillvägagångssätt är att övergångar kan missas om kodaraxeln roteras snabbt.

Programvarubankning

Denna metod använder två räknare (öppen, stängd) som har satts till noll. [2]

När en övergång detekteras på kontakt A:

  • Kontinuerlig omröstning Kontakta A.
  • Öka den öppna räknaren och återställ den stängda räknaren när kontakt A är HÖG.
  • Öka den stängda räknaren och återställ den öppna räknaren när kontakt A är LÅG.
  • Avsluta slingan när en av räknarna når ett förutbestämt antal. Vi letar effektivt efter steady state -perioden efter varje kontaktstopp.

Faktisk kod:

// ----- Avsluta kontakt A

medan (1) {if (digitalRead (ContactA)) {// ----- ContactA är öppen stängd = 0; // Tom motsatt integrator Open ++; // Integrera om (Open> MaxCount) returnerar HIGH; } annat {// ----- ContactA är stängd öppen = 0; // Tom motsatt integrator Stängd ++; // Integrera if (Closed> MaxCount) return LOW; }}

Det är inte nödvändigt att avbryta kontakt B eftersom kontakt A och kontakt B övergångar inte sammanfaller.

Räkning

Ett mekaniskt "spärr" fördubblar effektivt ditt antal eftersom två räkningar registreras mellan klick (se fig 1).

Antalet”spärrar” kan bestämmas med hjälp av modulo 2 -aritmetik enligt nedan.

Faktisk kod:

// ----- Räkna "spärrar"

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

Referenser

Mer information finns på:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

Steg 4: Programvara

Detta projekt kräver en ny version av Ardino Uno R3 IDE (integrerad utvecklingsmiljö) som är tillgänglig från

Ladda ner var och en av följande två Arduino -skisser (bifogade)

  • rotary_encoder_1.ino (pollingversion)
  • rotary_encoder_2.no (avbrottsversion)

Dubbelklicka på din önskade version och följ instruktionerna på skärmen.

Njut av …

Klicka här för att se mina andra instruktioner.

Rekommenderad: