Generare un segnale analogico per mezzo del modulo PWM

Quasi tutti i microcontrollori presenti sul mercato possiedono dei convertitori analogici digitali (ADC). Il modulo ADC permette ad un microcontrollore, come anche ad altri dispositivi di calcolo (DSP, CPLD, FPGA), di gestire grandezze analogiche convertendole in una rappresentazione "digitale" ovvero numerica. Se da un lato convertire una grandezza da analogico a digitale è spesso più importante che non convertire una grandezza da digitale ad analogico, vi sono moltissime applicazioni in cui avere a disposizione un Convertitore da Digitale ad Analogico (DAC) risulta di fondamentale importanza. Si pensi ad applicazioni come i sintetizzatori vocali, riproduttori di musica, generatori di funzioni e segnali arbitrari. Questi sistemi, come molti altri, richiedono un convertitore DAC. Nonostante le numerose applicazioni non sono presenti molti microcontrollori con  modulo DAC incorporato. Spesso qualora si voglia usare un DAC esterno si fa uso di un DAC R-2R ovvero composto di soli resistori o del modulo PWM presente in molti microcontrollori. Da questo si capisce che se è vero che molti microcontrollori non possiedono un DAC è altrettanto vero, che potendolo ottenere per mezzo di un modulo PWM non si ha sempre l'esigenza di avere un DAC esterno, almeno per basse frequenze (poche decine di KHz). Si ricorda inoltre che anche nei casi in cui non sia presente un modulo PWM  è possibile generare un segnale PWM per mezzo dei Timer interni al microcontrollore.
 

Cos'è un DAC

Un convertitore Digitale analogico permette di convertire un segnale digitale, ovvero un segnale rappresentato per mezzo di un insieme finito di numeri, in una grandezza analogica. Spesso la grandezza analogica nella quale viene convertito un numero è una tensione, ma a frequenze elevate si predilige la conversione in corrente.
Un DAC viene caratterizzato allo stesso modo con cui si caratterizzano i convertitori Analogico Digitali (ADC). Tra i parametri principali si ricorda la dinamica in uscita ovvero del valore massimo e minimo di tensione o corrente in cui è possibile convertire un numero, e la risoluzione ovvero il numero di bit usati nella rappresentazione numerica del nostro segnale. Un DAC ad 8 bit potrà per esempio rappresentare un numero compreso tra 0 e 255, ed in particolare la sua dinamica risulterà divisa in 255 step. L´ampiezza del singolo step è definito quanto, e rappresenta la quantità minima che è possibile rappresentare.  
 

Rappresentazione di un segnale PWM nel dominio della Frequenza

Un segnale PWM (Pulse Width Modulation) è un segnale a frequenza fissa e Duty Cycle variabile. Per maggior dettagli su tale tecnica di modulazione si faccia riferimento al tutorial PWM Pulse Width Modulation e alla Brief Note BN0011.
Quello che maggiormente interessa in questa Brief Note è la caratteristica di un segnale PWM nel dominio della Frequenza. Si ricorda che ogni segnale, qualunque sia la sua forma, è scomponibile come somma di infinite sinusoidi. La rappresentazione grafica delle sinusoidi che compongono un segnale è noto come spettro. In Figura 1 è riportato lo spettro di un segnale PWM con frequenza F ovvero periodo T = 1/F.

 

Figura 1: Spettro di un segnale PWM di Frequenza F = 1/T.

Figura 1: Spettro di un segnale PWM di Frequenza F = 1/T.


