u.r. 17-FEB-2026
L'idea di questa procedura mi è nata quando ho dovuto effettuare la correzione software della tensione di riferimento generata dal bandgap entro contenuto nell'ATmega328P, per l'uso con il sensore AD590 senza stadi attivi di condizionamento.
La tensione di riferimento del bandgap interno è estremamente stabile, ottima per misurare range fra 0 e 1,1V, ma ha un'elevata tolleranza di produzione (tipicamente fra 1,0 e 1,2V) che può quindi introdurre errori non trascurabili nel calcolo della tensione misurata dall'ADC.
Il suo utilizzo corretto richiede, quindi, innanzitutto una stima del suo effettivo valore (mediante la procedura di seguito descritta) ma anche lo scarto della prima lettura (che sarebbe non accurato, così come è scritto nel datasheet).
DESCRIZIONE DELLA PROCEDURA
Il pin AREF, se non collegato a nessuna tensione esterna, fornisce in uscita il valore della tensione di riferimento attualmente configurata nel software in esecuzione su Arduino
Si misurerà, quindi, tale tensione con un voltmetro (es un multimetro digitale), che verrà memorizzato nella memoria EEPROM della scheda Arduino e richiamato, all'occorrenza, in ogni software che impieghi la stessa tensione di riferimento interna.
Evidentemente, tale procedura andrà ripetuta ogni volta si cambia la scheda Arduino UNO R3, ovvero il microcontrollore ATmega328, essendo la tolleranza di fabbricazione del bandgap interno piuttosto variabile.
La procedura è stata testata solo su questo microcontrollore, ma dovrebbe funzionare anche per altri micro ATmegax che hanno un bandgap interno da 1,1V
HARDWARE
Occorrerà semplicemente collegare un comune multimetro 3,5 cifre impostato in tensione (se portata manuale selezionare 2V =) fra il pin AREF e la massa:
Nel mio caso è stata misurata una tensione di
1,078V:
SOFTWARE
1) BANDGAP_1V1_CAL.INO
Misura della Vref interna e salvataggio su EEPROM
/****** Problema:
* la tensione di riferimento del bandgap interno 1,1V degli ATmegaX, sebbene molto
* stabile, ha una tolleranza produttiva non trascurabile. Conoscere l'effettivo valore,
* dunque, migliora notevolmente il calcolo delle tensioni misurate via software
* che usano come riferimento questa tensione.
*
****** Risoluzione:
* Mediante un DMM impostato come voltmetro (portata 2V =), si misurerà la d.d.p.
* fra il pin AREF e la GND. Il valore così misurato, verra chiesto dunque
* all'utente (dal monitor seriale) e salvato in una locazione della memoria EEPROM;
* Tale valore verrà richiamato, successivamente, nel software di lettura A/D
* che utilizza come VREF il bandgap interno.
* La procedura va ovviamente ripetuta a ogni cambio di scheda Arduino/microcontrollore.
*
****** Autore:
* Francesco Parisi, 2025-FEB-05
*/
#include <EEPROM.h>
float VREF =1.1; // tensione nominale b/gap int.
const int EEADD=0; // ind. EEPROM dove salvare la VREF misurata con il DMM
void setup() {
Serial.begin(9600);
analogReference(INTERNAL); // impostiamo Vref interna
Serial.print("\nMisura tensione con bandgap interno: ");
Serial.println(F("\n============================================="));
Serial.print("\nInserire misura tensione DMM in Volt (es. 1.078): ") ;
while (Serial.available()==0)
{ } // attende input da monitor seriale
VREF=Serial.parseFloat(); // trasforma input in float
Serial.println(VREF);
EEPROM.put(EEADD, VREF); // scrive il val. VREF all'ind. EEADD
Serial.println(F("============================================="));
Serial.print("Valore della VREF interna salvato all'indirizzo EEPROM: ");
Serial.println(EEADD);
Serial.println(F("============================================="));
Serial.println("Programma terminato con successo!");
}
void loop() {
analogRead(A0); // lettura a vuoto
}
Avviare il monitor seriale e inserire il valore di tensione misurata con il DMM (es. 1.078), battere INVIO:
Il programma procederà nell'esecuzione lo stamperà e lo salverà nella locazione di memoria EEPROM (valore predefinito 0, che può essere cambiato nella sezione dichiarativa: costante EEADD):
2) BANDGAP_1V1_TEST.INO
Stampa su monitor seriale della variabile VREF salvata su EEPROM
/*
* Test lettura valore VREF memorizzato nella EEPROM
*
*/
#include <EEPROM.h>
const int EEADD=0; // ind. EEPROM dove è stato memorizzato il fatt. correttivo
float VREF; // valore della vref memorizzato all'indirizzo EEADD
void setup() {
Serial.begin(9600);
Serial.print("Indirizzo EEPROM :");
Serial.println(EEADD);
EEPROM.get(EEADD, VREF); // legge locazione EEADD e assegna valore a VREF
Serial.print("VREF = ");
Serial.println(VREF,3);
}
void loop() {
}
Attivando il monitor seriale avremo questo esempio di output:
USARE IL VALORE MEMORIZZATO NELLO SKETCH UTENTE
Nello sketch utente, ovvero lo sketch che impiegherà questo valore occorrerà innanzitutto inserire all'inizio la direttiva di inclusione del file di intestazione della libreria EEPROM:
#include <EEPROM.h>
A seguire, nella sezione globale, si dichiareranno la costante int EEADD e la variabile float VREF
Nel corpo della setup() si richiamerà la seguente funzione di assegnazione del valore letto dalla EEPROM alla variabile VREF:
Nessun commento:
Posta un commento