Codificator sgp 1 0196 schemă de cablare. Conectarea unui codificator la un microcontroler PIC

În cele din urmă am primit această întorsătură minunată și acum vreau să vă spun cum să lucrați cu ea. Codificatorul meu (EC12E24204A9) este cam așa:

Codificatorul are trei pini: Common, A și B. Common este de obicei întotdeauna conectat la masă și ceilalți doi la orice pini ai microcontrolerului. Știfturile A și B trebuie trase până la sursa de alimentare pozitivă prin rezistoare de ordinul a 10 kOhm pentru a exclude alarmele false din pickup-uri. Nu aș recomanda utilizarea unui microcontroler intern de strângere. Este foarte slabă. Pentru a demonstra cum funcționează, să închidem încă 8 LED-uri. (notă: Dacă se utilizează mega16, mega32 și mai vechi, atunci trebuie să opriți jtag, altfel jumătate din LED-uri nu se vor aprinde)
Deci, avem următoarea schemă:


Rotiți butonul codificatorului spre dreapta - lumina rulează spre dreapta. Răsuciți spre stânga - lumina merge spre stânga. Cum funcționează un codificator? Ne vom da seama. Nu este nimic complicat. Să aruncăm o privire la graficele de mai jos.
Când codificatorul este rotit într-o direcție, semnalul arată astfel:

Altcuiva:

Se pune întrebarea: cum poate distinge microcontrolerul direcția de rotație a codificatorului?

Există doi algoritmi populari de interogare a codificatorului:

  • Întrerupeți sondajul
  • Interogare comparând starea anterioară a codificatorului și cea curentă

Fiecare dintre aceste metode de anchetă are propriile avantaje și dezavantaje. Le-am încercat pe amândouă și m-am stabilit pe a doua metodă. Lucrul bun despre interogarea cu întreruperi este că puteți oferi un răspuns instantaneu la rotația butonului codificatorului. Dar există și un dezavantaj grav. Cum ar fi sări de contact. Pentru a-l suprima, desigur, puteți folosi diverse instrumente software și hardware, dar nu m-am deranjat. Să aruncăm o privire mai atentă asupra celui de-al doilea algoritm de sondare. În timpul funcționării, microcontrolerul citește în mod continuu date de pe pinii pe care atârnă codificatorul și compară ceea ce a citit cu rezultatul citirii anterioare. În funcție de rezultatul comparării stărilor, programul trage concluzii despre direcția de rotație. Există comentarii în program, cred că vor fi suficiente pentru a înțelege algoritmul. Dacă aveți întrebări, puteți întreba, ca întotdeauna, în comentarii.

Codificator incremental se pare ca potențiometru, dar spre deosebire de un potențiometru, nu are poziții finale, se poate roti în ambele direcții pentru un număr nelimitat de rotații. De asemenea, trebuie remarcat faptul că codificatorul incremental nu se rotește la fel de lin ca potențiometrul, ci în trepte. Poate fi văzut la radioul auto, osciloscop, un centru de muzică, o mașină de spălat și alte echipamente, unde reglarea unui parametru se efectuează în limite largi. Desigur, parametrii pot fi modificați și folosind butoanele, de exemplu, pentru a face muzica cu 20 de valori mai puternice, atunci când controlați butonul, trebuie să îl apăsați de 20 de ori, iar când controlați codificatorul, rotiți-l la un anumit unghi, în funcție de algoritmul de procesare.

Codificator incremental reprezintă două contacte, a cărui ordine de închidere depinde de sensul de rotație.


De fapt un codificator incremental transformă rotația arborelui în impulsuri electrice care conține informații despre direcția de rotație.

Să construim circuitul de testare prezentat în imaginea de mai sus și să ne conectăm la pinii A și B osciloscop, rezistențe de tragere - 4,7K.
Să rotim codificatorul în sensul acelor de ceasornic.


Acum în sens invers acelor de ceasornic.


Oscilogramele arată că, în funcție de direcția de rotație, ordinea de închidere a contactului se schimbă. Dar partea din față nu este întotdeauna atât de frumoasă.


