Conversione digitale-analogico in PWM

Con la tecnica del PWM si possono ottenere molti risultati. In questo articolo si vedrà come convertire un valore digitale in analogico, ovvero come ottenere un qualsiasi valore di tensione analogica, partendo da un dispositivo digitale.

In un convertitore Digitale-Analogico (DAC) si ottiene la conversione di un segnale digitale (rappresentato da un insieme finito di numeri), in una segnale analogico. Di solito tale grandezza è una tensione, da usarsi secondo le più disparate esigenze.

Un DAC è contraddistinto da alcune proprietà, come, ad esempio, il valore massimo e minimo di tensione ottenibili e, soprattutto, la risoluzione, ovvero la quantità di bit usati per rappresentare il segnale in uscita.

Figura 1: segnali PWM.

Figura 1: segnali PWM.

CIRCUITI DIGITALI

Molto spesso, in un circuito formato esclusivamente da logica digitale, è necessario generare una tensione analogica ad esempio per trasferire ad un altoparlante un segnale audio elaborato in digitale. Per non far lievitare i costi ed i tempi di sviluppo, è possibile utilizzare con successo la tecnica del PWM (vedi figura 1).

Figura 2: schema di principio senza filtro d’uscita.

Figura 2: schema di principio senza filtro d’uscita.

RISOLUZIONE

Uno dei parametri fondamentali di un DAC, come detto prima, è rappresentato dalla risoluzione. Con esso si indica il numero dei bit che si utilizzano per rappresentare la grandezza in uscita. Ovviamente, più alta è la risoluzione, maggiore è il numero di tensioni ottenibili, nel range. Ad esempio, un DAC a 8 bit può rappresentare una quantità compresa tra 0  e 255 e la tensione in uscita potrà pertanto assumere 256 diversi valori, rispettando, ovviamente, il minimo ed il massimo prescelti. Volendo  scegliere la generazione di un segnale analogico compreso tra 0V e 5V, un DAC a 8 bit potrà avere uno step minimo di (5/256)=0,01953125V (pari a  19mV), mentre un DAC a 10 bit potrà avere uno step minimo di (5/1024)=0,0048828125V (pari a 4,8mV), mentre ancora un DAC  a 24 bit potrà avere uno step minimo di (5/16777216)=0,000000298V (pari a 0,29uV). Più alta è la risoluzione, più il dispositivo diventa costoso e complesso. Realizzare DAC a 4 bit è cosa semplicissima, ma costruirne uno a 24 bit è impresa non tanto comoda.

Figura 3: frequenza di 2967 Hz generata dalla porta RC1 (listato 1).

Figura 3: frequenza di 2967 Hz generata dalla porta RC1 (listato 1).

I MICROCONTROLLORI

Molti microcontrollori presenti sul mercato dispongono del convertitore da Digitale ad Analogico (DAC). Spesso si utilizzano i DAC esterni, sia per non caricare le MPU sia perché queste ultime sono solitamente più precise e performanti. Il DAC dei microcontrollori utilizzano di solito il modulo PWM presente. La tensione può, comunque, essere generata anche non disponendo del modulo PWM e generando “manualmente” i treni di impulsi, come spiegato nel corso dell’articolo.

Figura 4: onda quadra generata dalla porta RC1 (listato 1).

Figura 4: onda quadra generata dalla porta RC1 (listato 1).

 

Figura 5: onda quadra con duty cycle al 50% (listato 2).

Figura 5: onda quadra con duty cycle al 50% (listato 2).

 

Figura 6: onda quadra con duty cycle al 10%.

Figura 6: onda quadra con duty cycle al 10%.

 

Figura 7: onda quadra con duty cycle all’80%.

Figura 7: onda quadra con duty cycle all’80%.

IL PWM

