Go Down

Topic: Dubbio analogReference( INTERNAL ) (Read 15447 times) previous topic - next topic

menniti

Temo che tu stia facendo un po' di casino. Io ho visto nella foto che un cavetto collega la fila rossa della bread board a +5V di Arduino ed un altro che la collega all'uscita del "tuo" 7805. Se dai tensione all'alimentatore esterno e contemporaneamente al tuo 7805 crei un conflitto di tensioni. Proviamo a fare le cose per bene. Prima di tutto c'è da capire se l'INTERNAL funziona o meno.
1 - LASCIA da parte per ora il tuo alimentatore e alimenta Arduino tramite USB, quindi alimenta la bread direttamente da Arduino tramite i due cavetti su +5V e GND, e per ora non ti preoccupare della tensione di alimentazione
2 - Elimina la LDR
3 - Esegui nello sketch il comando INTERNAL e carica lo sketch su Arduino
4 - mentre l'LM35 fa il suo lavoro misura tra IORef e GND che tensione c'è, dovresti avere qualcosa di simile a 1,1V.
Fammi sapere.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
Temo che tu stia facendo un po' di casino. Io ho visto nella foto che un cavetto collega la fila rossa della bread board a +5V di Arduino ed un altro che la collega all'uscita del "tuo" 7805


Il cavo rosso del 7805 (+5V) era collegato alla linea rossa della bread board, e il cavo bianco del 7805 (GND) era collegato alla fila blu della bread board sul lato destro dove stava anche il sensore LM35, così i 5V del 7805 erno presenti solo sulla parte destra della bread board, proprio adesso ho controllato di nuovo la foto.


Ho lasciato collegato solo l'LM35 con +5V e GND di arduino via usb con lo sketch Internal, ma la tensione tra IORef e GND è sempre 4.60V
però la temperatura effettivamente è molto precisa, mentre se uso lo sketch con default la tensione tra IORef e GND è sempre 4.60
ma la temperatura è di oltre un grado in più rispetto a quella reale.
Code: [Select]

float temp = 0.0;       // valore convertito in temperatura (°C)
int val = 0;            // valore quantizzato dall'ADC [0..1023]
float vref = 1.1;
float tempPin = 1;   // pin analogico sensore


void setup()
{
 Serial.begin(9600);
 analogReference( INTERNAL );  // per l'ADC usiamo il Vref interno da 1,1V (migliore precisione)
 analogRead( tempPin );       // Prima lettura "a vuoto" (serve per l'assestamento dell'ADC)

}

void loop()


/* Legge la temperatura */

{

   val = analogRead( tempPin );              // legge il dato della tensione sul pin 'LM35_pin'
   temp = ( 100.0 *  vref * val ) / 1024.0;   // lo converte in °C
 
   Serial.println(temp);             //invia i dati alla seriale
  Serial.print(" Celsius, ");
   delay( 1500 );


}


Hai visto il link per lo stesso problema?

menniti

Hai ragione sulla foto e ma l'inghippo comunque c'è! tu alimenti Arduino e l'LDR via USB, mentre l'LM35 con un'altra fonte. Quando dai default Arduino fa i calcoli riferendosi a 4,6V quindi probabilmente in queste condizioni la temperatura che misuri è maggiore del normale, e mi pare che sia così; infatti se imposti internal il riferimento è fisso a 1,1 e i conti tornano. Resta il problema della LDR e del fatto che ci serve la tensione da 1,1V per essa, altrimenti non riusciamo a risolvere, secondo me. ALLORA d'ora in poi LASCIA SEMPRE INTERNAL e abbandona l'alimentatore esterno, quindi collega tra loro le linee rosse in modo che anche l'LM 35 sia alimentato da Arduino, ok???
Al pin IORef in questo momento cosa tieni collegato?
Quel pin deve riportare SEMPRE la tensione di riferimento per l'ADC di Arduino; con DEFAULT o EXTERNAL è normale che trovi i circa 4,6V di alimentazione, ma con INTERNAL DEVI trovare 1,1V, a meno che la tua scheda non abbia la doppia tensione e voglia il comando specifico.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
ALLORA d'ora in poi LASCIA SEMPRE INTERNAL e abbandona l'alimentatore esterno


