PWM: emulazione di pin analogici con la tua scheda Arduino

Segnali PWM

Con i pin digitali e analogici, che puoi utilizzare sulla tua scheda Arduino, puoi ricevere o inviare segnali elettrici per controllare o ottenere dati dai tuoi progetti elettronici. Inoltre ci sono altri segnali molto interessanti in questo tipo di targa, e quelli sono i PWM che può emulare un segnale analogico senza essere effettivamente analogico. Cioè, sono pin digitali che possono agire in modo simile (non lo stesso) come un segnale analogico.

Questi tipi di segnali sono molto pratici per quando non si desidera utilizzare solo segnali digitali HIGH e LOW, ovvero 1 o 0, ON e OFF, ma si desidera andare oltre e descrivere segnali un po 'più complessi. Ad esempio, è possibile modulare la velocità di un file motore a corrente continua, o l'intensità della luce di una luce, per un solenoide, ecc.

Sistema analogico vs digitale

Segnale analogico vs digitale

I circuiti elettronici possono essere suddivisi in due grandi famiglie o categorie: digitale e analogico. Quando parliamo di elettronica digitale, stiamo usando quantità con valori discreti, cioè un sistema binario rappresentato da segnali elettrici di bassa o alta tensione per interpretare lo stato di quei bit che vengono gestiti. D'altra parte, quando si tratta di un circuito analogico, vengono utilizzate quantità con valori continui.

All'interno dei sistemi digitali possono essere trovati a loro volta quelli di tipo combinatorio e quelli di tipo sequenziale. Cioè, i primi sono quelli in cui l'uscita del sistema dipende solo dallo stato degli ingressi. In quelli sequenziali, invece, sono inclusi elementi di memoria e l'uscita dipenderà dallo stato corrente degli ingressi e dallo stato precedente memorizzato.

Nel caso degli analoghi non ci sono questi due grandi gruppi o varianti, poiché qui sono segnali continui da cui dipenderà sempre il segnale sistema corrente. Ad esempio, in un altoparlante, il segnale che gli viene fornito dipenderà dal suono che si desidera riprodurre. Lo stesso con un microfono, che genererà un segnale analogico a seconda del suono che sta ricevendo. Sicuramente l'avrete visto anche con tanti altri sensori che abbiamo descritto in questo blog e che agiscono con segnali analogici (e quindi si è dovuto creare una formula in modo che successivamente i valori potessero essere calcolati o condizionati negli sketch IDE di Arduino ) ...

Queste caratteristiche dell'uno e dell'altro fanno sì che alcuni abbiano le loro vantaggi e svantaggi, come al solito in quasi tutto. Ad esempio, quelli digitali sono solitamente più economici, più veloci, più facili da sviluppare, le informazioni possono essere archiviate più facilmente, hanno una maggiore precisione, possono essere programmati, non sono così vulnerabili agli effetti del rumore, ecc. Ma è anche vero che con l'analogico è possibile operare con segnali più complessi.

da ejemplo, un sensore ad effetto Hall di tipo digitale può rilevare solo la presenza o l'assenza di un campo magnetico nelle vicinanze. Invece, un sensore analogico ad effetto Hall può farlo e determinare anche la densità di detto campo magnetico grazie ad un segnale analogico che genera alla sua uscita. Sapendo come interpretare bene quel segnale di tensione più alta o più bassa, puoi facilmente conoscere quella grandezza. Hai altri esempi in molte grandezze della natura che puoi misurare quantitativamente con un sistema analogico, come temperatura, tempo, pressione, distanza, suono, ecc.

Segnale analogico vs digitale

Detto questo, a segnale analogico Sarà una tensione o corrente elettrica che varia nel tempo e continuamente. Se rappresentato graficamente, il segnale analogico sarebbe un'onda sinusoidale a frequenza singola.

Come l' segnale digitale, è una tensione che varia in modo graduale rispetto al tempo. Cioè, se è rappresentato su un grafico, sarà un segnale di passo che non varia continuamente, ma cambia in passi o incrementi discreti.

Dovresti sapere che ci sono circuiti per passare da un segnale analogico a uno digitale o viceversa. Questi convertitori sono conosciuti come DAC (convertitore digitale-analogico) e ADC (convertitore analogico-digitale). E sono molto comuni in molti dispositivi che usiamo oggi, come TV, computer, ecc. Con loro è possibile convertire i segnali digitali utilizzati da queste apparecchiature in un livello elettronico per lavorare con altre periferiche o parti che funzionano in analogico.