Deoarece contactele sunt mecanice, acestea sunt predispuse la sărituri, adică atunci când se închid datorită elasticității materialelor, apar scurte circuite și deschideri necontrolate multiple, care pot fi văzute pe oscilograma de mai sus.

Există două modalități de a face față rebotului, primul constă în adăugarea de condensatori și rezistențe așa cum se arată în imaginea de mai jos.


Deoarece săritura este un fenomen pe termen scurt, este ușor stinsă de un condensator.


Oscilograma arată că, după instalarea condensatoarelor, fronturile au devenit mai puțin abrupte, iar săritura a dispărut.

A doua cale- software și totul depinde de implementarea interogării ieșirilor codificatorului. Dacă starea codificatorului monitorizată prin întreruperi externe, apoi după declanșarea întreruperii, este necesar să se facă o întârziere de 20-30 de milisecunde, timp în care MC nu va răspunde la o modificare a stării de ieșire, adică nu va simți sări. Dacă interogarea pinilor codificatorului este implementată pe un temporizator, atunci intervalul dintre sondaje ar trebui să fie mai lung decât durata săriturii, aceleași 20-30 de milisecunde.

sa luam in considerare metode de procesare a datelor provenite de la codificator.
Prima metodă este că conectăm unul dintre picioarele codificatorului la ieșirea întreruperilor externe și îl configurăm pentru o întrerupere pe marginea de cădere. Întrerupere, verificăm starea celuilalt picior și, dacă este zero, atunci rotația are loc într-o direcție, altfel în cealaltă. Mai jos este codul care implementează această metodă pentru AVR.
#include ISR (INT2_vect) (dacă (PINB & 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<Când codificatorul este rotit pe o parte, LED-ul se aprinde, când codificatorul este rotit pe cealaltă, se stinge.

A doua metodă este comparând starea actuală și cea anterioară... Să exprimăm nivelurile logice ale unui tren de impulsuri ca zero și unii.


Apoi obținem un număr finit de stări ale codificatorului. Prima cifră este nivelul logic al primei ieșiri a codificatorului, a doua este nivelul logic al celei de-a doua ieșiri.

Să presupunem că ultima stare în care a fost localizat codificatorul este egală cu trei, dacă următoarea stare este egală cu una, atunci se rotește într-o direcție, dacă două, apoi în cealaltă. Se pare că puteți repara tranziția de la o stare la alta și puteți determina direcția de rotație, dar cea mai simplă implementare este atunci când treceți de la 11 la 01 și 10. Mai jos este codul care implementează algoritmul descris pentru AVR,
#define F_CPU 8000000UL #include #include uint8_t last_state = 0; ISR (TIMER0_COMP_vect) (// ambii pini ai codificatorului sunt conectați la pinii 2 și 3 ai portului B // citiți starea lor uint8_t current_state = (PINB & 0x06) >> 1; // luați în considerare tranziția numai dacă starea anterioară este 11 // și dacă nu este egal cu cel nou if ((last_state == 3) && (last_state! = Current_state)) (// dacă noua stare este 01 - aprindeți LED-ul dacă (current_state == 1) (PORTB | = 0x01;) // dacă noua stare este 10 - opriți LED-ul dacă (current_state == 2) (PORTB & = ~ 0x01;)) // la ieșirea din întrerupere, starea curentă devine ultima_state anterioară = current_state;) int main (void) (// două intrări pentru conectarea codificatorului DDRB & = ~ 0x06; // trageți intrările în sus la sursa de alimentare PORTB | = 0x06; // ieșire pentru conectarea LED-ului DDRB | = 0x01 ; // setați temporizatorul să se reseteze prin coincidență TCCR0 = (1<Asta e tot.
Codificatorul cumpărat

