Salve a tutti,
Nel libro compreso nell'arduino starter kit, mi dicono che quando leggo del valori da un ingresso analogico devo mettere un delay di una 15 di millisecondi per dare al convertitore analogico digitale il tempo di convertire. Ora... Io ho un progetto in cui ho un display lcd, e con questo delay il display balla tutto! Ahahahah, come posso fare? E' davvero necessario un delay così grande?
E' la prima volta che sento questa cosa, il delay toglilo del tutto, semmai puoi usare tecniche come una serie di 20 letture e poi calcoli la media, per assorbire piccole differenze, poi ci sono metodi come l'utilizzo di una tensione di riferimento esterna precisa e stabile o anche quella interna da 1,1V, tutto dipende da cosa devi leggere.
"The Analog-to-Digital Converter con only read so fast, so you should put a small delay at the very end of your loop(). If you read from it too frequently, your values will appear erratic."
Questo è quanto riportato dal libro in questione! Tolgo del tutto? O lascio delay(1) per stabilità? ![]()
Vorrei poter misurare dal pin VIN, la tensione della batteria. Tra l'altro, come faccio dato che sono 9 volt e arduino arriva a 5 in lettura?
Pensavo a una resistenza!
Grazie della risposta! ![]()
delay(1) basta e avanza, anche se forse non serve nemmeno quello, visto che dopo ogni analogRead si presume che tu faccia anche altre cose.
Vorrei poter misurare dal pin VIN, la tensione della batteria. Tra l'altro, come faccio dato che sono 9 volt e arduino arriva a 5 in lettura?
Pensavo a una resistenza!
forse e' il caso di metterne due, visto che vuoi fare un partitore di tensione
utility per il calcolo
http://www.raltron.com/cust/tools/voltage_divider.asp
e che c'entra il pin Vin ??
devi usare uno degli ingressi analogici
Si, faccio altre cose, e già solo per stampare la percentuale in maniera precisa (in base a quanti caratteri ha il numero) l'Arduino impiega dagli 1 ai 2 millisecondi. Quindi! ![]()
Parlavo del pin Vin, perchè la tensione che voglio misurare è quella in output da lì! Forse mi sono spiegato male! ![]()
Ti ringrazio per la risposta e i link, ora gli do un occhiata, e nel caso di dubbi riscrivo qui!
Un delay prima di chiamare la funzione oppure subito dopo è inutile. ![]()
Questo perché la funzione analogRead attende finché il dato relativo alla lettura non è pronto, dopodiché restituisce il dato. Fermare il programma prima di fare la lettura o dopo che l'hai fatta non influisce sulla stessa.
Attende che la lettura sia completata!?!?! E allora ritardo solo la velocità di risposta così, perchè anche interpellando un adc a tutta manetta senza altre istruzioni in un loop, se lui "mi mette in attesa" fino a lettura completata non cambia niente!! Siamo sicuri di questo? O devo provare?
Dimmi cosa cambia
a = analogRead(A0);
delay(100);
a = analogRead(A0);
a = analogRead(A0);
delay(100);
La funzione analogRead viene chiamata e poi il programma torna all'istruzione successiva quando ha finito la lettura.
Tutto quel che metti prima o dopo è eseguito al di fuori della lettura. Guardati il codice di analogRead nel core di Arduino.
Come ho già tentato di spiegare il problema semmai dipende da letture inesatte dovute alla variazione della VReference che, se non l'ha settata diversamente, è legata alla non stabilissima tensione della porta USB, quindi il buon vecchio metodo di fare un ciclo continuo di 20-30 letture e calcolare poi la media aritmetica restituisce risultati piuttosto affidabili.
Fare 20-30 letture ogni volta che devo leggere un valore, non influisce sulle prestazioni secondo voi? Cioè, per quello che devo fare penso vada anche bene, parlo in linea teorica. E per quanto riguarda mettere il delay, effettivamente, col senno di poi, non serve a niente. ![]()
Non ti resta che provare, 20-30 letture non sono nulla, in temrini di tempo, poi bisogna rapportarlo a ciò che devi fare, comunque sia il "tempo reale" non esiste, quindi ti conviene valutarne gli effetti:
1 - crea un loop una lettura-scrivi valore sulla seriale
vs
2 - crea un loop con un ciclo for per fare 30 letture di seguito, sommale tra loro, infine dividi il totale per 30, poi scrivi il risultato sulla seriale
valuta la differenza di tempo ma anche la stabilità di lettura e poi trova il miglior rapporto
@Lorenzo:
come ti è stato detto, dipende anche dalla precisione che vuoi ottenere. E dall'impedenza del segnale d'ingresso: se è maggiore di 10K, conviene fare più letture sequenziali perché il circuito dell'ADC potrebbe impiegarci più tempo del previsto a caricarsi (è tarato per impedenze max di 10K appunto).
Per quanto riguarda il post di Michele, mi chedo che significa "Il "tempo reale" non esiste"!
Per quanto riguarda Leo, che significa con un impendenza maggiore di 10K? Cos'è l'impendenza??! Ragazzi, ho iniziato a studiare elettronica da poche settimane, non potete dirmi cose in linguaggi così tecnici! Ahahahah!
Intendo dire che, seppur a micro o millisecondi, il tempo scorre inesorabilmente, a colpi di clock, qui parliamo di pochi MHz e non di diversi GHz, quindi devi comunque adeguare il modo di pensare alle prestazioni del micro, che sono comunque di tutto rispetto. Se non dovessero bastarti devi ricorrere necessariamente ad un ADC esterno al micro.
Riguardo la domanda sull'impedenza ti dò un consiglio: so che è più facile scrivere una domanda che fare una ricerca su google ma se inizi a fare domande su ogni "virgola" che ti si scrive diventa difficile continuare a darti supporto, c'è tanta gente che aspetta risposte e io personalmente ne cerco tante anche per me, chiaro il messaggio? ![]()
Chiarissimo, solo, dato che ho inziato questa discussione preferivo chiarire tutti i miei dubbi (e tutti quelli che come me hanno iniziato da poco) qui, così da non disperdere troppo le informazioni! Comunque ti ringrazio! Alla prossima. ![]()
Se dai un'occhiata al Topic "Link utili" che ho aperto nella sezione MegaTopic, troverai una marea di roba, ad iniziare da piccole lezioni on-line di elettronica, una sana lettura ti eviterà molte domande.
Ti ringrazio per il consiglio, anche se sto già studiando elettronica e programmazione! ![]()