L'alimentatore esterno l'ho usato solo una volta 2 / 3 giorni fa per prova, ma dopo ho alimentato l'LM35 e la fotoresistenza sempre con arduino via usb

Con internal la tensione di 1.1V c'è l'ho sul pin AREF, poi se passo a default sempre sul pin AREF è 4.60, mentre sul pin IORef è sempre 4.60

leo72

Il pin IOREF porta fuori la tensione di alimentazione della scheda. E' un nuovo pin aggiunto nel layout R3 delle schede Arduino per rendere gli shield compatibili con modelli di scheda che usano alimentazioni diverse (ad esempio la DUE lavora a 3,3V). In questo modo il costruttore dello shield deve solo leggere la tensione su IOREF per capire come impostare il suo prodotto.

Attenzione a passare da INTERNAL a EXTERNAL senza precauzioni.
Quoto dal reference:
Quote
Alternatively, you can connect the external reference voltage to the AREF pin through a 5K resistor, allowing you to switch between external and internal reference voltages. Note that the resistor will alter the voltage that gets used as the reference because there is an internal 32K resistor on the AREF pin. The two act as a voltage divider, so, for example, 2.5V applied through the resistor will yield 2.5 * 32 / (32 + 5) = ~2.2V at the AREF pin.

http://arduino.cc/en/Reference/AnalogReference

format

#35
Jan 08, 2013, 09:35 am Last Edit: Jan 08, 2013, 09:40 am by format Reason: 1
Con questo esempio trovato in rete il sensore LM35 accoppiato alla fotoresistenza, tira fuori una temperatura abbastanza
reale, perchè da quando ho capito fa una media delle ultime 8 letture.
Il fatto di usare LM35 e fotoresistenza è un problema comune, quindi credo che c'è poco da fare....
(ovviamente se uso internal la temperatura è ancora più precisa)
Sia con gli sketch che abbiamo provato noi, che questo il problema della temperatura sballata si verifica solo quando c'è
moltissima luce (la fotoresistenza segna valori prossimi a 850 in default, e 1023 con internal)

Questi i valori presi dal serial monitor:
Molta luce
24 Celsius, 75 fahrenheit -> 24 Max, 24 Min Valore luminosita' = 823
23 Celsius, 73 fahrenheit -> 24 Max, 23 Min Valore luminosita' = 825
23 Celsius, 73 fahrenheit -> 24 Max, 23 Min Valore luminosita' = 826

luce normale e molto bassa
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 306
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 309
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 306
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 20
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 17
23 Celsius, 73 fahrenheit -> 23 Max, 23 Min Valore luminosita' = 43



Code: [Select]
int pin = 1; // analog pin
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;

int Fotoreistenza = 0;     // Utilizzo del pin 0 per la lettura dei valori del fotoresistore.
int Valore = 0;        

void setup()
{
 Serial.begin(9600); // start serial communication
// analogReference(INTERNAL);
}

void loop()
{
 
 
for(i = 0;i<=7;i++){ // gets 8 samples of temperature
// samples[i] = ( analogRead(pin) * 110.0) / 1024.0;     // se uso internal
 samples[i] = ( 5.0 * analogRead(pin) * 100.0) / 1024.0;
 tempc = tempc + samples[i];
delay(500);

}


tempc = tempc/8.0; // better precision
tempf = (tempc * 9)/ 5 + 32; // converts to fahrenheit

if(tempc > maxi) {maxi = tempc;} // set max temperature
if(tempc < mini) {mini = tempc;} // set min temperature

Valore = analogRead(Fotoreistenza );

Serial.print(tempc, DEC);
Serial.print(" Celsius, ");

Serial.print(tempf,DEC);
Serial.print(" fahrenheit -> ");

Serial.print(maxi,DEC);
Serial.print(" Max, ");
Serial.print(mini,DEC);
Serial.print(" Min ");

tempc = 0;

Serial.print("Valore luminosita' = ");
Serial.println (Valore);          


delay(1000); // delay before loop
}

