Prodotti
Andrea Angelotti
Tensione analogica da un circuito digitale con i PWM
Tutorials -
Sabato 14 Agosto 2010 16:23
Scritto da Andrea Angelotti

Introduzione.
Ecco di cosa non tratterà questo tutorial: di PWM in generale e di potenziometri digitali in circuiti integrati.

Per sapere cosa sono i PWM vi rimando ad un altro tutorial e qualche articolo su Arduino.cc:
http://www.gioblu.com/tutorials/programmazione/103-che-cose-il-pwm
http://www.arduino.cc/en/Tutorial/PWM
http://arduino.cc/en/Reference/AnalogWrite

Per l'uso di potenziometri digitali invece andate qui:
http://www.gioblu.com/tutorials/azionamenti/91-potenziometri-digitali-ds1669

Cosa tratta questo articolo?
La realizzazione a bassissimo costo ed impegno di un convertitore DC-AC (digitale - analogico) da usare con una porta PWM di un Arduino.

A cosa serve un convertitore DC-AC.
Nei circuiti digitali può sempre succedere di aver a che fare con tensioni analogiche, per esempio cercando di simulare un potenziometro, o interfacciandosi con controlli ed attuatori scavalcando l'azione manuale di radiocomandi ed altri azionamenti.
In queste situazioni è indispensabile avere a disposizione delle tensioni variabili e pilotabili totalmente tramite un nostro software caricato su Arduino.
Nel caso di questo tutorial, creare un DC-AC con una porta PWM di Arduino offre innumerevoli vantaggi, il più importante di tutti il risparmio nel costo dei componenti totali, la facilità di comprensione e dimensionamento del circuito e la notevole possibilità di usare un solo pin, contro i numerosi che servirebbero per realizzare un DAC vero e proprio o un sistema chiamato R2R.

Realizzazione.
Dopo questa breve introduzione passiamo subito alla altrettanto breve realizzazione. ;)

Per costruire il nostro DAC-Arduino abbiamo bisogno di un pin PWM e di un filtro passa-basso (low pass), tutto qui.

Infatti filtrando i treni di impulsi che invieremo tramite la porta PWM, regolati dal nostro software, otterremo il valor medio del segnale, che è sempre proporzionale al duty cycle dei PWM.
Quindi regolando il duty cycle regoleremo anche la tensione in uscita dal filtro.
Una cosa che dobbiamo tenere a mente è che questa soluzione è valida solo per cambiamenti non troppo rapidi di tensione (decisamente sufficienti se vogliamo generare una sinusoide di 50Hz), ma lo vedrete sperimentando.

Dimensionamento del filtro passa-basso (low pass).
L'unica cosa importante di questo metodo è dimensionare correttamente il filtro.
Spero che sappiate cos'è un filtro passa-basso, in caso contrario vi rimando a Wikipedia: http://it.wikipedia.org/wiki/Filtro_passa_basso

Dimensionare il filtro vuole dire regolare la costante t.
Se la costante t sarà troppo elevata rispetto alla frequenza dei PWM avremo una risposta molto lenta nella conversione, cosa poco importante in realtà se vogliamo tensioni continue, ma limitante se volessimo generare onde sinusoidali.
Come si regola t? Semplicissimo, t=R*C e deve essere almeno 100 volte superiore al periodo del segnale.
Nel caso di Arduino la frequenza dei PWM dovrebbe (non vorrei sbagliare) oscillare tra 490 e 500Hz, ma controllate sempre il datasheet della vostra versione perchè potrebbe variare; quindi 500Hz = 2ms, moltiplicando per 100, 200ms, ottenibile con una resistenza da 20K ed un condensatore da 10uF: 20K*10uF=0.2s -> 200ms.

Sapendo che un pin dell'Arduino duemilanove eroga +5V, e che questo corrisponde al duty cycle=100%, mentre 0V al duty cycle=0%, con una semplice proporzione possiamo trovare i valori intermedi, passarli alla funzione analogWrite() ed ottenere la nostra tensione analogica.
Fine. ;)

Precisione, problematiche e soluzioni sull'effettiva uscita analogica, e dimensionamento del range analogico.
Questo paragrafo è alla fine solo perchè ora avete chiaro come funziona questo metodo e potete rendervi conto di quello che vi dirò, ma è un punto molto importante del progetto.
La precisione della tensione analogica in uscita è proporzionale alla precisione dell'uscita del pin PWM di Arduino; questo vuole dire che se la nostra scheda ha un errore di -0.2V sulla massima tensione erogabile, noi potremmo non raggiungere i +5V, ma solo +4.8V, quindi la nostra proporzione andrebbe rifatta con i valori reali ottenibili.
Es.:
Tensione massima: +5V,
Duty cycle: 50%,
Tensione analogica in uscita: +2.5V.

Tensione massima: +4.8V,
Duty cycle: 50%,
Tensione analogica in uscita: +2.4V.

Come si può notare, a parità di duty cycle si ottengono due valori diversi.

Per ovviare a questi problemi, se ci servisse una grande precisione, si potrebbero usare transistor ad alta corrente veloci, che però rallenterebbero ulteriormente il circuito; in più per arginare la problematica dell'errore dei regolatori di tensione (dato che è difficile che la tensione in uscita da un regolatore, quello di Arduino per esempio, sia effettivamente costante), per una precisione ancora maggiore, si potrebbe collegare l'uscita analogica del filtro ad un pin, da usare come ADC (Analog to Digital Converter), con la semplice funzione analogRead() per esempio, usandolo come riferimento. Ma per illustrare questi passaggi, altrettanto semplici a dire il vero, aspetto di vedere se ci sarà veramente necessità di tale precisione.

Per quanto riguarda il dimensionamento del range di tensioni in uscita lascio alla vostra fantasia/esperienza.
Il circuito così com'è eroga una tensione variabile da 0V a +5V, ma se vi servisse un altro range di tensioni basterebbe amplificare o smorzare il segnale o prima o dopo il filtro (sperimentate per vedere cosa potrebbe cambiare), tenendo presente che tutto sarebbe proporzionato al duty cycle.

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi