PWM: emulează pini analogici cu placa Arduino

Semnalele PWM

Cu pinii digitali și analogici, pe care îi puteți utiliza pe placa Arduino, puteți primi sau trimite semnale electrice pentru a controla sau a obține date din proiectele dvs. electronice. În plus, există alte semnale foarte interesante în acest tip de placă, iar acestea sunt PWM, care poate emula un semnal analogic fără a fi de fapt analogic. Adică sunt pini digitali care pot acționa în mod similar (nu la fel) ca un semnal analogic.

Aceste tipuri de semnale sunt foarte practice atunci când nu numai că doriți să utilizați semnale digitale HIGH și LOW, adică 1 sau 0, ON și OFF, dar doriți să mergeți mai departe și să descrieți semnale ceva mai complexe. De exemplu, viteza unui Motor DC, sau intensitatea luminii unei lumini, pentru un solenoid etc.

Sistem analog vs digital

Semnal analog vs digital

Circuitele electronice pot fi împărțite în două familii mari sau categorii: digitale și analogice. Când vorbim despre electronică digitală, folosim cantități cu valori discrete, adică un sistem binar reprezentat de semnale electrice de joasă sau înaltă tensiune pentru a interpreta starea acelor biți care sunt tratați. Pe de altă parte, când vine vorba de un circuit analogic, sunt utilizate cantități cu valori continue.

Sistemele digitale pot fi găsite la rândul lor cele de tip combinațional și cele de tip secvențial. Adică, primele sunt acelea în care ieșirea sistemului depinde doar de starea intrărilor. Pe de altă parte, în cele secvențiale, sunt incluse elemente de memorie, iar ieșirea va depinde de starea curentă a intrărilor și de starea anterioară stocată.

În cazul analogilor, nu există aceste două grupuri mari sau variante, deoarece aici sunt semnale continue de care va depinde întotdeauna semnalul sistemul curent. De exemplu, într-un difuzor, semnalul care îi este furnizat va depinde de sunetul pe care doriți să îl reproduceți. La fel și cu un microfon, care va genera un semnal analog în funcție de sunetul pe care îl primește. Cu siguranță ați văzut-o și cu mulți alți senzori pe care i-am descris în acest blog și care acționează cu semnale analogice (și, prin urmare, trebuia creată o formulă pentru ca ulterior valorile să poată fi calculate sau condiționate în schițele Arduino IDE ) ...

Aceste caracteristici ale uneia și celeilalte fac ca unii să aibă lor avantaje și dezavantaje, ca de obicei în aproape orice. De exemplu, cele digitale sunt de obicei mai ieftine, mai rapide, mai ușor de dezvoltat, informațiile pot fi stocate mai ușor, au o precizie mai mare, pot fi programate, nu sunt la fel de vulnerabile la efectele zgomotului etc. Dar este, de asemenea, adevărat că cu analogi puteți opera cu semnale mai complexe.

De exemplu, un senzor digital de efect Hall poate detecta doar prezența sau absența unui câmp magnetic din apropiere. În schimb, un senzor analogic de efect Hall poate face acest lucru și, de asemenea, poate determina densitatea câmpului magnetic menționat datorită unui semnal analogic pe care îl generează la ieșire. Știind cum să interpretați bine semnalul de tensiune mai mare sau mai mică, puteți cunoaște cu ușurință acea magnitudine. Alte exemple le aveți într-o multitudine de mărimi ale naturii pe care le puteți măsura cantitativ cu un sistem analog, cum ar fi temperatura, timpul, presiunea, distanța, sunetul etc.

Semnal analog vs digital

Acestea fiind spuse, a semnal analog Va fi o tensiune sau curent electric care variază în funcție de timp și continuu. Dacă este reprezentat grafic, semnalul analogic ar fi o singură frecvență sinusoidală.

În ceea ce privește semnal digital, este o tensiune care variază treptat în raport cu timpul. Adică, dacă este reprezentat pe un grafic, acesta va fi un semnal de pas care nu variază continuu, ci se modifică în trepte sau în trepte discrete.

Trebuie să știți că există circuite pentru a trece de la un semnal analogic la unul digital sau invers. Aceste convertoare acestea sunt cunoscute sub numele de DAC (convertor digital-analog) și ADC (convertor analog-digital). Și sunt foarte frecvente în multe dispozitive pe care le folosim astăzi, cum ar fi TV, computere etc. Cu ele puteți converti semnalele digitale utilizate de aceste echipamente la un nivel electronic pentru a lucra cu alte periferice sau piese care funcționează în analog.

De exemplu, un difuzor sau microfon cu semnale analogice care funcționează cu o placă de sunet sau plăci grafice digitale care aveau faimosul cip RAMDAC pentru porturile de monitor analogice ... În Arduino acest tip de convertoare sunt utilizate și pentru mai multe proiecte, așa cum vom vedea ...

Ce este PWM?

ciclu grafic de funcționare

