Come utilizzare la PWM per generare una tensione analogica nei circuiti digitali – Parte II

La soluzione PWM (modulazione di larghezza di impulso)

Molte volte i progettisti si trovano di fronte alla necessità di generare livelli di tensione analogica in circuiti esclusivamente digitali. Anche se oggi il mercato offre una gamma molto ampia di convertitori digitale-analogici dedicati, mettere un dispositivo del genere nel circuito schematico ha un impatto negativo sul costo globale del sistema.

Nella prima parte di questo articolo (Generare tensione analogica in un circuito digitale I), ho illustrato in dettaglio ciò che è conosciuto come “metodo R2R” usato per ottenere tensione analogica. Il vantaggio di questo metodo è che è molto simile all’uso di un vero e proprio circuito integrato DAC off-the-shelf, i valori digitali di cui si ha bisogno per generare il codice in esecuzione sul microcontrollore sono gli stessi in entrambi i casi.

I principali svantaggi di questo metodo, tuttavia, consistono in un elevato numero di pin richiesti sul microcontrollore (direttamente proporzionale alla risoluzione che si necessita) e il numero relativamente elevato di componenti esterne necessarie (un paio di resistenze in più per ogni bit di risoluzione aggiuntivo).

Per affrontare questi problemi, è possibile un'altra soluzione: la soluzione PWM. Questa ci consente di ottenere tensione analogica utilizzando un solo pin del microcontrollore e, come minimo, due componenti esterne. Il diagramma a blocchi di questo concept è relativamente semplice:

Block diagram of PWM solution
Figura 1- diagramma a blocchi della PWM

La teoria alla base della soluzione è che se si ha un filtro passa-basso abbastanza buono e segnale a treni di impulsi, si potrà ottenere nell'uscita del filtro il valore medio di questo segnale. Il valore medio di un segnale a treni di impulsi è sempre proporzionale al duty cycle del treno di impulsi. Se il duty cycle è pari allo 0%, allora il segnale PWM è in realtà sempre 0, e il segnale all’uscita del filtro sarà anch’esso ovviamente 0. Se il duty cycle è al 100%, allora il segnale PWM è in realtà un segnale di tensione continua, pari a VCC, che sebbene filtrato, produce lo stesso valore continuo: VCC.

Nel caso in cui il duty cycle varia tra questi due limiti (0% e 100%) il filtro passa-basso (a condizione che sia di dimensioni corrette) sostanzialmente taglierà le variazioni del segnale, lasciando che passi solo la componente continua del segnale (il suo valore medio). I diagrammi illustrano di seguito il caso in cui il duty cycle è rispettivamente del 50%, 90% e 10%. Il verde rappresenta il segnale PWM, mentre il rosso rappresenta il segnale continuo (analogico) ottenuto all’uscita del filtro.

PWM Duty cycle 50%
Figura 2 - Duty cycle 50%

PWM Duty cycle 90%
Figura 3 - Duty cycle 90%

PWM Duty cycle 10%
Figura 4 - Duty cycle 10%

Questa soluzione è ideale nel caso in cui sia necessario generare una tensione continua che non cambia molto nel tempo (ma che è regolabile con il software) o che non ha bisogno di cambiare molto velocemente. Molti microcontrollori forniscono moduli di PWM dedicati che possono essere utilizzati per lo scopo qui descritto. Se i moduli PWM non sono disponibili, i moduli timer costituiscono la scelta migliore, in quanto permettono di creare il segnale PWM di cui si ha bisogno con un importo relativamente basso di risorse on/chip (un timer, un gestore di interrupt e poche allocazioni RAM). Ma anche se si utilizza il più economico, piccolo e povero dei microcontrollori, si può creare comunque un segnale PWM controllando direttamente un I/O con il codice, o in un loop, con un gestore o con gli interrupt. Uno degli aspetti più importanti di questa soluzione è il dimensionamento del filtro RC passa-basso, che è uno delle più semplici configurazioni di filtri passa-basso disponibili.

The RC filter
Figura 5 – Il filtro RC

L’aspetto più importante è il rapporto tra la costante di tempo del filtro (t = R*C) e il periodo del segnale PWM. Di regola bisogna mettere nella corretta posizione R e C, in modo che la costante di tempo è di circa 100 volte superiore a quella del periodo del segnale. Se la frequenza PWM è a 10 kHz (il che significa un periodo di 100us), si dovrebbe scegliere una costante di tempo di circa 10ms - facilmente ottenibile con R=1k e C=10uF (ideale per raggiungere i valori). Nel caso in cui cali la costante di tempo nel rispetto del periodo della PWM (diciamo da 1 ms a 10 ms), il filtro non sarà in grado di smorzare le oscillazioni del segnale PWM e si potrebbe ottenere qualcosa come questo (anche in questo caso, il rosso è l'uscita del filtro):

PWM period: 100us; Filter time constant: 1ms
Figura 6- Periodo PWM: 100us; costante di tempo del filtro: 1ms

Non è consigliabile aumentare troppo la costante di tempo. Questo metodo può essere utilizzato per ottenere una tensione analogica non-continua, nel caso in cui si modifichi nel tempo il duty cycle del segnale PWM (che è ciò che realmente s’intende per PWM), ma se la costante di tempo del filtro è troppo alta rispetto a periodo del segnale PWM, il filtro avrà una risposta lenta, fondamentalmente limitando la velocità di variazione del segnale di uscita. Nel diagramma seguente è possibile vedere l'effetto di una costante di tempo troppo elevata per una PWM con il duty cycle che varia dallo 0% al 90% al 50% e infine al 10%.

“Real” PWM: variable duty cycle 0%->90%->50%->10%
Figura 7 – PWM “reale”: duty cycle variabile 0%->90%->50%->10%

Come si può vedere, la risposta del filtro è lenta, il che rende la costante di tempo utilizzata inadatta per generare "veloci" segnali di cambiamento. Il metodo è tuttavia più che sufficiente per la creazione di segnali analogici continui o che cambiano lentamente, come per esempio una sinusoide del 50 Hz. Al fine di creare una sinusoide, il duty cycle del segnale PWM dovrebbe variare nel tempo da una formula sinusoidale (facile da raggiungere nei microcontrollori high-end, un pò più difficile con quelli più semplici, ma non impossibile – eventualemente si possono utilizzare le tabelle allocate nella memoria del programma).

E’ necessario un avviso per le fonti di errore che potrebbero influenzare il segnale in uscita (a parte il dimensionamento del filtro). In molti casi l’alta tensione minima in uscita su un pin del microcontrollore è specificato, diciamo, in VCC-0.2V. Ciò significa che il pin non sarà mai in grado di raggiungere il valore VCC nel suo stato elevato e questo avrà effetto su tutti i calcoli che si fanno. Se si eseguono i calcoli per un caso nominale, si dovrebbe trarre la conclusione che si ha bisogno di un duty cycle al 50% per ottenere un segnale di uscita di 2.5V da un fornitura 5V. Ma questo SOLO nel caso in cui il pin effettivamente raggiunge i 5V in un stato elevato. Se si raggiungono i 4.8V, si otterrà soltanto l'uscita a 2,4 V per un duty cycle al 50%. Si può ovviare a questo utilizzando alcuni ulteriori componenti esterne, come per esempio un transistor ad alta corrente veloce e alto:

External transistor
Figura 8 – transistor esterno

Bisogna considerare, però, che anche se si effettua il segnale in ingresso del filtro per variare tra i valori (0 e 5V), l'ulteriore resistenza nel collettore del transistor interesserà la risposta del filtro (nei calcoli, dovrebbe essere considerato in serie alla resistenza del filtro).

Una delle più difficili fonti di errore da correggere è la variazione del sistema di alimentazione di corrente. Ci si può fare affidamento se rimane su 5V, ma la verità è che la maggior parte dei regolatori di tensione hanno una tolleranza (quelli commerciali vanno a + /-4%). È possibile ottenerne sicuramente di più costosi, che possono puntare a +/-1% oppure si può anche ottenere un riferimento di tensione al quale è possibile collegare il resistore nel collettore del transistor. Se si vuole evitare che i costi aumentino, però, una soluzione da tenere in conto per questo errore potrebbe essere l'uso di un ADC on-chip (nel caso in cui il microprocessore ne abbia uno).

PWM period: 100us; Filter time constant: 1ms
Figura 9 – Periodo PWM: 100us; costante di tempo del filtro 1ms

E’ possibile utilizzare questo ADC per controllare la tensione di uscita e apportare i necessari adeguamenti nel duty cycle. Questo funziona solo se il microprocessore ha un divario di banda di riferimento per il modulo ADC, altrimenti, l'ADC stesso influirà sulla variazione di energia, in modo da non essere utile per lo scopo.

Pertanto, al fine di riassumere le caratteristiche di questa soluzione, è opportuno un breve paragone con il metodo R2R descritto nella prima parte di questo articolo:

    a) la PWM è la soluzione più conveniente, anche nella sua forma base, la risoluzione indipendente dal numero di pin utilizzati (tuttavia, dipende dalla durata della frequenza del microprocessore e del periodo della PWM)
    b) La soluzione della PWM è molto tollerante alla deviazione nelle componenti esterne utilizzate (il filtro RC può avere una tolleranza del 5% e resistenza anche +/-20% di condensatore di tolleranza)
    c) La frequenza del segnale di uscita non dipende dalla risoluzione, ma dipende soprattutto (e in modo critico) dal periodo del segnale PWM. La soluzione della PWM dovrebbe essere usata principalmente per i segnali che variano poco oppure per i segnali analogici continui (tuttavia regolabili dal software).

Nel caso in cui è necessaria un'ulteriore lettura sui filtri passa-basso o RC, il web offre una miriade di risorse (tra i risultati in alto di Google) :

http://en.wikipedia.org/wiki/RC_circuit
http://en.wikipedia.org/wiki/Low-pass_filter
http://www.muzique.com/schem/filter.htm

Scarica subito una copia gratis
Tags:

4 Commenti

  1. Avatar photo walterp 24 Maggio 2009
  2. Avatar photo Emanuele 22 Settembre 2009
  3. Avatar photo pieryb11 7 Ottobre 2009
  4. Avatar photo Emanuele 8 Ottobre 2009

Rispondi a walterp Annulla risposta

Seguici anche sul tuo Social Network preferito!

Send this to a friend