Il modo classico per misurare la tensione di sistema è quello di collegare uno dei pin ADC dell'MCU ad un partitore di tensione costituito da una coppia di resistori. Mediante un semplice calcolo si produce così una lettura della tensione del sistema. Questo approccio presenta però due svantaggi: un consumo costante di energia e l'occupazione di un pin che si potrebbe utilizzare per fare altro. I microcontrollori AVR presentano dei flessibili ADC in grado di rilevare con precisione la tensione della batteria completamente via software, senza sacrificare pin o consumare energia. In questo articolo, andremo a vedere come ciò sia possibile ed introdurremo una libreria Arduino che permette di implementare velocemente tale funzione.
Introduzione
La misurazione della tensione della batteria o dell'alimentazione è fondamentale per monitorare le prestazioni e la stabilità del sistema, soprattutto in applicazioni come IoT, dispositivi indossabili, automotive, misurazione della potenza, ecc. Tipicamente, il rilevamento della tensione della batteria richiede l'aggiunta di un circuito esterno con i relativi requisiti di alimentazione. Tale metodologia funziona in modo accurato ma presenta alcuni problemi come il consumo costante di energia e l'occupazione di un pin. Esistono diversi modi per mitigare questi problemi, ma la soluzione migliore sarebbe quella di aggirarli del tutto magari attraverso una soluzione totalmente via software.
Una nota applicativa di Microchip descrive un metodo per implementare una soluzione al problema quando si utilizzano microcontrollori AVR. Questa nota applicativa descrive una soluzione a basso consumo per misurare la tensione VCC o della batteria senza utilizzare eventuali pin di I/O o componenti esterni. L'idea centrale è quella di lasciare che una tensione di riferimento interna nota agisca come ingresso dell'ADC e che VCC agisca come tensione di riferimento per l'ADC. Questa soluzione aiuta gli utenti a configurare applicazioni con basso consumo energetico, basso numero di pin, e pochi elementi della distinta base. Per una migliore risoluzione, però, questa soluzione dovrebbe essere ottimizzata a causa della sua non linearità. Tuttavia, per il monitoraggio della tensione della batteria, la soluzione risulta piuttosto interessante.
Il metodo proposto
Il metodo classico di misurazione del valore di VCC consiste nel collegare il pin di ingresso dell'ADC dell'MCU ad un partitore di tensione costituito da una coppia di resistori, come mostrato in Figura 1.
Un semplice calcolo fornisce quindi una lettura della tensione del sistema:
VCC = Vin x (R1 + R2)/R2
Tuttavia, ignorando l'influenza della deriva termica sulle resistenze, vi è un significativo svantaggio in questo approccio: il costante consumo di energia. In alcune applicazioni a bassa potenza con batteria, ovviamente questo non è accettabile. Un approccio migliorato consiste nell'aggiungere un interruttore al circuito. Sebbene questo miglioramento riduca il consumo energetico dei resistori esterni, le risorse di I/O dell'MCU resteranno occupate, e ciò non è accettabile in quelle applicazioni a basso numero di pin.
Ciò che accade nel metodo proposto da Microchip è selezionare un riferimento di tensione interno, fisso e indipendente dalla temperatura, come Vin e impostare VCC come riferimento di tensione dell'ADC. Questo è essenzialmente il contrario di come viene normalmente utilizzato l'ADC, ma non richiede alcun collegamento esterno e richiede solo un piccolo calcolo per determinare il valore di VCC in millivolt. Vi è una certa non linearità nei risultati, ma per lo scopo di misurare la carica della batteria in un sistema o decidere quando inviare un segnale di “batteria scarica”, risulta una soluzione interessante.
Le principali caratteristiche del metodo sono quindi:
- Misura della tensione VCC o della batteria
- Nessuna occupazione di pin di I/O
- Nessun componente esterno
- Basso consumo di potenza
Teoria
Supponendo di usare un ADC a 10 bit, il valore della tensione misurata può essere calcolato in base alla formula seguente:
RESadc = 210 x Vin/Vref = 1024 x Vin/Vref
dove RESadc è il valore nel registro risultato dell'ADC, Vin è l'ingresso dell'ADC e Vref la tensione di riferimento dell'ADC.
Il modo generale per misurare una tensione è selezionare come Vin una tensione di ingresso esterna e selezionare come Vref una tensione interna come VCC o Vbg.
Vbg rappresenta il riferimento di tensione di bandgap, un riferimento di tensione indipendente dalla temperatura e ampiamente utilizzato nei circuiti integrati. Vbg è una tensione fissa (costante) indipendente dalle variazioni di alimentazione, dai cambiamenti di temperatura o dal carico in uscita. Solitamente, tale riferimento di tensione si aggira intorno a 1,25 V, la tensione di bandgap del silicio.
L'approccio proposto dalla nota applicativa di Microchip funziona esattamente al contrario rispetto al modo generale. Infatti, seleziona Vbg come Vin e VCC come Vref. La formula per il calcolo della tensione misurata può essere così aggiornata a:
RESadc = 1024 x Vbg / VCC => VCC = (1024 x Vbg) / RESadc
In genere, si misurerebbe una tensione sconosciuta (per il pin di ingresso) rispetto ad una scala nota (una tensione di riferimento). Il trucco consiste nel fare il contrario: misurare una tensione nota (il riferimento interno Vbg) utilizzando una scala sconosciuta (la tensione VCC). Normalmente sarebbe sciocco misurare una tensione nota, visto che se ne conosce il valore, ma in questo caso ciò permette di calcolare in modo inverso la tensione di riferimento. Il calcolo della tensione VCC viene quindi fatto in base esclusivamente all'uscita del convertitore analogico-digitale.
Cerchiamo di capire cosa realmente accade con questo metodo attraverso un esempio. Supponiamo di avere due bastoncini:
- uno più lungo con 1024 tacche equidistanti lungo la sua lunghezza
- l'altro più corto ma di lunghezza nota pari esattamente a 1,1 metri
Date le informazioni note vogliamo capire se sia possibile misurare la lunghezza in metri del bastone lungo. Una soluzione è prendere il bastoncino corto e compararlo con quello lungo, contando quante tacche misura come evidenziato in Figura 2.
Supponiamo che il bastoncino corto misuri 250 tacche, allora 250 tacche equivalgono a 1,1 metri:
250 tacche = 1,1 m => 1 tacca = 1,1 m / 250 => 1 tacca = 0,0044 m
Quindi, se 1 tacca equivale a 0,0044 m e sappiamo che il bastone lungo misura 1024 tacche, allora sappiamo che il bastone lungo è 1024*0,0044 m = 4,5056 m. Il bastone lungo misura circa 4,5 metri.
Ora cambiando le unità di misura da [metri] in [volt] e da [tacche] in [passi del convertitore analogico-digitale] possiamo misurare quanto vale una tensione di riferimento interna nota (1,1 V) rispetto ad una scala basata sulla tensione sconosciuta VCC. Se otteniamo un valore ADC di 250, ciò significa che il valore di VCC è di circa 4,5 V.
Adesso che abbiamo capito il funzionamento, ci chiediamo quanto precisa sia questa tecnica. In termini generali, maggiore è la VCC, minore è la risoluzione. Se, ad esempio, prendiamo il caso peggiore che corrisponde alla VCC massima consentita dal dispositivo di 5,5 V, il passo dell'ADC risulta pari a circa 5 mV. Si tratta di un paio di ordini di grandezza in più di risoluzione di quella necessaria per misurazioni competenti dello stato di carica della batteria, che in genere richiedono solo decimi di volt di risoluzione. Le due principali fonti di imprecisione sono (1) il fatto che il riferimento interno può variare da 1,0 a 1,2 V a seconda dei processi di produzione e (2) le imprecisioni intrinseche dell'ADC.
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2209 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.