menniti

@ Leo: grazie, segnalazione interessante, bisognerebbe solo capire se l'indicazione vale per tutte le schede di Arduino o solo per alcune; questa info mi torna utile per lo studio che sto facendo; comunque in queste prove NON stiamo usando l'EXTERNAL, quindi per ora il problema non si pone.

@ Format: a me non piace affidarmi completamente alle informazioni di chi dice che non ha risolto un problema, specialmente per il fatto che il problema di per sé non ha alcuna logica, a meno che non si scopra che l'LM35 in presenza di luce cominci a dare i numeri, e a me non risulta. Purtroppo non avevo letto bene la tua risposta iniziale sull'ARef ed avevo capito che l'ARef non ce l'hai ed hai invece l'IORef, ecco perché ti chiedevo la versione di scheda che hai; ora Leo mi ha chiarito la cosa e non c'è più bisogno che tu risponda. Ho sempre ignorato la parte della precisione dell'LM35 che si raggiunge con tanti diversi accorgimenti ed è cosa nota. A me pareva che il problema fosse far lavorare assieme un LDR e un LM35. Sembra che invece tu, fidandoti di quanto afferma qualcun altro, ora ti sia rassegnato e non voglia andare oltre mentre io cerco di farti fare delle prove, visto che per la rassegnazione c'è tempo.
Però se tu sei felice così, figurati io.  :)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

format

Quote
Sembra che invece tu, fidandoti di quanto afferma qualcun altro, ora ti sia rassegnato e non voglia andare oltre mentre io cerco di farti fare delle prove, visto che per la rassegnazione c'è tempo.
Però se tu sei felice così, figurati io.


Io non mi sono rassegnato, il problema è che sono poco esperto e ho bisogno del vostro aiuto, però non so fino a che
punto posso rompervi l'anima....
Al contrario, se posso fare altre prove sono disponibile

menniti

anine non ne puoi rompere, tranquillo ;), ti chiedo solo di lasciar perdere l'altro link, almeno finché non capiamo esattamente come stanno le cose.
Allora si continua:
Attualmente l'LDR è collegata a tra 5V e il pin analogico, mentre tra pin analogico e GND c'è una R da 10k, giusto?
Abbiamo appurato che il pin ARef esiste e trovi effettivamente 1,1V quando imposti INTERNAL, giusto?
Bene, a questo punto devi lasciare INTERNAL, scollegare l'LDR dalla linea rossa dei 5V (4,60V) e collegarla all'ARef; visto che l'ARef è già impegnato con un C da 100nF (giusto?), fai una cosa semplice:
Porta con un cavetto il segnale ARef su un punto libero della Bread; collega su questo punto il C da 100nF verso la pista blu (GND) e sempre su questo punto collega il capo dell'LDR che prima era sui 5V.
Scrivi lo sketch in modo da avere un parallelo tra Temperatura e "Luce" e poi gioca con la luce, come hai sempre fatto, partendo dal buio fino ad arrivare al massimo, così cerchiamo di stabilire se e con quale valore di luce la temperatura inizia a dare i numeri. Tu l'hai già detto ma a me interessa capire che succede ora alimentando l'LDR a 1,1V invece che a 5V circa.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

menniti


@ Leo: grazie, segnalazione interessante, bisognerebbe solo capire se l'indicazione vale per tutte le schede di Arduino o solo per alcune; questa info mi torna utile per lo studio che sto facendo; comunque in queste prove NON stiamo usando l'EXTERNAL, quindi per ora il problema non si pone.