Deși PWM (Pulse-Width Modulation) sau modulația lățimii pulsului, are o bază digitală, forma semnalului său seamănă cu un semnal analogic oarecum „pătrat”. Permite prin intermediul impulsurilor digitale să varieze semnalul pentru a emula un sistem analog, așa cum am comentat deja anterior. De fapt, dacă te uiți la nume, acesta îți oferă deja indicii despre ceea ce face, prin lățimea impulsurilor digitale.

Acest lucru este benefic pentru Arduino deoarece există multe automatisme sau componente electronice pe care le puteți adăuga la proiectele dvs. și care nu sunt capabili să furnizeze un semnal analogic adevărat, dar folosesc acest PWM pentru a funcționa. Nici ei nu pot utiliza un semnal analog discretizat, adică care merge la salturi de tensiune pentru a semăna cu unul digital. Ce pot face este să utilizeze o ieșire digitală -Vcc sau Vcc de tip digital pentru a genera acest semnal particular ...

Prin urmare, PWM este un fel de „truc” cu care Arduino și alte sisteme pot interoperă cu acest tip de semnale care nu sunt chiar analogice și nici nu sunt digitale convenționale. Pentru a face posibilă, acestea păstrează activă o ieșire digitală pentru o anumită perioadă de timp sau oprită, în funcție de interes în orice moment. Acest lucru este departe de ceea ce ar fi un ceas digital sau un semnal de cod binar, ale cărui impulsuri au aceeași lățime.

În proiectele dvs. cu Arduino puteți verifica acest tip de semnale PWM în care o frecvență constantă a declanșatorilor de impulsuri este menținută în timp, dar lățimea acestor impulsuri este variată. De fapt, se numește Ciclul de funcționare atunci când un semnal este menținut ridicat în raport cu totalul ciclului. Prin urmare, Duty Cycle este dat în%.

Amintiți-vă că într-un PWM nu funcționați ca într-un semnal analog, între mai multe valori de tensiune și fluctuează între ele. În cazul PWM este un semnal pătrat în stil digital și a cărei valoare maximă este Vcc. De exemplu, dacă lucrați cu o sursă de alimentare de 3V, puteți da impulsuri de 3V sau 0V, dar nu 1V sau orice altă valoare intermediară cum ar apărea într-un analog real. Ceea ce ar varia în acest caz este lățimea impulsului, pe care o putem păstra cu 30% la acea valoare mare Vcc sau cu 60% pentru a-i oferi mai multă putere etc.

Aveți grijă, însă, dacă un dispozitiv acceptă o limită Vcc și este depășit cu PWM, acesta poate fi deteriorat. Deci, valorile fișelor tehnice furnizate de producători ar trebui să fie întotdeauna respectate. De asemenea, în unele dispozitive, cum ar fi motoarele de curent continuu, relee, electromagneți etc., o retragere a tensiunii după un ciclu de lucru poate însemna că sarcinile inductive pot provoca daune. De aceea protectii la timp.

PWM pe Arduino

Autobuz Arduino I2C

Acum, că știți cum funcționează, să vedem cazul specific al PWM în lumea Arduino ...

PWM: pinout pe Arduino

Pe plăcile Arduino puteți găsi mai mulți pini care implementează hardware PWM. Le puteți identifica pe PCB în sine, deoarece au un simbol ~ (cap mic) împreună cu numerotarea pinilor. S-ar putea face și prin software în codul Arduino, dar asta ar suprasolicita microcontrolerul cu lucru, ceva absurd atunci când se poate face nativ și prin hardware ...

  • Arduino UNO, Mini și Nano- Aveți 6 ieșiri PWM pe 8 biți pe pinii 3, 5, 6, 9, 10 și 11, care vor avea acest ~ chiar în fața numărului.
  • Arduino Mega- Pe cea mai puternică placă Arduino aveți 15 ieșiri PWM pe 8 biți. Acestea sunt pe pinii 2-13 și 44-46.
  • Arduino Due: în acest caz există 13 ieșiri PWM pe 8 biți. Sunt pe pinii 2-13, plus alte două ieșiri analogice discretizate de DAC cu rezoluție de 12 biți.

Când vorbiți despre rezoluția de 8 biți sau de 12 biți etc., în acest tip de ieșiri PWM, vă referiți la spațiul de manevră pe care îl aveți. Cu 8 biți au 256 de niveluri între care puteți varia, iar cei 12 biți merg până la 4096 de niveluri.

Control cu ​​temporizatoare

Pentru controlul hardware PWM, Arduino va folosi cronometrele pentru asta. Fiecare Timer prezent poate servi 2 sau 3 ieșiri PWM. Un registru de comparație pentru fiecare ieșire completează acest sistem, astfel încât atunci când timpul atinge valoarea registrului, starea sau valoarea ieșirii este modificată pentru a opri ciclurile de serviciu. Deși există două ieșiri controlate de același temporizator, ambele pot avea cicluri de funcționare diferite, deși au aceeași frecvență.