Modulul de codificare KY-040 este un senzor mecanic de unghi de rotație, convertește unghiul de rotație al unui obiect rotativ (de exemplu, un arbore) în semnale electrice care sunt deplasate la 90 de grade unul față de celălalt. Acest modul are trei pini - CLK, DT și SW. Semnalele deplasate cu 90 de grade unul față de celălalt apar exact pe pinii CLK și DT atunci când sunt rotiți în sensul acelor de ceasornic / invers, pinul SW este utilizat pentru a obține starea axei centrale a codificatorului, care funcționează ca un buton.

Deci, fără a intra în detaliile dispozitivului de codificare în circuit (acesta va fi un articol separat), să îl conectăm la placa Arduino Uno. Schema de cablare a modulului codificator împreună cu un indicator cu șapte segmente din mai multe cifre:

Ne va fi suficient doar să analizăm starea semnalelor pe care le dau pinii CLK și DT, pentru aceasta există o mică diagramă a circuitului care va arăta cum se schimbă semnalele atunci când se rotesc într-o direcție sau alta.

Din diagramă se poate observa că de fiecare dată când semnalul A (codorul CLK pin) trece de la mare la scăzut, starea semnalului B (codorul DT pin) este citită. Dacă semnalul B oferă un nivel de semnal ridicat, înseamnă că rotația codificatorului este în sensul acelor de ceasornic. Dacă semnalul B dă un nivel scăzut al semnalului atunci când semnalul A trece de la scăzut la înalt, atunci aceasta înseamnă că codificatorul se rotește în sens invers acelor de ceasornic. Citind ambele semnale în program, puteți determina direcția de rotație, de asemenea, atunci când numărați impulsurile semnalului B, puteți incrementa sau diminua contorul de impulsuri al software-ului.

Pentru a citi semnalele A și B, precum și semnalele de pe axa centrală a codificatorului (nu uitați - funcționează ca un buton), puteți aplica structura descrisă mai jos. Acest design poate fi încorporat în schiță, adăugând diverse funcționalități, totul fiind limitat doar de dorința și imaginația dezvoltatorului. Corpul structurii este destul de bine comentat; în viitor, pentru simplitatea textului schiței, comentariile pot fi eliminate. Deci, o structură pentru citirea și conversia semnalelor codificatorului în date utile:

// Variabile temporare pentru stocarea nivelurilor de semnal // primite de la encoder nesemnat char encoder_A, encoder_B, encoder_A_prev; // Variabilă pentru a urmări clicurile butonului - // axa centrală a codificatorului static bool SW_State = false; void setup () (// Presetări // Declarații variabile // Inițializați porturi etc.) void loop () (// CLK la pinul 3 pe Arduino // DT la pinul 4 pe Arduino // Citiți valorile a ieșirilor codificatorului // Și le stocați în variabilele encoder_A = digitalRead (3); encoder_B = digitalRead (4); // Dacă nivelul semnalului A este scăzut, // iar în ciclul anterior acesta a fost ridicat dacă (! Encoder_A && encoder_A_prev) (// Dacă nivelul semnalului B este ridicat dacă (encoder_B) (// Aceasta înseamnă că rotația este în sensul acelor de ceasornic // Aici puteți insera o operație de creștere // Aici puteți insera unele dintre propriile // operațiuni de procesare a datelor în direcția necesară) // În cazul în care nivelul semnalului La scăzut altceva (// Aceasta înseamnă că rotația este în sens invers acelor de ceasornic // Aici puteți introduce o operație de decrementare // Aici puteți introduce oricare dintre propriile // operațiuni de procesare a datelor în direcția dorită )) // Trebuie să salvați cu siguranță starea nivelului curent al semnalului A // pentru utilizare utilizarea acestei valori în următorul ciclu de scanare al programului encoder_A_prev = encoder_A; // Lucrăm cu axa centrală a codificatorului - un buton // Această bucată de cod formează un fel de declanșator de comutare // Citiți valoarea pinului 2 de pe placa Arduino // la care este conectat codul SW pin // Dacă se apasă axa centrală, atunci semnalul SW va fi de nivel scăzut dacă (! DigitalRead (2)) (// Dacă variabila SW_State este setată la false, atunci setați-o la true dacă (! SW_State) (// Și amintiți-vă starea SW_State = adevărat;) // Și invers - dacă variabila SW_State este setată la adevărat, // apoi resetați-o la altceva fals (// Și amintiți-vă starea SW_State = fals;)))

O schiță pentru procesarea semnalelor codificatorului și afișarea valorii contorului pe afișaj este prezentată mai jos. Această schiță are o structură încorporată pentru citirea și conversia semnalelor codificatoare, care a fost descrisă mai sus.

#include "LedControl.h" / * * Conectăm biblioteca LedControl.h * și creăm un obiect din clasa LedControl * în timp ce afișajul pe 7 segmente cu driverul MAX72xx * trebuie să fie conectat la placa Arduino după cum urmează: * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Display Module MAX72xx * Arduino -> Encoder Module * Arduino -> Encoder Module * Arduino -> Encoder Module * / LedControl lc = LedControl (12, 11, 10, 1); // Denumiți adresele portului de pe placa Arduino const int Dir = 4; const int Pas = 3; const int Switch = 2; // Contorul este o variabilă pentru stocarea valorii contorului static Contor lung = 0; // SW_State - declanșator de semnalizare pentru urmărirea apăsării axei centrale static bool SW_State = false; // Variabile temporare pentru stocarea nivelurilor semnalelor codificatorului nesemnate encoder_A, encoder_B, encoder_A_prev; setare nulă () (// Dispozitivul (afișaj cu 7 segmente) este scos din modul de repaus lc.shutdown (0, fals); // Setați luminozitatea afișajului la 8 // Moduri de luminozitate posibile totale de la 0 la 15 lc. setIntensity (0, 8); // Ștergeți afișajul lc.clearDisplay (0); // Configurați porturile codificatorului pinMode (Dir, INPUT); pinMode (Step, INPUT); pinMode (Switch, INPUT);) void loop () (// Citiți valorile ieșirilor codificatorului // Și stocați-le în variabilele encoder_A = digitalRead (Step); encoder_B = digitalRead (Dir); // Dacă nivelul semnalului A este scăzut, // și în ciclul anterior a fost ridicat dacă (! Encoder_A && encoder_A_prev) (// Dacă nivelul semnalului B este ridicat dacă (encoder_B) (// Aceasta înseamnă că rotația este în sensul acelor de ceasornic // Starea noastră: // Dacă valoarea contorului este mai mare de sau egal cu numărul maxim dacă (Contor> = 99999999) (// Resetați valoarea contorului Contor = 0;) altfel (// În caz contrar, creșteți de fiecare dată când faceți clic cu un singur Contor ++;)) // Dacă nivelul semnalului B este altceva scăzut (// Zn Citește rotația în sens invers acelor de ceasornic // Dacă valoarea contorului este mai mică sau egală cu zero dacă (Contor<= 0) { //проинициализировать значение максимальным числом Counter = 99999999; } else { //Иначе декрементировать при каждом щелчке на единицу Counter --; } } } //Обязательно нужно сохранить состояние текущего уровня сигнала А //для использования этого значения в следующем цикле сканирования программы encoder_A_prev = encoder_A; //Работаем с центральной осью энкодера - кнопкой //Этот кусок кода образует собой как бы перекидной триггер //Считываем значение пина 2 на плате Arduino //которомый проименован как Switch //Если центральная ось нажата - то сигнал Switch будет иметь низкий уровень if(!digitalRead(Switch)) { //Если переменная SW_State установлена в false то установить её в true if(!SW_State) { //И запомнить состояние SW_State = true; } //И наоборот - если переменная SW_State установлена в true, //то сбросить её в false else { //И запомнить состояние SW_State = false; } } //Часть программы которая заполняет разряды //семисегментного дисплея значением счетчика long intCounter = Counter; int divCounter; for(int i = 0; i < 8; i ++) { divCounter = intCounter % 10; intCounter = intCounter / 10; if(intCounter == 0 && SW_State) { if(divCounter == 0) { if(i == 0) { lc.setChar(0, 0, "0", false); } else { lc.setChar(0, i, " ", false); } } else { lc.setDigit(0, i, divCounter, false); } } else { lc.setDigit(0, i, divCounter, false); } } }

