Cerca

modulo attività

modulo tecnica

Alcuni pin digitali di Arduino Uno sono utilizzabili per una uscita analogica PWM attivabile con l'istruzionescope dutycycle m

analogWrite(pin, value)

Il nome dell'istruzione fa credere che ci sia una Conversione Digitale-Analogica propria dei DAC ma non è così.

I DAC (Digital to Analogic Converter) producono una tensione variabile a partire da un numero intero; questa tensione copre la gamma dei valori compresi tra una tensione minima ed una massima fissati nel progetto del circuito e la riproducono "a scalini" (nota 1) perchè il numero intero non permette di definire i valori intermedi (i decimali). Per diminuire l'altezza dello scalino si può solo aumentare la quantità di numeri interi a disposizione, di solto definita come risoluzione in bit (nota 2) della conversione Analogico-Digitale.

output

Nella figura a destra si vede la conversione ADC a 4bit di un segnale analogico (in blu) in un segnale digitale (in rosso) dove si vedono bene i gradini della conversione (nota 3). La tensione analogica assume infiniti valori mentre il valore numerico che rappresenta la tensione assume valori discreti (nel caso a 4 bit può assumere 16 valori diversi. La tensione numerica si può memorizzare ed elaborare con operazioni sui numeri. Ogni scalino è numerato da 0 a 15 (come in questo caso in cui la conversione è a 4bit) ed ogni numero viene memorizzato per conservare informazioni sulla forma d'onda per usi successivi.

Successivamente, utilizzando questi valori si può ricostruire, sempre a gradini, con buona approssimazione la tensione variabile originaria conservata nella memoria numerica a meno di dettagli più piccoli dell'altezza dei gradini od inferiori alla durata dell'intervallo di campionamento.

L'uscita analogica di Arduino non si comporta come un DAC.

Dai pin cosidetti di output analogico di Arduino non si ottiene una tensione con valori variabili.

Per quanto riguarda la tensione in uscita dai pin digitali di Arduino, non si tratta di un segnale (quasi) analogico in senso stretto in quanto la tensione in uscita del pin non assume valori intermedi fra zero volt (ground) e la tensione di alimentazione (Vcc) seppure a gradini (in rosso) ma assume alternativamente ed ad una frequenza fissa i due valori estremi in modo che il valore medio della tensione si trovi nell'intervallo zero-Vcc.

Questo risultato si produce con il PWM (Pulse Width Modulation) che consiste nel modificare la durata dell'impulso di tensione Vcc in rapporto al periodo in cui la tensione invece è nulla.

Per saperne di più vedi qui o anche con un esempio di applicazione con Arduino qui).scope dutycycle m

A sinistra si vede un oscillogramma di una tensione variabile fra zero e 5 V dove la durata dell'impulso a 5V (fase on) è decisamente più lunga alla durata dell'impulso a 0V (fase off).

In questo modo la tensione assume un valore che dipende dalla durata delle due fasi on/off.

Quanto più è lunga la parte di tensione a 5V, tanto più il valore medio sarà vicino a 5V.

I pin coinvolti quindi sono e restano digitali si tratta solo di comandarli in modo diverso.

Arduino Uno lo fa per i pin numero 3,9,10,11 alla fequenza di circa 490Hz, e per i pin 5,6 alla frequenza di 980Hz (nota4).

Per la precisione vai al sito di Arduino.

 

L'istruzione "analogWrite(pin,value)" comanda il controllore individuando il pin da fare funzionare in PWM e definisce il valore medio con un numero che va da zero (Vout = 0V)  ad un massimo pari a 255 (Vout= 5V) (note 4 e 5).

Una volta attivata l'uscita in PWM, questa non si modifica fino a quando non interviene un'altra istruzione "analogWrite()" che ne modifca il parametro.

 

Note

nota 1: I DAC più sofisticati comprendono un circuito di interpolazione più o meno elaborato che cerca di "smussare" gli spigoli degli scalini sperando di approssimare meglio la tensione vera originale. Va subito detto che i valori di tensione fra due campionamenti successivi sono irrimediabilmente persi e nessun interpolatore può recuperarli.

nota 2: Nei CD musicali la musica è registrata sotto forma di numeri a 16 bit che è la risoluzione tipica di quei supporti (16 bit significa che sono possibili circa 64.000 scalini per coprire la gamma dei suoni da riprodurre). Per inciso, la frequenza di campionamento è 44 kHz ovvero ci sono 44.000 numeri a 16 bit per ogni secondo di registrazione per ciascun canale stereo.

nota 3: il grafico è stato realizzato con una simulazione esegita con Scratch con una risoluzione di 4 bit. Non si vedono tutti i 15 scalini che ci si aspetta da una risoluzione a 4 bit per il motivo che la grandezza analogica non arriva al valore massimo previsto in ingresso dal simulatore (100) e quindi la conversione ne utilizza solo ua parte (il convertitore ADC è sotto utilizzato)

nota 4: I pin 5 e 6 non funzionano con valori di PWM compresi fra 0 e 10 circa a causa del fatto che la funzione PWM condivide il timer interno con altri circuiti del microcontrollore per cui la tensione media non si può annullare.

nota 5: Questa gamma di valori in uscita compresa fa 0 e 255 si ha perchè il convertitore Digitale - Analogico in PWM di Arduino ha una risoluzione di 8 bit.