PWM: emulant pins analògics amb la teva placa Arduino

PWM senyals

Amb els pins digitals i analògics, que pots utilitzar la teva placa Arduino, pots rebre o enviar senyals elèctrics per controlar o obtenir dades dels teus projectes electrònics. A més, hi ha altres senyals molt interessants en aquest tipus de plaques, i aquestes són les PWM, que poden emular un senyal analògic sense ser realment analògica. És a dir, són pins digitals que poden actuar de manera similar (que no igual) a un senyal analògic.

Aquest tipus de senyals són molt pràctiques per a quan no només es vol fer servir senyals HIGH i LOW digitals, és a dir, 1 o 0, ON i OFF, sinó que es vol anar més enllà i descriure senyals una mica més complexes. Per exemple, es pot modular així la velocitat d'un motor DC, O la intensitat lumínica d'una llum, per a un solenoide, etc.

Sistema analògic vs digital

Senyal analògic vs digital

Els circuits electrònics es poden dividir en dues grans famílies o categories: digitals i analògics. Quan es parla d'una electrònica digital s'estan fent servir magnituds amb valors discrets, és a dir, un sistema binari representat per senyals elèctrics d'un voltatge baix o alt per interpretar l'estat d'aquests bits que es manegen. En canvi, quan es tracta d'un circuit analògic s'estan emprant magnituds amb valors continus.

Dins dels sistemes digitals es poden trobar al seu torn els de tipus combinacional i els de tipus seqüencial. És a dir, els primers són aquells en què la sortida de el sistema només depèn de l'estat de les entrades. En canvi, en els seqüencials s'inclouen elements de memòries, i la sortida dependrà de l'estat actual de les entrades i de l'estat anterior emmagatzemat.