Video cum funcționează:


Sperăm că ți-a plăcut materialul acestui articol, lasă-ți întrebările, dorințele și criticile în comentariile de mai jos.

  • Utilizarea codificatoarelor optice industriale în Arduino
Vă rugăm să activați javascript pentru ca comentariile să funcționeze.

Pentru a implementa un proiect demonstrativ, avem nevoie de:

  • Codificator pe 24 de poziții;
  • 16 LED-uri (3mm);
  • Driver LED A6276;
  • microcontroler PIC18F2550.

Un codificator este un element de control modern și original pentru dispozitivele digitale și, în aparență, este similar cu un rezistor variabil (a se vedea figura de mai jos). Un alt nume pentru acest control este senzorul de unghi, senzorul de rotație. Rotirea arborelui este însoțită de clicuri, de exemplu 24 de clicuri pe rotație. Codificatorul are 3 pini - A, B, C și este utilizat pentru introducerea rapidă a datelor în dispozitivele digitale. Unele modele au un buton încorporat care este declanșat prin apăsarea arborelui codificatorului (se adaugă încă o ieșire).

Principiul de funcționare al codificatorului

Când rotiți un clic, de exemplu, spre dreapta, contactul A + C este închis mai întâi, apoi B + C. Când arborele se rotește cu acest clic, contactele se deschid în aceeași ordine. Când arborele este rotit în cealaltă direcție, secvența de închidere cu contactul C se schimbă, adică când se rotește spre stânga, primul B + C este închis, apoi A + C.

Utilizarea codificatorului în proiecte de microcontroler, poate folosind același codificator, implementează mai multe tipuri diferite de intrare de date, cu toate acestea, acest lucru necesită un anumit feedback și vizualizare, astfel încât utilizatorul să știe ce informații intră și în ce poziție este codificatorul.

Diagramă schematică

Pinii codificatorilor A și B sunt conectați la porturile microcontrolerului RB4 și RB5, pinul codificatorului C este conectat la masă. Este demn de remarcat faptul că rezistențele de tracțiune trebuie conectate la liniile de semnal ale pinilor A și B. Codificatorul nu este conectat accidental la liniile de I / O specificate ale microcontrolerului: în primul rând, portul B are rezistențe de tragere încorporate și nu trebuie să le conectăm pe cele externe, iar în al doilea rând, portul B al microcontrolerului are un funcție utilă - „întrerupere la schimbare” - întrerupere la schimbarea nivelului, care ne va permite să monitorizăm starea codificatorului.

16 LED-uri convenționale de 3 mm sunt utilizate pentru a vizualiza datele de intrare și vor fi amplasate pe PCB în jurul codificatorului instalat. LED-urile sunt conectate la cipul A6276.

A6276 este un driver LED pe 16 biți. Driverul conține un registru de deplasare CMOS pe 16 biți, dispozitivele de blocare și driverele asociate pentru a conduce LED-urile și poate conduce mai multe LED-uri decât permite microcontrolerul. În plus, driverul poate fi controlat prin interfața SPI, ceea ce reduce și mai mult numărul de linii I / O utilizate și face proiectul scalabil.

Software-ul microcontrolerului pentru rezolvarea problemei noastre este relativ simplu. Există 3 moduri de funcționare (introducere de informații) și feedback:

  • Mod de poziționare la 360 ° - în acest mod, LED-urile indică „poziția” actuală a codificatorului, utilizatorul poate roti arborele codificatorului spre stânga și dreapta la orice unghi;
  • Modul "Volum / Nivel" - în acest mod LED-urile indică valoarea curentă între nivelurile minime și maxime ale intervalului de intrare (cum ar fi nivelul volumului în dispozitivele audio);
  • 3-Position Rotary Toggle Mode - În acest mod există doar trei poziții selectabile pe care utilizatorul le selectează prin rotirea arborelui codificatorului stânga / dreapta.

