Nella precedente lezione abbiamo visto come misurare una tensione non superiore ai 5V dc, vedremo ora come realizzare un semplice circuito che permette mediante un partitore di tensione la misurazione di tensioni fino a 9 Volt. Dimensionando opportunamente le resistenze di partizione potremo effettuare misure per tensioni elettriche superiori.
Precisazione importante
Gli esempi riportati in questa e nella precedente lezione ed inoltre la gran parte degli esempio classici che trovate online, sono pensati per far comprendere il funzionamento del convertitore A/D, ma è opportuno fare alcune considerazioni sulla precisione di lettura, ovvero degli errori commessi dal convertitore A/D e sull’imprecisione delle tensioni di riferimento usate dal microcontrollore per fornirvi la misura. Questo sarà argomento di una prossima lezione e vedremo come ridurre l’errore di misura.
Per rendere semplice la realizzazione utilizzeremo la batteria da 9V, ma se intendete avere dei limiti di misura diversi e superiori a 9V dovrete apportare modifiche ai valori dei componenti, ma le formule esposte restano le medesime.
Prima di procedere con la realizzazione pratica è essenziale comprendere come dimensionare le resistenze del partitore, inoltre è essenziale che la tensione sul pin analogico A0 non superi il valore di 5V. Per effettuare il dimensionamento del circuito fissiamo la massima tensione misurabile Vmis_max a 9V e imponiamo il valore di uno dei due resistori, ad esempio R1 in modo da poter ricavare il valore di R2.
Vi ricordo inoltre che sarebbe opportuno, una volta fissate le resistenze, fare qualche considerazione sulla corrente massima entrante in A0 in modo che non venga superato il valore di 40 mA corrente massima di I/O sui pin analogici e digitali di Arduino Uno R3, ma come le resistenze che sono state scelte non correremo alcun rischio, però esporrò ugualmente il calcolo.
Nello schema che segue Vmis rappresenta la tensione da misurare, Vadc la tensione sul pin A0. I è la corrente totale che circola nel circuito.
Sappiamo che la tensione Vadc ai capi di R2 non dovrà superare i 5V. Le tensioni su R1 ed R2 saranno:
(a) VR1 = R1*I
(b) VR2 = R2*I
Pertanto la tensione Vmis sarà
(c) Vmis = VR1 + VR2 = R1*I+R2*I = (R1+R2)*I
da cui ricaviamo:
(d) I = Vmis /(R1+R2)
Sostituendo I in (a) e (b) avremo:
(e) VR1 = R1*I = R1 * Vmis /(R1+R2)
(f) VR2 = R2*I = R2 * Vmis /(R1+R2)
Per il calcolo di R2 consideriamo la formula (f) sostituendo i valori fissati, Vmis_max e R1, ricordando che VR2 è la tensioni in A0, cioè Vadc:
⇒ VR2 = R2 * Vmis /(R1+R2)
⇒ R2 /(R1+R2) = VR2/Vmis_max
⇒ R2 /(R1+R2) = 5/9
⇒ R2 /(R1+R2) = 0,56
⇒ R2 = 0,56*R1 + 0,56*R2
⇒ R2*(1-0,56) = 0,56*R1
⇒ R2 = 0,56 *R1/0,44
⇒ R2 = 0,56 * 27 * 103/0,44 = 34,363 * 103 = 34,363 Kohm
Scelgo come valore commerciale prossimo (e che dispongo nel mie scorte) il valore di 33 Kohm, quindi:
- R1 = 27 Kohm
- R2 = 33 Kohm
Per quanto riguarda la corrente entrante in A0, utilizziamo la formula (b):
VR2 = R2*I
I = VR2/R2
I = 5V/33000 Ω = 0,00015 A = 0,15 mA
ben al di sotto del valore massimo del valore accettabile su un pin I/O di Arduino che è di 40mA.
Schema di collegamento
Programmazione
Sviluppiamo il codice necessario per la lettura della tensione e partendo dal primo sketch della lezione precedente modifichiamone alcune parti, nei commenti la spiegazione delle varie parti.
Nel codice bisognerà tenere in conto che la tensione su A0 è data dal calcolo della partizione di tensione, pertanto sapendo che Vmis = Vadc, dalla forma (f) abbiamo:
⇒ VR2 = R2*I = R2 * Vmis /(R1+R2)
⇒ VR2 = Vadc = R2 * Vmis /(R1+R2)
⇒ Vmis = Vadc * (R1+R2)/R2
Che sarà la formula che ci consentirà di rilevare la misura.
// Prof. Maffucci Michele
// Esempio 01: Misura una tensione di 9V con Arduino
// utilizzando variabili di tipo float
// Data: 03.10.2021
// tensione di riferimento massima misurabile
const float tensioneDiRiferimento = 5.0;
float R1 = 27000.0; // 27 Kohm
float R2 = 33000.0; // 33 Kohm
float volt_adc = 0.0;
float volt_mis = 0.0;
void setup() {
Serial.begin(9600);
//analogReference(DEFAULT);
}
void loop() {
// legge il valore su A0 (su R2), cioè la tensione Vadc e lo trasforma
// in un valore numerico tra 0 e 1023
int valoreLetto = analogRead(A0);
// Tensione in ingresso ad A0, cioè la tensione Vadc
// calcolo della proporzione
// volt:tensioneDiRiferimento = valoreLetto:1023.0
// da cui si ricava la formula che segue
volt_adc = (valoreLetto/1023.0) * tensioneDiRiferimento;
//Stampa del valore letto dall'ADC
Serial.print("Valore ADC = ");
Serial.println(valoreLetto);
// calcolo della tensione di ingresso Vmis
volt_mis = volt_adc*(R1+R2)/R2;
// stampa sulla Serial Monitor la tensione misurata
Serial.print("Tensione di ingresso = ");
Serial.println(volt_mis);
Serial.println(" ");
delay(1000);
}
Esercizi per i miei studenti
Esercizio 1
Dimensionare il Circuito per misurare una tensione massima di 12V
Esercizio 2
Realizzare uno sketch Arduino che permette di dimensionare il circuito prendendo in input, attraverso la Serial Monitor il valore massimo misurabile ed il valore di R1 e restituisce il valore di R2 calcolato.
Esercizio 3
Realizzare le medesime funzionalità dell’esercizio 2, ma il valore restituito di R2 deve essere sia quello calcolato che quello commerciale immediatamente superiore o inferiore al valore calcolato.
Buon Coding a tutti 🙂