En el cas dels analògics no hi ha aquests dos grans grups o variants, ja que aquí són senyals continus que sempre dependran de el senyal actual de el sistema. Per exemple, en un altaveu, el senyal que se li subministra dependrà de el so que es vulgui reproduir. Igual amb un micròfon, que generarà un senyal analògic en funció de el so que estigui rebent. Segurament també ho hagis vist amb molts altres sensors que hem descrit en aquest bloc i que actuen amb senyals analògiques (i per tant, calia crear una fórmula perquè després es puguin calcular o condicionar els valors en els sketchs d'Arduino IDE) ...

Aquestes característiques d'un i altre fa que uns tinguin els seus avantatges i inconvenients, Com sol ser habitual en gairebé tot. Per exemple, els digitals solen ser més barats, més ràpids, són més fàcils de desenvolupar, es pot emmagatzemar la informació més fàcilment, tenen major exactitud, es poden programar, no són tan vulnerables a l'efecte de soroll, etc. Però també és cert que amb els analògics es pot operar amb senyals més complexes.

Per EXEMPLE, Un sensor d'efecte Hall de tipus digital només pot captar la presència o no presència d'un camp magnètic proper. En canvi, un sensor d'efecte Hall analògic pot fer això i també determinar la densitat d'aquest camp magnètic gràcies a un senyal analògic que genera a la seva sortida. Sabent interpretar bé aquest senyal de més o menys voltatge, es pot saber aquesta magnitud fàcilment. Altres exemples els tens en multitud de magnituds de la natura que pots mesurar de forma quantitativament amb un sistema analògic, com la temperatura, el temps, la pressió, la distància, el so, etc.

Senyal analògic vs digital

Dit això, un senyal analògic serà un voltatge o corrent elèctric que varia respecte a el temps i de forma contínua. Si es representa en una gràfica, el senyal analògic seria una ona sinusoïdal d'una sola freqüència.

Pel que fa a la senyal digital, És un voltatge que varia de forma esglaonada pel que fa a el temps. És a dir, si es representa en una gràfica, serà un senyal escalonada que no varia de forma contínua, sinó que canvia per passos o en increments discrets.

Has de saber que hi ha circuits per passar d'un senyal analògic a una altra digital o viceversa. aquests convertidors es coneixen com DAC (Digital-to-Analog Converter) i ADC (Analog-to-Digital Converter). I són molt freqüents en multitud de dispositius que fem servir en l'actualitat, com la TV, els ordinadors, etc. Amb ells es pot convertir els senyals digitals que fan servir aquests equips a nivell electrònic per treballar amb altres perifèrics o parts que funcionen en analògic.

Per EXEMPLE, Un altaveu o micròfon amb senyals analògics que funciona amb una targeta de so, o les targetes gràfiques digitals que tenien el famós xip RAMDAC per als ports de monitors analògics ... A Arduino també s'usen aquest tipus de convertidors per a múltiples projectes, com veurem ...

Què és PWM?

duty cycle gràfica

Encara que PWM (Premi-Width Modulation), o modulació per ample de polsos, té una base digital, la forma del seu senyal s'assembla a un senyal analògic cosa «quadrada». Permet mitjançant polsos digitals anar variant el senyal per emular un sistema analògic com ja he comentat anteriorment. De fet, si et fixes en el nom, ja et dóna pistes del que fa, mitjançant l'ample dels polsos digitals.

Això és beneficiós per a Arduino ja que hi ha molts automatismes o components electrònics que pots afegir als teus projectes i que no són capaços de proporcionar una autèntica senyal analògic, Sinó que es valen d'aquest PWM per operar. Tampoc poden usar un senyal analògic discretitzada, és a dir, que vagi a salts de tensió per assemblar-se a una de digital. El que sí que poden és utilitzar una sortida digital -Vcc o Vcc de tipus digital per generar aquest senyal tan peculiar ...

Per tant, PWM és una espècie de «truc» amb què Arduino i altres sistemes poden interoperar amb aquest tipus de senyals que no arriben a ser de el tot analògiques ni tampoc digitals convencionals. Perquè sigui possible, mantenen una sortida digital activa durant un temps específic o apagada, segons interessi en cada moment. Això s'allunya del que seria un senyal de clock o rellotge digital o d'un codi binari a l'ús, els polsos tenen un ample igual.

En els teus projectes amb Arduino pots comprovar aquest tipus de senyals PWM en què es manté una freqüència constant de trets de polsos en el temps, però es varia l'amplada d'aquests polsos. De fet, es denomina Duty Cycle a el temps que es manté encesa en alt un senyal pel que fa a l'total de l'cicle. Per tant, Duty Cycle es proporciona en%.

Recorda que en un PWM no es treballa com a un senyal analògic, entre diversos valors de tensió i es va fluctuant entre ells. En el cas de PWM és un senyal quadrat a l'estil digital i el valor màxim és Vcc. Per exemple, si es treballa amb una alimentació 3V, es poden donar polsos de 3V o de 0V, però no d'1V o un altre valor intermedi com passaria en una analògica real. El que variaria en aquest cas és l'ample de el pols, que el podem mantenir un 30% en aquest valor Vcc alt, o un 60% per donar-li més potència, etc.

Però compte, ja que si un dispositiu suporta un Vcc límit i se supera amb PWM es pot danyar. Així que hauria sempre de respectar els valors dels datasheets que aporten els fabricants. A més, en alguns dispositius com els motors DC, relès, Electroimants, etc., una retirada de l'voltatge després d'un Duty Cycle pot suposar que les càrregues inductives puguin generar danys. Per això s'han d'implementar les proteccions oportunes.

PWM a Arduino

Arduí bus I2C

Ara que ja saps com funciona, anem a veure el cas concret de PWM dins el món Arduino ...

PWM: pinout a Arduino

En les plaques Arduino pots trobar diversos pins que implementen PWM per maquinari. Els pots identificar en la pròpia PCB perquè tenen un símbol ~ (virgulilla) juntament amb la numeració de l'pin. Es podria també fer per programari en el codi d'Arduino, però això sobrecarregaria de treball a l'microcontrolador, una cosa absurda quan ho pot fer de forma nativa i per maquinari ...

  • Arduino UNO, Mini i Nano: Té 6 sortides PWM de 8 bits en els pins 3, 5, 6, 9, 10 i 11, que tindran aquesta ~ just davant de l'nombre.
  • Arduino Mega: En aquesta placa més potent d'Arduino tens 15 sortides PWM de 8 bits. Estan en els pins de el 2 a l'13 i de l'44 a l'46.
  • Arduino degut: En aquest cas es compta amb 13 sortides PWM també de 8 bits. Estan en els pins 2 a l'13, mes altres dues sortides analògiques discretitzades per DAC amb resolució de 12 bits.

Quan es parla d'una resolució de 8 bits o 12 bits, etc., en aquest tipus de sortides PWM, s'està referint a el marge de maniobra que tens. amb 8 bits es té 256 nivells entre els quals pots variar, i els 12 bits pugen a 4096 nivells.

Control amb Timers

Per al control de PWM per maquinari, Arduino emprarà els Timer per a això. Cada Timer present pot servir a 2 o 3 sortides PWM. Un registre de comparació per cada sortida complementa aquest sistema perquè quan el temps arribi al valor de l'registre es canviï l'estat o valor de la sortida per detner aquests Duty Cycles. Encara que hi hagi dues sortides controlades pel mateix Timer, ambdues poden tenir diferents Duty Cycles, encara que comparteixen la mateixa freqüència.

En el cas dels Timers associats a cada pin PWM variarà en funció de l'tipus de placa Arduino que tinguis:

  • Arduino UNO, Mini i Nano:
    • Timer0 - 5 i 6
    • Timer1 - 9 i 10
    • Timer2 - 3 i 11
  • Arduino Mega:
    • Timer0 - 4 i 13
    • Timer1 - 11 i 12
    • Timer2 - 9 i 10
    • Timer3 - 2, 3 i 5
    • Timer4 - 6, 7 i 8
    • Timer5 - 44, 45 i 46

El registre preescalado dividirà per un nombre sencer el temps i el Timer fa la resta per al control de cadascuna de les sortides PWM associades. Si es modifica el valor de l'registre es pot alterar la freqüència. les freqüències també seran diferents segons el Timer i la placa:

  • Arduino UNO, Mini i Nano:
    • Timer0: permet preescalados d'1, 8, 64, 256 i 1024. La freqüència és de 62.5 Khz.
    • Timer1: amb preescalados d'1, 8, 64, 256 i 1024. Amb freqüència de 31.25 Khz.
    • Timer2: igual a Timer1, només que afegeix un preescalado també de 32 i 128 a més dels anteriors.
  • Arduino Mega:
    • Timer0, 1, 2: iguals als anteriors.
    • Timer3, 4, i 5: amb freqüència de 31.25 Khz i preescalados d'1, 8, 64, 256 i 1024.

Incompatibilitats i conflictes

el Timer associat a les sortides no és només per a aquesta funció, També és usat per altres. Per tant, si estan sent usats per altra funció hauràs de triar entre un o altre, no es poden estar utilitzant tots dos alhora. Per exemple, aquestes són algunes de les incompatibilitats que et pots trobar en els teus projectes:

  • Biblioteca servo: Quan fas servir servomotors, es fa ús intensiu de Timers, de manera que podria generar comflictos. Concretament fa servir el Timer1 per UN, Nano i Mini, és a dir, que no pots fer servir els pins 9 i 10 mentre estiguis fent servir un sketch amb aquesta biblioteca. En Mega dependrà de la quantitat de servos ...
  • SCI: Si s'usa comunicació SCI a la placa Arduino, s'està usant el pin 11 per a la funció MOSI. Per això no es pot usar aquest pin PWM.
  • To: Aquesta funció empra el Timer2 per Operaro. Per això, si es fa servir, estàs inutilitzant els pins 3 i 11 (o 9 i 10 per Mega).

Prova pràctica amb Arduino

esquema Arduino PWM amb LED

Si vols veure in situ com treballa PWM en Arduino, el millor que pots fer és connectar les puntes de mesurament d'un voltímetre o polímetre (En funció per mesurar voltatge) entre el pin PWM que hagis triat usar i el pin de terra o GND de la placa Arduino. D'aquesta manera, a la pantalla de l'aparell de mesurament podràs veure com va variant el voltatge amb una sortida que és digital gràcies a aquest truc PWM.

Pots substituir el voltímetre / polímetre per un LED per veure com varia la intensitat de la llum, per un motor DC, o per qualsevol altre element que se't vingui de gust. Jo ho he simplificat en l'esquema amb Fritzing amb un LED sense més, però que sàpigues que pot representar igualment a les puntes d'un polímetre ...

Si fas servir un LED, recorda la resistència en el càtode i GND.

Per a la el codi font per controlar el microcontrolador de la placa Arduino perquè funcioni tot, hauries inserir això en Arduino IDE (en aquest cas he fet servir el pin PWM 6 de 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  
   } 
} 
T'aconsello que juguis amb els valors i vagis veient els resultats en la llum o voltímetre. El programa pot rebre valors de 0 a 9 perquè puguis veure com varia tot. Per a més informació, t'aconsello el curs d'Arduino que tenim a descàrrega gratuïta ...

Un comentari, deixa el teu

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Jose va dir

    Hola, bon dies. Abans de res vull agraderte pel temps dedicat a aquesta explicació per als més novells.
    Volia fer-te una consulta. Estic tractant de córrer el codi en un emulador de proteus 8 a Arguino Mega. Connecto un voltímetre a el pin 6, Proteus aquesta connectat a un port serial, però no com o de variar perquè surtin diferents voltatges. He hagut de fer-li petits ajustos a el codi perquè compili. Moltes gràcies per la teva ajuda