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.
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.
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.
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
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.