Un segnale PWM (Pulse Width Modulation) è un segnale periodico ad onda quadra, caratterizzato da una frequenza fissa e Duty Cycle variabile. Variando il Duty Cycle è possibile modificare il valore efficace della tensione prodotta. Affinché la tensione di uscita dal PWM sia utilizzabile (vedi figura 2), è necessario applicare alla stessa un filtro RC, dimensionato in modo che, con la opportuna costante di tempo, possa annullare (o nascondere) il segnale pulsante e mostrare ai suoi capi una tensione continua, senza componenti alternate.

PROTOTIPO SENZA FILTRO D’USCITA

Esaminiamo prima lo schema elettrico, sprovvisto di filtro a valle, proprio per comprendere ed osservare il reale segnale che esce dal modulo PWM.

Figura 8: il filtro d’uscita.

Figura 8: il filtro d’uscita.

SCHEMA ELETTRICO SENZA FILTRO

Il microcontrollore utilizzato è il PIC 16F877, provvisto di tale modulo. Lo schema è minimale, essendo solo di importanza vitale il segnale uscente dalla porta RC1. Il carico è fissato a 1Kohm.

Figura 9: schema di principio con filtro d’uscita.

Figura 9: schema di principio con filtro d’uscita.

GENERAZIONE MANUALE DEL SEGNALE PWM

La prima esperienza si basa sulla generazione di un segnale PWM senza utilizzare il modulo relativo. Organizzeremo, infatti, un treno di impulsi opportuno e veloce, in modo da ricalcare fedelmente il  segnale desiderato. La soluzione ovvia è quella di attivare e disattivare la porta RC1, con una opportuna frequenza di uscita e duty cycle al 50% (figura 4). Una frequenza utile allo scopo potrebbe essere all’incirca normalizzata a 3 KHz (2967 Hz). Il codice relativo al listato 1 è di una semplicità disarmante. Allo scopo viene generato un segnale PWM agendo alternativamente sullo stato logico della porta RC1 (vedi figura 3). Un tempo di attesa di semiperiodo, pari a 167 microsecondi (per entrambi gli stati logici), assicura una frequenza di 2980 Hz.

program da
rem by GIOVANNI DI MARIA
main:
trisc=0
portc=0
while true
portc=2
delay_us(167)
portc=0
delay_us(167)
wend
end.

GENERAZIONE AUTOMATICA DEL SEGNALE PWM

La  seconda esperienza è  più professionale. Si utilizza, infatti, il modulo di generazione PWM, solitamente a corredo dei microcontrollori più evoluti. In maniera molto semplice è possibile specificare sia la frequenza da generare (molto più alta rispetto all’esempio precedente) che il duty cycle. La precisione questa volta è molto alta e la frequenza, assieme alla percentuale di lavoro, è ampiamente rispettata. Anche il codice relativo al listato 2 è molto semplice. Sono utilizzate le funzioni interne del mikroBasic, per la generazione del segnale PWM. Il set delle funzioni che si riferiscono al PWM2 invoca automaticamente la porta RC1 (CCP2), mentre il set PWM1 invoca la porta RC2 (CCP1). La funzione PWM2_init inizializza il generatore alla frequenza impostata come parametro e la funzione PWM2_Set_Duty imposta la percentuale di duty cycle, con un valore di tipo byte, compreso tra 0 e 255.  Il valore 0 corrisponde ad una percentuale pari allo 0%, il valore 127 corrisponde ad una percentuali pari allo 50% e il valore 255 corrisponde ad una percentuale pari al 100% (vedi figura 5, figura 6 e figura 7). Altri valori di percentuale possono essere calcolati con la formula (percentuale*255)/100, come evidenziato anche in tabella 1.

program da
rem Genera un PWM al 50% di Duty
Cycle
rem by GIOVANNI DI MARIA
main:
trisc=0
portc=0
PWM2_Init(5000)
PWM2_Set_Duty(127)
PWM2_Start()
end.

LA CONVERSIONE D-A COL PWM PROTOTIPO CON FILTRO D’USCITA