Si noti che lo spettro del segnale PWM è caratterizzato da una componete continua pari al valore medio del segnale stesso, e varie armoniche (sinusoidi) posizionate a frequenze multiple della Frequenza del nostro segnale PWM.
Il segnale di nostro interesse, che possiamo direttamente controllare è proprio il segnale DC (in questo caso non si confonda DC con Duty Cycle) ovvero il valore medio del nostro segnale. Variando il Duty Cycle del segnale potremo variare il valore DC a nostro piacimento. Dallo spettro è però visibile che oltre alla componete DC sono presenti le armoniche a frequenza multipla del nostro segnale PWM. Al fine di estrarre la sola componente continua è necessario dunque l'utilizzo di un filtro passa basso. Per mezzo di questo segnale DC si potrebbe per esempio regolare il volume di un amplificatore, ovvero rendere il volume proporzionale ad un livello di tensione DC.

Il filtro passa basso può essere anche del primo ordine, ovvero una rete RC (rete ad un solo polo) ottenendo in questo modo un'attenuazione di 20dB/dec.
Questa attenuazione può però essere sufficiente o meno a seconda della distanza presente tra la prima armonica e il nostro segnale d'interesse (nel nostro caso la componente DC) o meglio tra la prima armonica e la frequenza di taglio del nostro filtro passa basso. Qualora il ripple presente sul nostro segnale DC dovesse essere non accettabile si può aumentare l'ordine del filtro o aumentare la frequenza del Segnale PWM rispetto alla frequenza di taglio del filtro passa basso, in maniera da permettere al filtro di attenuare maggiormente le armoniche del segnale PWM. In generale, dal momento che la risoluzione del DAC ottenibile per mezzo del modulo PWM è proprio pari alla risoluzione del segnale PWM stesso, si ha interesse ad avere il ripple di valore inferiore al quanto del DAC.
Avere un segnale DC controllabile per mezzo di un microcontrollore può ritornare utile in molte applicazioni, ma spesso quello che si vuole ottenere da un DAC è un segnale variabile, come per esempio un segnale vocale.

Questo significa che il segnale che si vuole generare avrà a sua volta uno spettro e non sarà più la sola componente DC. Lo spettro del segnale che si vuole ottenere deve essere tale da poter essere contenuto tutto prima della prima armonica del segnale PWM, al fine di poter limitare la distorsione nel generarlo.
Anche in questo caso, al fine di poter filtrare il segnale in maniera opportuna e senza far uso di filtri di ordine troppo elevato, è bene fare in modo che la frequenza massima del segnale che si vuole generale sia almeno 10-20 volte inferiore a quella del segnale PWM, o equivalentemente il segnale PWM deve essere almeno 10-20 volte superiore alla frequenza massima del segnale da realizzare.

Dal momento che il livello del nostro segnale, ovvero il livello DC può essere cambiato ad ogni ciclo del segnale PWM, si capisce che la frequenza del segnale PWM rappresenta la frequenza di campionamento del segnale, ovvero la frequenza alla quale cambieremo il valore numerico nel nostro DAC.

Dal teorema sul campionamento è noto che il numero di campioni minimo per rappresentare un segnale sinusoidale è pari a due campioni per periodo. Questo valore è però un limite matematico, per cui è bene far uso di un numero maggiore al fine di ottenere una migliore rappresentazione del segnale. Per una sinusoide è bene far uso di almeno 8-32 campioni per periodo (il fatto di utilizzare potenze di due può permettere di ottenere ottimizzazioni durante la compilazione del codice ma non è d'obbligo).
 

Semplice generatore di onde sinusoidali con un modulo PWM

Vediamo un semplice esempio su come generare una sinusoide a 262Hz. Un valore molto strano per una sinusoide, ma forse qualche musicista si sarà accorto che questa è la frequenza del DO4, ovvero il DO centrale.

Prima di tutto è bene ottenere i campioni del nostro segnale sinusoidale. Questo è facilmente ottenibile utilizzando un foglio di calcolo come excel e della funzione sin (x) (nel software allegato a fine documento è presente anche il foglio di calcolo creato).

Allora un po' di matematica. La funzione sin (x) con x compreso tra 1 e 360 gradi è sempre compreso tra -1 e 1.
Senza considerare la simmetria di una sinusoide prendiamo 32 campioni in 360 gradi, ovvero ogni 11.25 Gradi. Non avendo preso molti campioni non si hanno problemi di memoria, altrimenti si sarebbe potuto prendere in considerazione la possibilità di sfruttare la simmetria della funzione sin (x) all'interno dei quattro quadranti della circonferenza unitaria.

I campioni che si ottengono sono:

0,000 0,195 0,383 0,556 0,707 0,831 0,924 0,981 1,000 0,981 0,924 0,831 0,707 0,556 0,383 0,195 0,000 -0,195 -0,383 -0,556 -0,707 -0,831 -0,924 -0,981 -1,000 -0,981 -0,924 -0,831 -0,707 -0,556 -0,383 -0,195

Rappresentando i punti, ovvero i nostri campioni, si ottiene la Figura 2.

Figura 2: Rappresentazione grafica dei campioni utilizzati per generare il segnale sinusoidale.

Figura 2: Rappresentazione grafica dei campioni utilizzati per generare il segnale sinusoidale.

Facendo uso del modulo PWM contenuto nel PIC18F4550 si hanno a disposizione 1024 combinazioni per cambiare il Duty Cycle. Con un Duty Cycle pari a 0 si ha una componete continua pari a 0V mentre per un Duty Cycle pari al 1024 (100%) si ha un valore per la componente continua pari a Vcc (o meglio Vcc-0.2 V, poiché l'uscita non raggiunge proprio Vcc). Supponiamo per semplicità di calcolo di avere solo 1000 combinazioni di Duty Cycle.

Applicando la seguente formula per normalizzare i nostri valori:

Valore Normalizzato  = ((sin (x) · 1000 ) + 1000 ) / 2

si ottiene che tutti i campioni precedentemente ottenuti, ovvero campioni della nostra sinusoide, sono contenuti nel valore ammissibile per il nostro Duty Cycle, come riportato in Figura 3. Dunque se vi eravate spaventati sul come rappresentare numeri strani con la virgola, questa è una possibile risposta.

Figura 3: Rappresentazione grafica dei campioni normalizzati tra 0 e 1000.

Figura 3: Rappresentazione grafica dei campioni normalizzati tra 0 e 1000.

I valori normalizzati sono:

500, 598, 691, 778, 854, 916, 962 ,990,1000, 990, 962, 916, 854, 778, 691, 598, 500, 402, 309, 222, 146, 84, 38, 10, 0, 10, 38, 84, 146, 222, 309, 402

I campioni della nostra sinusoide possono essere memorizzati all'interno di un semplice array di interi, ottenendo una cosiddetta look-up Table. Variando il Duty Cycle del segnale PWM facendo uso di questa look-up Table, ovvero cambiando in maniera ciclica il Duty Cycle, e utilizzando un filtro passa basso in uscita al modulo PWM otterremmo il nostro segnale sinusoidale. Il Duty Cycle deve essere cambiato ad ogni nuovo ciclo del nostro segnale PWM. Per tale ragione sarà bene far uso delle interruzioni sul Timer associato al modulo PWM al fine di effettuare l'aggiornamento in modo corretto, ovvero all'inizio di un nuovo periodo.

Come visto non si è ancora fatto alcun ragionamento sulla frequenza della nostra sinusoide e questo discende dal fatto che i campioni ottenuti per la nostra sinusoide vanno in realtà bene per una qualunque frequenza. Il valore della frequenza della sinusoide verrà a dipendere dal valore della frequenza del segnale PWM ed in particolare dalla frequenza con cui aggiorneremo il Duty  Cycle, ovvero la frequenza di campioniamo. La frequenza del segnale PWM è calcolata secondo la seguente formula:

Fpwm = Fsegnale · Numero Campioni

Il numero di campioni diviso due rappresenta il fattore di over-sampling, infatti per riprodurre una sinusoide sarebbero bastati teoricamente solo due campioni. Per aumentare il fattore di over-sampling e dunque aumentare la frequenza del segnale PWM è possibile usare più campioni o semplicemente usare questa formula:

Fpwm = Fsegnale · Numero Campioni · ripetizione

Il fattore di ripetizione è un intero maggiore o uguale ad 1 e può essere aumentato o diminuito a seconda delle esigenze, in particolare la sua ottimizzazione deve essere fatta assieme alla progettazione del filtro e le specifiche richieste sul segnale in uscita (in particolare il rumore ammissibile). Un fattore elevato di ripetizione permette di usare un filtro di ordine più basso, poiché viene ad aumentare la distanza tra la sinusoide generata ed la prima armonica del segnale PWM.

Si noti che ogni campione deve essere ripetuto per un numero di volte pari al valore di ripetizione.  
Per esempio usando un fattore di ripetizione pari a 2 vuol dire che la frequenza del segnale PWM viene raddoppiata, ma dal momento che non abbiamo in realtà raddoppiato il numero dei campioni (per esempio per risparmiare memoria) è necessario ripetere ogni campione per due volte (altre tecniche potrebbero essere utilizzate al posto di ripetere lo stesso campione per due volte).

Il codice scritto in C18 per PIC18F4550 è scaricabile alla fine del documento. Non riporto alcuna spiegazione del programma poiché commentato e presumo che il lettore che stia affrontando tale argomento abbia già le nozioni base di programmazione. Non trattando l'aspetto della programmazione l'articolo ha inoltre il vantaggio di rimanere indipendente dal particolare microcontrollore utilizzato. Faccio solo notare che il valore dei campioni è diviso per 2 al fine di avere un Duty Cycle compreso tra 0 e 500. Questa modifica è necessaria poiché l'esempio fa uso di un quarzo da 20MHz e ci sono dunque dei limiti sul massimo valore di frequenza e il Duty Cycle, come spiegato nella Brief Note BN0011. L'esempio è ottimizzato per la scheda di sviluppo EasyUSB ma può facilmente essere caricato anche sulla scheda di sviluppo Freedom II o altre schede prototipo.

Nell'esempio del programma, si è usato un over-sampling aggiuntivo pari a 3, dunque:

Fpwm = 262 · 32 · 3 = 25152Hz

La prima armonica del segnale PWM è posta a 25152Hz, mentre la nostra nota musicale, ovvero sinusoide è posta a 262Hz.

Come filtro passa basso in uscita al modulo PWM si è utilizzato un semplice filtro  RC come riportato in Figura 4, con frequenza di taglio 300Hz.


Figura 4: Filtro RC con frequenza di taglio Ft = 300Hz.
Figura 4: Filtro RC con frequenza di taglio Ft = 300Hz.

In Figura 5 è riportata la misura del segnale in uscita dal filtro, ovvero la nostra sinusoide da 262Hz (misura reale 261.78). Si noti che il segnale  è compreso tra circa 0 e 2.5V visto che il valore dei campioni  è stato diviso per 2. Da questo si capisce che variando il valore dei campioni di un determinato fattore, si ha l'effetto di controllare l'ampiezza del segnale stesso, mantenendo inalterata la forma originale.

Figura 5: Misura del segnale PWM in uscita dal filtro RC.

Figura 5: Misura del segnale PWM in uscita dal filtro RC.

Si noti che il segnale che si ha in uscita ha un valore medio non nullo, dunque è presente una componete DC. Qualora si vogliano collegare delle cuffiette (ad alta impedenza) al fine di riprodurre ed ascoltare la nota musicale, è bene utilizzare un condensatore da 10uF in serie alle stesse. Questo permetterà di eliminare la componente DC ed evitare che circoli in maniera continua una corrente all'interno delle cuffie. In generale, per utilizzare il segnale analogico, al fine di non caricare il filtro stesso, è bene far uso di un buffer. Qualora si faccia uso di un amplificatore operazionale, si può poi prendere in considerazione l'aggiunta di un altro resistore e condensatore, al fine di ottenere un filtro attivo del secondo ordine (se necessario).

In Figura 6 è riportato un dettaglio della forma d'onda generata, in cui è possibile vedere che il segnale viene incrementato a gradini (il gradino rappresenta il nostro quanto).

Figura 6: Ricostruzione a gradini del segnale analogico.

Figura 6: Ricostruzione a gradini del segnale analogico.

In Figura 7  è riportato un ulteriore dettaglio in cui  è possibile vedere la frequenza dei gradini, ovvero la nostra frequenza di campionamento di 25152Hz. Utilizzando un filtro di ordine maggiore  è possibile ridurre il ripple legato alla frequenza di campionamento e sue armoniche.

Figura 7: Dettaglio della frequenza di campionamento.

Figura 7: Dettaglio della frequenza di campionamento.

Volendo generare una piccola tastiera musicale è possibile variare la frequenza del segnale PWM a seconda della nota da generare. Nonostante si sia riportato come esempio solo la generazione di un segnale sinusoidale, è in realtà possibile generare anche segnali più complessi, come per esempio segnali audio, toni telefonici o segnali arbitrari.

Bibliografia:

1 : Application Note Microchip AN538 (Using PWM to Generate Analog Output).
2 : Application Note Microchip AN655 (D/A Conversion Using PWM and R-2R Ladders to Generate Sine and DTMF Waveform)
3 : Application Note Texas Instrument (Using PWM Timer_B as DAC, MSP430)

 

Tipo File Scarica File Versione Descrizione

Formato File zip

Download 1.0

Esempio in C18 per PIC18F4550 in cui viene generato un segnale sinusoidale a 262Hz.

Include la Tabella Excel con i campioni della sinusoide.

 

 

 

 

 

 

 

 

 

 

Gravatar
giuseppe monfalcone
shannon
ti ringrazio per il link. E' molto interessante.
0
Gravatar
Gabriele
RE: Generare un segnale analogico per mezzo del modulo PWM
..prova a vedere questo http://www.dspguide.com/ch3/2.htm
0
Gravatar
giuseppe monfalcone
RE: Generare un segnale analogico per mezzo del modulo PWM
ti ringrazio per i chiarimenti
0
Gravatar
Mauro Laurenti
RE: Generare un segnale analogico per mezzo del modulo PWM
Ciao,gli 8KHz del segnale telefonico sono sufficienti perché in realta´ il segnale ha una banda compresa tra 400Hz e 3600Hz.La banda totale e´ per cui 3200Hz e teoricamente 6400Hz sono sufficienti per il campionamento(e non 7200Hz). Quindi 8Khz vanno benone. In teoria hai che basterebbe una frequenza di campionamento pari al doppio della banda del segnale ma con filtri a gradini ideali per poter ricostruire il segnale stesso e limitare la banda dello stesso. In pratica aumentando la frequenza di campionamento le cose migliorano perche´ i filtri non sono ideali.Saluti,Mauro
0
Gravatar
giuseppe monfalcone
shannon
ciao, vorrei chiederti dei chiarimenti:"Dal teorema sul campionamento è noto che il numero di campioni minimo per rappresentare un segnale sinusoidale è pari a due campioni per periodo. Questo valore è però un limite matematico, per cui è bene far uso di un numero maggiore al fine di ottenere una migliore rappresentazion e del segnale"nel campo delle telecomunicazio ni, il campionamento eseguito con frequenza doppia della massima frequenza compresa nello spettro del segnale non è solo un fatto matematico . un segnale telefonico con banda lorda 4 Khz è campionato con 8Khz.nelle domande poste alla fine di un corso su PCM ricordo che c'era la seguente:se si aumenta la frequenza di campionamento , la qualità migliora?la risposta era che in base a shannon , poiché la Fcamp. doppia era sufficiente , un'eventuale aumento non avrebbe portato a migliorie. come si spiega ciò?un caro salutopeppino
0

You don`t have permission to comment here!

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login