Ho approfondito, il problema NON è passare da INTERNAL ad EXTERNAL; lì sta spiegando che il riferimento di tensione interno dell'ADC, in presenza di una tensione >5V applicata all'ARef inevitabilmente brucia il micro. Poi chiarisce che c'è una pull-down (la cosa si deduce dal calcolo successivo) di 32k. MI sono fatto un'idea da approfondire sul data-sheet: secondo me questa 32k viene usata nel partitore per ottenere gli 1,1V dell'INTERNAL, mentre dall'altro capo al 99% c'è una 64k collegata ai 3,3V che, contrariamente ai 5V (provenienti in genere dall'USB) sono molto più stabili, in quanto presi dall'uscita del regolatore. Allora si ha: VInternal = 3,3V * 32k / (32k+64k) = 1,1V interessante come ipotesi no? Questa soluzione, alternativa ad un preciso e specifico integrato regolatore a 1,1V per me sarebbe avvalorata dal fatto che nelle mie prove ho riscontrato anche tensioni da 1,09V sull'ARef INTERNAL, cosa che non si verificherebbe mai su un regolatore di precisione, mentre potrebbe accadere su un regolatore standard a 3,3V che potrebbe variare senza particolari drammi a 3,27V.
A parte questa parentesi la R da 5K è una sorta di limitatore e diventa il ramo positivo del partitore, il cui ramo negativo è la 32K, quindi NON sarà mai possibile applicare un riferimento PRECISO di 5V all'ADC, in quanto tale valore non può essere aumentato e il partitore 5k+32k inevitabilmente lo diminuirà a VExternal = 5V * 32k / (32k + 5k) = 4,3243V, quindi se servono 5V l'unica è quella di usare un'alimentazione esterna per Arduino, attivare la DEFAULT e misurare sull'ARef che tensione c'è, quindi rifare la scala sulla base di quel valore.
Grazie Leo, sei una fonte di informazioni preziose.... XD
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Questo è quanto riportato sul datasheet (par. 23.5.2):
Quote
AVCC is connected to the ADC through a passive switch. The internal 1.1V reference is generated
from the internal bandgap reference (VBG) through an internal amplifier. In either case, the
external AREF pin is directly connected to the ADC, and the reference voltage can be made
more immune to noise by connecting a capacitor between the AREF pin and ground. VREF can
also be measured at the AREF pin with a high impedance voltmeter. Note that VREF is a high
impedance source, and only a capacitive load should be connected in a system.
If the user has a fixed voltage source connected to the AREF pin, the user may not use the other
reference voltage options in the application, as they will be shorted to the external voltage. If no
external voltage is applied to the AREF pin, the user may switch between AVCC and 1.1V as reference
selection. The first ADC conversion result after switching


Qui si dice esplicitamente che se c'è una tensione esterna sul pin AREF, non bisognerebbe usare le altre fonti perché si potrebbero mettere in corto. Ecco perché sul Reference dicono di metterci una R, così che in caso si faccia il passaggio fra internal ed external possa scorrere poca corrente.

format

Quote
Scrivi lo sketch in modo da avere un parallelo tra Temperatura e "Luce" e poi gioca con la luce, come hai sempre fatto, partendo dal buio fino ad arrivare al massimo, così cerchiamo di stabilire se e con quale valore di luce la temperatura inizia a dare i numeri


che dici va bene così?? XD XD

22.24 Celsius, Valore luminosita' = 13
22.02 Celsius, Valore luminosita' = 10
21.91 Celsius, Valore luminosita' = 11
22.13 Celsius, Valore luminosita' = 13
22.02 Celsius, Valore luminosita' = 20
22.13 Celsius, Valore luminosita' = 288
22.13 Celsius, Valore luminosita' = 287
22.24 Celsius, Valore luminosita' = 286
22.13 Celsius, Valore luminosita' = 287
22.13 Celsius, Valore luminosita' = 289
22.24 Celsius, Valore luminosita' = 787
22.34 Celsius, Valore luminosita' = 786
22.24 Celsius, Valore luminosita' = 786
22.34 Celsius, Valore luminosita' = 785
21.91 Celsius, Valore luminosita' = 786
22.02 Celsius, Valore luminosita' = 785