Demonstrarea proiectului

Descărcări

Arhiva ZIP cu proiectul în mediul MPLAB și codul sursă în Hitech C, precum și schema și topologia plăcii cu circuite imprimate sunt localizate.

În acest proiect demo, vom analiza sarcina de asociere a unui control numit codificator cu un microcontroler PIC.

Pentru a implementa un proiect demonstrativ, avem nevoie de:

  • Codificator pe 24 de poziții;
  • 16 LED-uri (3mm);
  • Driver LED;
  • microcontroler.

Un codificator este un element de control modern și original pentru dispozitivele digitale și, în aparență, este similar cu un rezistor variabil (a se vedea figura de mai jos). Un alt nume pentru acest control este senzorul de unghi, senzorul de rotație. Rotirea arborelui este însoțită de clicuri, de exemplu 24 de clicuri pe rotație. Codificatorul are 3 pini - A, B, C și este utilizat pentru introducerea rapidă a datelor în dispozitivele digitale. Unele modele au un buton încorporat care este declanșat prin apăsarea arborelui codificatorului (se adaugă încă o ieșire).

Principiul de funcționare al codificatorului

Când rotiți un clic, de exemplu, spre dreapta, contactul A + C este închis mai întâi, apoi B + C. Când arborele se rotește cu acest clic, contactele se deschid în aceeași ordine. Când arborele este rotit în cealaltă direcție, secvența de închidere cu contactul C se schimbă, adică când se rotește spre stânga, primul B + C este închis, apoi A + C.

Utilizarea codificatorului în proiecte de microcontroler, poate folosind același codificator, implementează mai multe tipuri diferite de intrare de date, cu toate acestea, acest lucru necesită un anumit feedback și vizualizare, astfel încât utilizatorul să știe ce informații intră și în ce poziție este codificatorul.


Schema schematică: conectarea unui codificator la un microcontroler PIC (faceți clic pentru a mări)

Pinii codificatorilor A și B sunt conectați la porturile microcontrolerului RB4 și RB5, pinul codificatorului C este conectat la masă. Este demn de remarcat faptul că rezistențele de tracțiune trebuie conectate la liniile de semnal ale pinilor A și B. Codificatorul nu este conectat accidental la liniile de I / O specificate ale microcontrolerului: în primul rând, portul B are rezistențe de tragere încorporate și nu trebuie să le conectăm pe cele externe, iar în al doilea rând, portul B al microcontrolerului are un funcție utilă - „întrerupere la schimbare” - întrerupere la schimbarea nivelului, care ne va permite să monitorizăm starea codificatorului.

16 LED-uri convenționale de 3 mm sunt utilizate pentru a vizualiza datele de intrare și vor fi amplasate pe PCB în jurul codificatorului instalat. LED-urile sunt conectate la cipul A6276.

Microcircuitul este un driver LED cu intrare de informații seriale pe 16 biți. Driverul conține un registru de deplasare CMOS pe 16 biți, dispozitivele de blocare și driverele asociate pentru a conduce LED-urile și poate conduce mai multe LED-uri decât permite microcontrolerul. În plus, driverul poate fi controlat prin interfața SPI, ceea ce reduce și mai mult numărul de linii I / O utilizate și face proiectul scalabil.

Software-ul microcontrolerului pentru rezolvarea problemei noastre este relativ simplu. Există 3 moduri de funcționare (introducere de informații) și feedback:

  • Mod de poziționare la 360 ° - în acest mod, LED-urile indică „poziția” actuală a codificatorului, utilizatorul poate roti arborele codificatorului spre stânga și dreapta la orice unghi;
  • Modul "Volum / Nivel" - în acest mod LED-urile indică valoarea curentă între nivelurile minime și maxime ale intervalului de intrare (cum ar fi nivelul volumului în dispozitivele audio);
  • 3-Position Rotary Toggle Mode - În acest mod există doar trei poziții selectabile pe care utilizatorul le selectează prin rotirea arborelui codificatorului stânga / dreapta.

Demonstrarea proiectului