ciao
ho montato una fotoresistenza come al solito (fotoresistenza - resitenza - pinA0)
e un termometro lm35 (piedino centrale ora in A4, prima era saldato su A1(spostato per il seguente problema))
se la fotoresistenza rimane al buio o luce ambientale indiretta, la temperatura viene letta bene
se la fotoresistenza ha una luce diretta e quindi valori alti, la temperatura viene influenzata e cresce il valore.
singolarmente funzionano, come mai c'è questo problema di tensione?
Potrebbe esser crosstalk, ma per quelle frequenze mi sembra strano, piu' che altro puo' essere rumore termico dovuto alla fotoresistenza, ma anche questo mi sembra esagerato. Una soluzione potrebbe essere quella di seguire i consigli su come costruire il filtro per gli ingressi ADC, l'hai fatto? Da dove e come alimenti arduino? E' una board arduino o e' un atmega su stampato?
ciao Uwe,
era questa, la recupero http://arduino.cc/forum/index.php/topic,36085.0/topicseen.html
ma è per un altro progetto.
se mi confermi, la nota che prendo dall'altra discussione è di non utilizzare il +5 e il gnd di arduino , ma di usare la linea principale di corrente per alimentare sia il termometro che la fotoresistenza.
stefanosky:
singolarmente funzionano, come mai c'è questo problema di tensione?
Il problema è dovuto all'elevata impedenza d'uscita del LM35 e il valore massimo d'impedenza richiesto dall'ATmega che è solo 10k.
Internamente all'ATmega c'è un solo ADC che legge il valore presente sul circuito di sample and hold che a sua volta viene commutato tra i vari ingressi.
Semplificando al massimo il sample and hold è a tutti gli effetti un condensatore che viene collegato al pin analogico per un certo tempo, su Arduino circa 0.1 ms, in modo da farlo caricare, dopo di che viene convertita dall'ADC la tensione ai capi di questo condensatore in un valore digitale.
Se l'impedenza d'uscita della sorgente da misurare è troppo alta succede che non riesce a caricare, o scaricare, il condensatore nel tempo durante il quale questo è connesso al pin.
Se utilizziamo un solo ingresso ADC con un segnale che varia lentamente nel tempo, come nel caso della fotoresistenza o del LM35, poco male perché comunque il condensatore raggiunge il valore desiderato anche se ci mette più cicli ADC invece di uno solo, quindi alla fine abbiamo lo stesso una lettura corretta.
Se utilizziamo due, o più, ingressi ADC uno dei quali connesso ad una sorgente con bassa impedenza, la fotoresistenza in piena luce, e uno ad alta impedenza, LM35, quando il sample and hold va a leggere l'ingresso con la sorgente ad alta impedenza non è possibile portare al giusto livello la tensione ai capi del condensatore (non basta la corrente) e questo da luogo alle misure sbagliate.
La soluzione ideale è collegare la sorgente ad alta impedenza tramite un opamp in configurazione voltage follower, nel caso del LM35, che è un device con tempi di risposta molto lenti, basta mettere in serie una resistenza da 1k e un condensatore da 100nf in parallelo sul pin d'ingresso e leggere il pin non più di una volta al secondo, stessa cosa per la fotoresistenza visto che quando riceve poca luce assume valori ben più alti di 10k.
@astrobeed: il tuo contributo è sempre di inestimabile valore !!
prendendo spunto dalla tua spiegazione ho spulciato il datasheet e ho trovato quello che hai detto nel paragrafo 24.6.1 a pag 259.
Quindi la soluzione può anche essere solo di diminuire il tempo di acquisizione? Ricordo che tempo fa scontrandomi con questo problema avevo risolto empiricamente (per puro caso andando a tentativi), acquisendo un lm35dz e una NTC ad intervalli di tempo di qualche secono l'uno dall'altro.
Purtroppo su Arduino il tempo di acquisizione è fisso, circa 10 kHz, è possibile cambiarlo agendo direttamente sui registri di configurazione dell'ADC, procedura non semplicissima, ma fattibile, però non è possibile portarlo a tempi molto bassi, p.e. 100 ms, come servirebbe in questo caso.
Se utilizzi un solo ingresso ADC, cioè il sample and hold lavora sempre su quello, il condensatore alla fine si carica/scarica al corretto valore anche se occorrono tot operazioni di sample, quindi dopo qualche ciclo ottieni lo stesso un valore stabile e corretto, vale solo nel caso di sorgenti con segnali che variano lentamente e la lettura deve essere frequente, p.e. 10 volte al secondo.
Però se devi usare più ingressi ADC anche leggendoli a distanza di secondi l'uno dall'altro se non tamponi con la resistenza e il condensatore le letture che ottieni saranno sempre sbagliate.
In pratica il condensatore in parallelo all'ingresso ADC fa da "scorta" di corrente per caricare quello del sample and hold, che è di pochi picofarad, la resistenza in serie lo ricarica durante gli intervalli tra le letture e disaccoppia la sorgente dal sample and hold.
Rimane sempre valido il consiglio di usare un banale amplificatore operazionale per disaccoppiare i sensori ad alta impedenza dagli ADC.
Comunque l'amplificatore operazionale deve essere uno del tipo Rail to Rail che ha come caratteristica di avere un range di uscita (valori della Vout) molto prossimo all'alimentazione.
Uno amplificatore è il CA3130 anche se con carichi alti non raggiunge al 100% la tensione positiva di alimentazione.
Ciao Uwe
@astrobeed grazie mille, veramente questa cosa proprio mi mancava, non avendo buone basi di elettronica.
piu tardi faccio un disegno per farti vedere se ho capito.
l' amplificatore operazionale è un IC, ma in questo caso basta una resistenza e un condensatore in quella configurazione, giusto?
se volessi aggiungere un sensore ad infrarossi? , nel senso ognuno avrebbe bisogno di un filtro per l'adc di arduino?
(quindi per usare una fotoresistenza, un termometro, un sensore)
ora capisco perchè ci sono le versioni in i2c di questi sensori ...
grazie
Comunque il problema non é dei sensori ma del convertitore A/C e del multiplexer del ATmega.
I sensori con I2C (o altre interfaccia digitale) hanno un convertitore interno e percui un uscita segnale digitale. In questo modo puoi avere una risoluzione maggiore del ADC del Atmega.
Ciao Uwe