analogReference(INTERNAL) mi serve spiegazione

volendo usare la tensione di riferimento interna dell'ATmega328 come devo fare? che valore ha?

la tensione dell'usb come riferimento fa pena, mi varia tra 5,06v e 5,16v e rende le misurazioni troppo approssimative

io definisco nello sketch:

analogReference(INTERNAL)

quindi poi nella formula di calcolo che devo scrivere?

tensione = ((analogRead(0) * ????? ) * ????? ) ;

questo e' lo sketch che usavo con per leggere una tensione superiore a 5volt usando un partitore resistivo, vorrei che fosse modificato usando l'analogRef interno dell'atmega (cosi' vedo se e' piu' stabile rispetto all'alimentazione)

//legge analogread e converte in tensione

float tension = 0;

void setup()
{
  Serial.begin(9600); 
}
void loop()
{
  tension = ((analogRead(0) * 0.005 ) * 21.10 ) ; 
  
//partitore R1 A0 R2 per misurare una tensione di 9volt o piu'
  //(R1+R2)/R2
  //R1 e' tra la tensione da misurare e A0  
  //R2 e' su GND/A0
  //R1 20k
  //R2 995
  //rapporto 

  Serial.print("Tension: ");
  Serial.println(tension);                  

  delay(1000); 
}

dipende.
L' instabilitá della tensione di aliemntazione si cancella quando misuri delle tensioni che vengono generate da un partitore resistivo dove una delle 2 resistenze dipende da una grandezza fisica ( temperatura, luce ecc).
se misuri una grandezza assoluta che viene prodotta da un sensore che da una tensione la misura sbaglia con il cambiae della tensione di alinmentazione/riferimento esterna).

come puoi leggere analogReference() - Arduino Reference
DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)
INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8 (not available on the Arduino Mega)
INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)
INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)
EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.

Percui se hai un Arduino UNO o 2009 sono 1,1V e devi abbassare la tensione da misurare sotto i 1,1V.

Ciao Uwe

grazie, quindi 1,1volt, sai se e' misurabile questa analogreference interna?

volevo vedere se rimaneva stabile al variare dell'alimentazione fornita dall'usb, altrimenti son daccapo

(se do su A0 1,100volt dovrei leggere 1023, giusto?) o altri metodi

reizel:
grazie, quindi 1,1volt, sai se e' misurabile questa analogreference interna?
volevo vedere se rimaneva stabile al variare dell'alimentazione fornita dall'usb, altrimenti son daccapo

La tensione di riferimento di 1.1V viene applicata sul pin Aref sul quale è indispensabile collegare un condensatore da almeno 100nf chiuso verso GND, la puoi misurare sul pin stesso ed è molto stabile perché generata tramite un piccolo regolatore lineare di tensione interno al micro.

mi accodo perche lo devo usare anche io e chiedo: analogReference(INTERNAL) una volta richiamato, si applica a tutti i pin analogici?

cioè volendo per esempio voler ricevere in analogico un segnale a MAX 1.1V e in un'altro pin MAX 5V, è possibile?

forse bisogna agire su qualche registro?

z3us:
mi accodo perche lo devo usare anche io e chiedo: analogReference(INTERNAL) una volta richiamato, si applica a tutti i pin analogici?

Una volta attivato il riferimento interno, o utilizzando una tensione esterna di riferimento su Aref, vale per tutti i pin analogici.

grazie astrobeed e uwe, pur non avendo sottomano un cond da 100nF da mettere tra AREF e GND son riuscito finalmente a misurare una tensione veramente precisa, forse sbaglia di +/- 0.02volt, non di +, piu' che ottimo!

reizel:
grazie astrobeed e uwe, pur non avendo sottomano un cond da 100nF da mettere tra AREF e GND

Il condensatore serve per migliorare la stabilita del generatore di tensione interno e per ridurre il rumore, anche senza funziona però è altamente consigliato metterlo.

z3us:
mi accodo perche lo devo usare anche io e chiedo: analogReference(INTERNAL) una volta richiamato, si applica a tutti i pin analogici?
cioè volendo per esempio voler ricevere in analogico un segnale a MAX 1.1V e in un'altro pin MAX 5V, è possibile?
forse bisogna agire su qualche registro?

Abbassa i 5V con un partitore resistivo. usa resistenze per il partitore non troppo grandi diciamo di kOhm e non superare un valore complessivo di 10kOhm. L' entrata dei Pin analogici non é cosí ad alta impedenza come s pensa perché carica un condensatore sample and hold interno al ATmega in breve tempo. Se il segnale non cambia velocemente puoi mettere un condenstore da 0,1µF tra entrata e massa.

Ciao Uwe

scusa, ma se alimenti arduino con una batteria tipo da 9V, i 5V di riferimento non sono più stabili?

dab77:
scusa, ma se alimenti arduino con una batteria tipo da 9V, i 5V di riferimento non sono più stabili?

si, sono piu' stabili, ma se vuoi un riferimento preciso non c'e' da fidarsi, puoi trovarti 5,05 come 4,94 o +, e un piccolo errore poi s'amplifica, ho fatto delle prove e il riferimento interno e' la scelta migliore

però a 1,1V un errore di 0,02V è il 2%, cioè come a 5V un errore di :cold_sweat: :sleeping: 0,1V, giusto?
quindi un range di 1,08-1,12V è come 4,9-5,1V, o sbaglio?

dab77:
però a 1,1V un errore di 0,02V è il 2%, cioè come a 5V un errore di :cold_sweat: :sleeping: 0,1V, giusto?
quindi un range di 1,08-1,12V è come 4,9-5,1V, o sbaglio?

a 1,1v non c'e' tutto quell'errore, dopo mi prendo il datasheet e controllo, io ho trovato la soluzione con il reference interno e usero' quello :wink:

reizel:
si, sono piu' stabili, ma se vuoi un riferimento preciso non c'e' da fidarsi, puoi trovarti 5,05 come 4,94 o +, e un piccolo errore poi s'amplifica, ho fatto delle prove e il riferimento interno e' la scelta migliore

Ovviamente anche il regolatore a 5V presente su Arduino ha le sue tolleranze e la tensione non è mai 5V esatti, però non ha tutto il rumore che c'è sui 5V della USB, ed è quest'ultimo a creare i maggiori problemi con l'ADC.
Un errore di qualche decina di mV come riferimento sull'ADC è un errore assoluto e costante in modo raziometrico su tutte le letture, può essere facilmente compensato misurando la tensione di uscita del regolatore a 5V e utilizzare questo valore per la conversione tra count ADC e tensione reale se necessario.
Se la lettura ADC non deve essere visualizzata in tensione reale per noi umani è inutile convertire i count dell'ADC in Volt, conviene lavorare direttamente con i count, se occorre inserire nel programma tensioni reali come riferimenti si usa una define dove viene eseguito il calcolo per la conversione dal compilatore e non dal processore durante il run time.

Stiamo parlando di precisione.
Il Vref ha un influenza diretta sulla conversione. Un suo errore o flutuazione puó, ma non deve avere un influenza sulla precisione della conversione.
Se il segnale di misura cambia come i 5V presi come riferimento l' errore si elimina ( sensore messo come parte di un partitore).
Se il segnale di misura é costante rispetto a degli cambi di tenssione di alimentazione allora un errore dinamico su Vref fa sbaglaire la conversione.

Di che misura e che sensore stiamo parlando?

Tanti saluti Uwe