În cazul cronometrelor asociate cu fiecare pin PWM, acesta va varia în funcție de tipul plăcii Arduino pe care o ai:

  • Arduino UNO, Mini și Nano:
    • Temporizator 0 - 5 și 6
    • Temporizator 1 - 9 și 10
    • Temporizator 2 - 3 și 11
  • Arduino Mega:
    • Temporizator 0 - 4 și 13
    • Temporizator 1 - 11 și 12
    • Temporizator 2 - 9 și 10
    • Temporizatorul 3 - 2, 3 și 5
    • Temporizatorul 4 - 6, 7 și 8
    • Temporizatorul 5 - 44, 45 și 46

Registrul prescalat va împărți timpul la un întreg și Temporizatorul face restul pentru a controla fiecare dintre ieșirile PWM asociate. Modificarea valorii registrului poate modifica frecvența. frecvență De asemenea, vor fi diferite în funcție de cronometru și de placă:

  • Arduino UNO, Mini și Nano:
    • Timer0: permite prescalarea 1, 8, 64, 256 și 1024. Frecvența este de 62.5 Khz.
    • Timer1: cu presetări de 1, 8, 64, 256 și 1024. Cu o frecvență de 31.25 Khz.
    • Timer2: egal cu Timer1, numai că adaugă o prescalare de 32 și 128 în plus față de cele anterioare.
  • Arduino Mega:
    • Temporizator 0, 1, 2: la fel ca mai sus.
    • Temporizatorul 3, 4 și 5: cu frecvență de 31.25 Khz și prescalat de 1, 8, 64, 256 și 1024.

Incompatibilități și conflicte

Cronometrul asociat cu ieșirile nu este numai pentru acea funcție, este folosit și de alții. Prin urmare, dacă acestea sunt utilizate de o altă funcție, trebuie să alegeți între una sau alta, nu le puteți utiliza pe amândouă în același timp. De exemplu, acestea sunt câteva dintre incompatibilitățile pe care le puteți găsi în proiectele dvs.:

  • Servo biblioteca: Atunci când utilizați servo-motoare, acesta folosește intens Timers, deci ar putea genera conflicte. Utilizați în mod specific Timer1 pentru UNO, Nano și Mini, adică nu puteți utiliza pinii 9 și 10 în timp ce utilizați o schiță cu acea bibliotecă. În Mega va depinde de numărul de servouri ...
  • SPI: Dacă comunicația SPI este utilizată pe placa Arduino, pinul 11 ​​este utilizat pentru funcția MOSI. De aceea acel pin PWM nu poate fi utilizat.
  • Ton: această funcție folosește Timer2 pentru a opera. Deci, dacă este utilizat, faceți inutile pinii 3 și 11 (sau 9 și 10 pentru Mega).

Test practic cu Arduino

Schema Arduino PWM cu LED

Dacă doriți să vedeți la fața locului cum funcționează PWM pe Arduino, cel mai bun lucru pe care îl puteți face este să conectați cablurile de măsurare ale unui voltmetru sau multimetru (în funcție de măsurarea tensiunii) între pinul PWM pe care ați ales să îl utilizați și pinul de masă sau GND al plăcii Arduino. În acest fel, pe ecranul dispozitivului de măsurare veți putea vedea cum se modifică tensiunea cu o ieșire digitală datorită acestui truc PWM.

Puteți înlocui voltmetrul / multimetrul cu un LED pentru a vedea cum variază intensitatea luminii, cu un motor DC sau cu orice alt element pe care îl doriți. L-am simplificat în diagramă cu Fritzing cu un LED fără mai mult, dar știți că poate reprezenta și vârfurile unui multimetru ...

Dacă utilizați un LED, amintiți-vă rezistența la catod și GND.

la codul sursă Pentru a controla microcontrolerul plăcii Arduino pentru ca totul să funcționeze, ar trebui să introduceți acest lucru în Arduino IDE (în acest caz am folosit pinul PWM 6 din Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Vă sfătuiesc să vă jucați cu valorile și să vedeți rezultatele pe lumină sau voltmetru. Programul poate primi valori de la 0 la 9, astfel încât să puteți vedea cum variază totul. Pentru mai multe informații, vă sfătuiesc cursul arduino pe care îl avem în descărcare gratuită ...

Conținutul articolului respectă principiile noastre de etică editorială. Pentru a raporta o eroare, faceți clic pe aici.

Un comentariu, lasă-l pe al tău

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   Jose el a spus

    Salut zi buna. În primul rând vreau să vă mulțumesc pentru timpul dedicat acestei explicații pentru cei mai noi.
    Aș dori să vă fac o întrebare. Încerc să rulez codul pe un emulator proteus 8 pentru Arguino Mega. Conectez un voltmetru la pinul 6, Proteus este conectat la un port serial, dar nu știu cum sau ce să variez, astfel încât să se producă diferite tensiuni. A trebuit să fac mici ajustări la cod pentru a-l compila. Multumesc foarte mult pentru ajutorul tau