Passiamo finalmente alla generazione di un vero segnale analogico, utilizzando il PWM. Esaminiamo lo schema elettrico, stavolta provvisto del filtro RC di uscita, che consente di ottenere un buon segnale analogico costante.

Tabella 1: Valori di tipo byte per impostare la percentuale di Duty Cycle nella funzione PWM_Set_Duty.

Tabella 1: Valori di tipo byte per impostare la percentuale di Duty Cycle nella funzione PWM_Set_Duty.

IL FILTRO DI USCITA RC

La presenza di un filtro RC è indispensabile (vedi figura 8). Senza di esso si otterrebbe solo un segnale quadro periodico digitale (come visto prima). Sebbene esso sia caratterizzato da una frequenza alta e da un valore RMS adatto allo scopo, non può certamente definirsi una tensione analogica. Occorre, quindi, che il valore prodotto venga “fissato” ad un determinato valore, il più possibile costante nel tempo e insensibile alle variazioni di impedenza di uscita, degli stadi successivi al generatore. Col filtro, il segnale non sarà più oscillante e non verrà più prodotta alcuna frequenza. Al contrario il segnale sarà più pulito e continuo nel dominio del tempo (figura 10 e figura 11).

Figura 10: tensione continua analogica di uscita di 2,5V.

Figura 10: tensione continua analogica di uscita di 2,5V.

DIMENSIONAMENTO DEL FILTRO

Il filtro in questione è di tipo passabasso (figura 9). Esso attenua appunto l’alta frequenza prodotta dal PWM e lascia passare solamente la tensione continua. Esso è paragonabile al sistema di livellamento presente all’uscita di un alimentatore stabilizzato. Il suo dimensionamento deve considerare, innanzitutto, il carico ad esso collegato. Infatti, l’impedenza di ingresso dello stadio successivo influisce notevolmente sul processo di filtro. Un altro parametro da tenere sott’occhio è la frequenza del segnale PWM e, quindi, la costante di tempo che caratterizza il filtro. Ricordiamo che essa è pari alla formula (t=R*C). A grandi linee è consigliabile dimensionare i valori di C e R in modo che la costante di tempo risultante sia circa il doppio di quella del periodo del segnale. Cosi, se il periodo del nostro prototipo è pari a 200uS (con F=5 Khz) è consigliabile una costante di tempo di filtro pari a circa 400uS. Se, comunque, la costante di tempo è troppo alta, il segnale in uscita risulterà alquanto attenuato, mentre se la costante di tempo è troppo bassa, il segnale risulterà affetto da un ripple inaccettabile. In aggiunta, il valore della resistenza R del filtro RC dovrebbe essere circa 1/100 rispetto al carico.

Figura 11: il minimo ripple che caratterizza la tensione prodotta dal PWM.

Figura 11: il minimo ripple che caratterizza la tensione prodotta dal PWM.

ESEMPIO DI CALCOLO

Con una frequenza PWM pari a 5Khz ed un carico in uscita pari a 2,2Kohm, avremo i seguenti valori di filtro:

Dati disponibili

Periodo PWM = 1/5000Hz = 0,0002s = 0,2mS = 200uS

Carico all’uscita = 2,2Kohm

Dati calcolati

Costante di tempo cercata del filtro = 400uS

Resistenza R di filtro = 2,2Kohm/100 = 22 ohm

Condensatore C di filtro = 22uF

Come si nota dalle misurazioni effettuate, il segnale generato è senza dubbio continuo, pulito e caratterizzato da un segnale di ripple ininfluente ai fini pratici (max 0.15mV).

Figura 12: campioni da riprodurre per generare l’onda sinusoidale.

Figura 12: campioni da riprodurre pergenerare l’onda sinusoidale.

 

Tabella 2: Valori di Duty Cycle per la generazione dell’onda sinusoidale.