con e senza condensatore non cambia nulla, io lo collego così
sulla fila dove c'è 1.1V ho messo un ponticello sull'alimentazione della fotoresistenza (dove c'erano i 5V) e sempre su questa fila ho messo
un piedino del condensatore e l'altro messo a GND

Non ci posso credere in rete nessuno ha risolto questo problema...complimenti....

menniti

direi che va bene ;), la "rete" non è certezza, come ti dicevo, il fallimento di uno NON può e NON deve essere il fallimento di tutti, specialmente quando i problemi non hanno una logica.
Praticamente, settando INTERNAL l'ADC ha come riferimento per le misure 1,1V
l'LM35 lo stai alimentando a circa 5V ma non ha importanza in quanto, generando 10mV/°C, a 100°C avresti 1V, quindi sei abbondantemente nel range.
Invece l'LDR, che è una resistenza variabile in funzione della luce (in modo inversamente proporzionale), molto rapidamente supera 1V, se la alimenti a 5V, e quindi probabilmente manda in "palla" l'ADC, evidentemente questa cosa poi influenza anche la lettura dell'altro pin (e qui bisogna approfondire le info date dal buon Leo XD).
Noi non abbiamo fatto altro che alimentare l'LDR a 1,1V così questa è la massima tensione che può arrivare al pin analogico, restando nel range, così ogni sensore lavora regolarmente e non distrba l'altro.
Hai visto che hai fatto bene a fidarti? Ora puoi andare in giro sulla "rete" a pontificare e spiegare come risolve il problema, diventerai una sorta di eroe $).
Però dobbiamo levarci un ultimo dubbio: non riesci a tirar fuori una fonte di luce tale da far salire le letture dell'LDR a circa 950-1000 così siamo sicuri che non ci siano altri problemi?

@ Leo: ora studio bene cosa hai postato
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

menniti


Questo è quanto riportato sul datasheet (par. 23.5.2):
Quote
AVCC is connected to the ADC through a passive switch. The internal 1.1V reference is generated
from the internal bandgap reference (VBG) through an internal amplifier. In either case, the
external AREF pin is directly connected to the ADC, and the reference voltage can be made
more immune to noise by connecting a capacitor between the AREF pin and ground. VREF can
also be measured at the AREF pin with a high impedance voltmeter. Note that VREF is a high
impedance source, and only a capacitive load should be connected in a system.
If the user has a fixed voltage source connected to the AREF pin, the user may not use the other
reference voltage options in the application, as they will be shorted to the external voltage. If no
external voltage is applied to the AREF pin, the user may switch between AVCC and 1.1V as reference
selection. The first ADC conversion result after switching


Qui si dice esplicitamente che se c'è una tensione esterna sul pin AREF, non bisognerebbe usare le altre fonti perché si potrebbero mettere in corto. Ecco perché sul Reference dicono di metterci una R, così che in caso si faccia il passaggio fra internal ed external possa scorrere poca corrente.

OK, allora la generazione della tensione di 1,1V avviene mediante un altro metodo, però non ci interessa, quella funziona a modo suo e ci si può solo adeguare, al limte misurandola. Quindi il vero problema è, come dici tu, che non si può passare al riferimento interno se c'è una tensione esterna sull'ARef in quanto andrebbero in corto tra loro e si rischia di danneggiare il circuito che eroga 1,1V; se il pin ARef è libero nessun problema a commutare tra INTERNAL (1,1V) e DEFAULT (AVCC). Quindi il suggerimento della R in serie all'EXTERNAL si può ignorare, almeno nel mio caso, basta spiegare come stanno le cose e come si devono eseguire, poi sai come la penso nei confronti di quelli che avendo delle rpecise e corrette istruzioni tra le mani decidono di fare di testa propria :smiley-yell:
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Sì, è così. Il problema sorge sul cambio fra INTERNAL ed EXTERNAL. Usando DEFAULT non ci dovrebbero essere problemi.

Ho solo precisato perché mi pareva ad un certo punto di aver letto che il salto veniva fatto fra interno ed esterno, non verso default. Forse ho letto male.

Go Up