da ejemplo, un altoparlante o un microfono con segnali analogici che funziona con una scheda audio, o schede grafiche digitali che avevano il famoso chip RAMDAC per le porte del monitor analogico ... In Arduino questo tipo di convertitori viene utilizzato anche per più progetti, come vedremo ...

Cos'è il PWM?

ciclo di lavoro grafico

Sebbene PWM (Pulse-Width Modulation) o modulazione di larghezza di impulso, ha una base digitale, la forma del suo segnale ricorda un segnale analogico un po '"quadrato". Permette tramite impulsi digitali di variare il segnale per emulare un sistema analogico come ho già accennato. Infatti, se guardi il nome, ti dà già indizi di cosa fa, attraverso l'ampiezza degli impulsi digitali.

Questo è utile per Arduino poiché ci sono molti automatismi o componenti elettronici che puoi aggiungere ai tuoi progetti e così via non sono in grado di fornire un vero segnale analogico, ma usano questo PWM per funzionare. Né possono usare un segnale analogico discretizzato, cioè che va a salti di tensione per assomigliare a uno digitale. Quello che possono fare è utilizzare un'uscita digitale -Vcc o Vcc di tipo digitale per generare questo segnale peculiare ...

Pertanto, il PWM è una sorta di "trucco" con cui Arduino e altri sistemi possono interagire con questo tipo di segnali che non sono del tutto analogici né sono digitali convenzionali. Per renderlo possibile, mantengono un'uscita digitale attiva per un tempo specifico o spenta, a seconda dell'interesse in ogni momento. Questo è lontano da quello che sarebbe un orologio digitale o un segnale di codice binario, i cui impulsi hanno la stessa larghezza.

Nei tuoi progetti con Arduino puoi controllare questo tipo di segnali PWM in cui viene mantenuta una frequenza costante di trigger di impulsi nel tempo, ma la larghezza di questi impulsi è variata. Si chiama infatti Duty Cycle quando un segnale viene mantenuto alto rispetto al totale del ciclo. Pertanto, il ciclo di lavoro è espresso in%.

Ricorda che in un PWM non lavori come in un segnale analogico, tra più valori di tensione e fluttua tra di loro. Nel caso del PWM è un segnale quadrato nello stile digitale e il cui valore massimo è Vcc. Ad esempio, se lavori con un alimentatore da 3V, puoi dare impulsi da 3V o 0V, ma non 1V o qualsiasi altro valore intermedio come accadrebbe in un vero analogico. Ciò che varierebbe in quel caso è l'ampiezza dell'impulso, che possiamo mantenere al 30% a quel valore Vcc alto, o al 60% per dargli più potenza, ecc.

Ma attenzione, perché se un dispositivo supporta un limite Vcc e viene superato con PWM, può essere danneggiato. Quindi sarebbe sempre necessario rispettare i valori delle schede tecniche fornite dai produttori. Inoltre, in alcuni dispositivi come i motori CC, relè, elettromagneti, ecc., una caduta di tensione dopo un ciclo di lavoro può significare che i carichi induttivi possono causare danni. Ecco perché il protezioni tempestivo.

PWM su Arduino

Bus Arduino I2C

Ora che sai come funziona, vediamo il caso specifico del PWM all'interno del mondo Arduino ...

PWM: pinout su Arduino

Sulle schede Arduino puoi trovare diversi pin che implementano il PWM hardware. Puoi identificarli sul PCB stesso perché hanno l'estensione simbolo ~ (testa piccola) insieme alla numerazione dei pin. Potrebbe anche essere fatto da software nel codice Arduino, ma ciò sovraccaricherebbe il microcontrollore di lavoro, cosa assurda quando può essere fatto in modo nativo e dall'hardware ...

  • Arduino UNO, Mini e Nano- Hai 6 uscite PWM a 8 bit sui pin 3, 5, 6, 9, 10 e 11, che avranno quel ~ proprio davanti al numero.
  • Arduino Mega- Su questa scheda Arduino più potente hai 15 uscite PWM a 8 bit. Sono sui pin da 2 a 13 e da 44 a 46.
  • Arduino Duetto: in questo caso sono presenti 13 uscite PWM a 8 bit. Sono sui pin da 2 a 13, più altre due uscite analogiche discretizzate da DAC con risoluzione a 12 bit.

Quando parli di risoluzione a 8 bit o 12 bit, ecc., In questo tipo di uscite PWM, ti riferisci al margine di manovra che hai. Con 8 bit hanno 256 livelli tra i quali è possibile variare, ei 12 bit arrivano fino a 4096 livelli.

Controllo con timer