Tabella 2: Valori di Duty Cycle per la generazione dell’onda sinusoidale.

 

Figura 13: onda sinusoidale generata con il listato 3.

Figura 13: onda sinusoidale generata con il listato 3.

 

Figura 14: particolare ingrandito dell’onda sinusoidale.

Figura 14: particolare ingrandito dell’onda
sinusoidale.

 

Figura 15: senza il filtro d’uscita l’onda sinusoidale non sarebbe stata prodotta.

Figura 15: senza il filtro d’uscita l’onda sinusoidale non sarebbe stata prodotta.

 

Figura 16: la modulazione PWM è utilizzata anche per regolare la potenza sui carichi, riusulta quindi particolarmente utile per la realizzazione di dimmer.

Figura 16: la modulazione PWM è utilizzata anche per regolare la potenza sui carichi, riusulta quindi particolarmente utile per la realizzazione di dimmer.

GENERARE UN’ONDA SINUSOIDALE

Adesso che si è visto come generare una tensione analogica fissa, proviamo a produrre un segnale periodico sinusoidale (figura 12). La tecnica è quella di riprodurre in un arco di tempo diversi campioni, che ne caratterizzino la forma d’onda naturale. Le caratteristiche dell’onda in questione potrebbero essere le seguenti:

Forma d’onda: sinusoidale

Frequenza: 50 Hz

Periodo: 20mS

Numero dei campioni: 20

Distanza temporale tra un campione ed il successivo: 1ms

Minima tensione: 0V

Massima tensione di picco: 5V

Per generare la forma d’onda è sufficiente riprodurre, in rapida successione, le tensioni principali che caratterizzano la forma d’onda stessa (come quella visibile in figura 13 e figura 14)). Ovviamente, più numerosi sono i campioni e più il segnale riprodotto sarà qualitativamente più elevato. In ogni caso un numero di campioni pari a venti è da considerarsi sufficiente. Il listato 3 è abbastanza semplice. In un vettore sono memorizzati i 20 campioni da riprodurre. Essi sono espressi direttamente in valore corrispondente al valore di duty cycle (0255) utilizzabile dalla funzione PWM2_Set_Duty. Un ciclo FOR scandisce tutti i valori del vettore (da 0 a 19), riproducendo sulla porta RC1 (CCP2) il segnale sinusoidale. Il ciclo si ripete all’infinito grazie al loop “While”. Ogni campione  “dista”  1   mS,  nel dominio temporale. E’ sufficiente modificare tale pausa d’attesa per cambiare la frequenza risultante della forma d’onda.

program seno
rem Genera un segnale Sinusoidale
rem by GIOVANNI DI MARIA
main:
dim SENO as byte[20]
dim k as byte
trisc=0
portc=0
SENO[0]=127

SENO[1]=168
SENO[2]=204
SENO[3]=233
SENO[4]=250
SENO[5]=253
SENO[6]=243
SENO[7]=220
SENO[8]=187
SENO[9]=148
SENO[10]=106
SENO[11]=66
SENO[12]=33
SENO[13]=10
SENO[14]=0
SENO[15]=3
SENO[16]=20
SENO[17]=48
SENO[18]=85
SENO[19]=126
PWM2_Init(5000)
PWM2_Set_Duty(0)
PWM2_Start()
while true
for k=0 to 19
PWM2_Set_Duty(SENO[k])
delay_ms(1)
next k
wend
end.

Occorre notare che se il filtro d’uscita non fosse stato presente, si sarebbe ottenuto un treno di impulsi ripetuti (vedi figura 15), caratterizzato da larghezze sempre diverse e continuamente variabili. Della forma d’onda sinusoidale non ci sarebbe stata nemmeno l’ombra. La modulazione PWM è utilizzata anche per regolare la potenza sui carichi, riusulta quindi particolarmente utile per la realizzazione di dimmer (figura 16).

Scrivi un commento