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.
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).
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.
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.
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.
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.
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.
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).
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.
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).
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).