Salve a tutti ragazzi. Ho un problema con le porte analogiche di Arduino Uno. Devo leggere la potenza tramite fotovoltaico. Ho fatto questo semplice codice:
float vl1=0;
float vl2=0;
float tens1=0;
float tens2=0;
float potenza=0;
float resistenza=4.5; //resistenza 4.5ohm
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
vl1=analogRead(A1); //tensione 1
vl2=analogRead(A0); //tensione 2
tens1=5*vl1/1024;
tens2=5*vl2/1024;
potenza= tens1*( (tens1-tens2)/resistenza );
if (potenza<0)
{
potenza=potenza*(-1);
}
Serial.println(potenza,6);
delay(200);
}
Quando leggo i valori con il monitor seriale, ottengo valori che variano senza motivo (vi allego l'immagine). Molto probabilmente il tutto è dovuto ad un rumore ( o lettura errata) dell'adc interno. Come posso risolvere il problema per riuscire a stabilizzare i valori?? Grazie a tutti per l'aiuto. Se può essere di aiuto anche quando metto tensioni stabili in ingresso, di 3V per esempio, oltre a leggere i 3V leggo per esempio 2.8V,3.2V. (allego anche lo schematico di come collego arduino al pannello fotovoltaico)
Leggi troppo velocemente i 2 ingressi, l'adc è uno solo che deve leggere tutti i pin analog, ha bisogno di un pochino di tempo per caricare il valore analog, convertirlo e passare al sucessivo scaricandosi per ricaricarsi il nuovo valore.
pablos:
Leggi troppo velocemente i 2 ingressi, l'adc è uno solo che deve leggere tutti i pin analog, ha bisogno di un pochino di tempo per caricare il valore analog, convertirlo e passare al sucessivo scaricandosi per ricaricarsi il nuovo valore.
Quindi mi consigli di mettere un delay tra un misura dell'analog e un'altra?
pablos:
Leggi troppo velocemente i 2 ingressi, l'adc è uno solo che deve leggere tutti i pin analog, ha bisogno di un pochino di tempo per caricare il valore analog, convertirlo e passare al sucessivo scaricandosi per ricaricarsi il nuovo valore.
Non è così, l'adc è perfettamente in grado di fare due letture consecutive su ingressi diversi a patto di rispettare le relative temporizzazione, pochi cicli macchina, e l'impendenza d'uscita massima ammessa per la sorgente, 10k.
Vedi qui i vari test che ho fatto a suo tempo per verificare la reale efficienza della analogread di Arduino.
cyberhs:
Di solito per ridurre il rumore si usa misurare più volte la stessa misura (diciamo 10 volte)
Sarebbe meglio farlo per una potenza di due perché in questo modo non serve fare una divisione per estrarre il valore medio, basta fare uno shift a destra, p.e. con 8 campioni si fa lo shift di 3 bit, operazione che richiede molti meno cicli macchina di una divisione.
se A1= 5v e A0 = 0v
letti così velocemente i valori caricati sulle var vl1 sarà +/- 4v e vl2 +/- 1.5v e non 5 e 0
distanziando le letture di un po' di cicli io ho risolto, il patto più che altro che l'hardware sia correttamente costruito
pablos:
letti così velocemente i valori caricati sulle var vl1 sarà +/- 4v e vl2 +/- 1.5v e non 5 e 0
distanziando le letture di un po' di cicli io ho risolto, il patto più che altro che l'hardware sia correttamente costruito
Ma assolutamente no, e l'ho pure spiegato perché non è così con tanto di misure reali, ovviamente si deve rispettare l'impedenza d'uscita massima ammessa dal ADC dei 328 altrimenti non avrai mai misure corrette.