Per il controllo PWM hardware, Arduino utilizzerà i timer per questo. Ogni timer presente può servire 2 o 3 uscite PWM. Un registro di confronto per ciascuna uscita completa questo sistema in modo che quando il tempo raggiunge il valore del registro, lo stato o il valore dell'uscita viene modificato per interrompere quei Duty Cycle. Sebbene ci siano due uscite controllate dallo stesso timer, entrambe possono avere cicli di lavoro diversi, sebbene condividano la stessa frequenza.

Nel caso dei timer associati a ciascun pin PWM, varierà a seconda del tipo di scheda Arduino che hai:

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

Il registro prescalato dividerà il tempo per un numero intero e il timer farà il resto per controllare ciascuna delle uscite PWM associate. La modifica del valore del Registro di sistema può alterare la frequenza. Il frequenze Inoltre saranno diversi a seconda del Timer e del piatto:

  • Arduino UNO, Mini e Nano:
    • Timer0: consente il prescaling di 1, 8, 64, 256 e 1024. La frequenza è di 62.5 Khz.
    • Timer1: con preset di 1, 8, 64, 256 e 1024. Con una frequenza di 31.25 Khz.
    • Timer2: uguale a Timer1, solo aggiunge un prescaling di 32 e 128 oltre ai precedenti.
  • Arduino Mega:
    • Timer0, 1, 2: come sopra.
    • Timer3, 4 e 5: con frequenza di 31.25 Khz e prescalare di 1, 8, 64, 256 e 1024.

Incompatibilità e conflitti

Il timer associato alle uscite non è solo per quella funzione, è utilizzato anche da altri. Pertanto, se vengono utilizzati da un'altra funzione, è necessario scegliere tra l'una o l'altra, non è possibile utilizzarli entrambi contemporaneamente. Ad esempio, queste sono alcune delle incompatibilità che puoi trovare nei tuoi progetti:

  • Libreria servo: Quando si utilizzano servomotori, i timer vengono utilizzati in modo intensivo, il che potrebbe portare a conflitti. In particolare, usa Timer1 per UNO, Nano e Mini, ovvero non puoi usare i pin 9 e 10 mentre stai usando uno schizzo con quella libreria. In Mega dipenderà dal numero di servocomandi ...
  • SPI: Se la comunicazione SPI viene utilizzata sulla scheda Arduino, il pin 11 viene utilizzato per la funzione MOSI. Ecco perché quel pin PWM non può essere utilizzato.
  • Tono: questa funzione utilizza il Timer2 per operare. Quindi, se viene utilizzato, stai rendendo inutili i pin 3 e 11 (o 9 e 10 per Mega).

Test pratico con Arduino

Schema PWM di Arduino con LED

Se vuoi vedere sul posto come funziona PWM su Arduino, la cosa migliore che puoi fare è collegare i cavi di misura di un voltmetro o multimetro (in funzione della misura della tensione) tra il pin PWM che hai scelto di utilizzare e il pin di terra o GND della scheda Arduino. In questo modo, sullo schermo del misuratore potrai vedere come cambia la tensione con un'uscita digitale grazie a questo trucco PWM.

Puoi sostituire il voltmetro / multimetro con un LED per vedere come varia l'intensità della luce, con un motore DC, o con qualsiasi altro elemento che desideri. L'ho semplificato nello schema con Fritzing con un LED senza di più, ma sappi che può rappresentare anche le punte di un multimetro ...

Se usi un LED, ricorda la resistenza al catodo e GND.

a il codice sorgente Per controllare il microcontrollore della scheda Arduino e far funzionare tutto, dovresti inserirlo nell'IDE di Arduino (in questo caso ho usato il pin 6 PWM di 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  
   } 
} 
Ti consiglio di giocare con i valori e vedere i risultati sulla luce o sul voltmetro. Il programma può ricevere valori da 0 a 9 in modo da poter vedere come varia tutto. Per ulteriori informazioni, ti consiglio il corso di arduino che abbiamo in download gratuito ...

Un commento, lascia il tuo

Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   Jose suddetto

    Ciao buon giorno. Prima di tutto voglio ringraziarti per il tempo dedicato a questa spiegazione per l'ultima novità.
    Vorrei farti una domanda. Sto cercando di eseguire il codice su un emulatore proteus 8 per Arguino Mega. Collego un voltmetro al pin 6, Proteus è collegato a una porta seriale, ma non so come o cosa variare in modo che vengano emesse tensioni diverse. Ho dovuto apportare piccole modifiche al codice per farlo compilare. Grazie mille per il tuo aiuto