Problema con analogRead

Non vedo nel setup l'assegnazione degli ingressi analogici.

Se non lo fai, è normale che tu debba effettuare una "lettura a vuoto", poiché con essa Arduino capisce che quell'ingresso è di input.

cyberhs:
Non vedo nel setup l'assegnazione degli ingressi analogici.

Se non lo fai, è normale che tu debba effettuare una "lettura a vuoto", poiché con essa Arduino capisce che quell'ingresso è di input.

Se si usano i pin analogici come ingressi appunto analogici, non è necessario dichiarare i pin come input usando pinMode dato che questo controlla l'ingresso digitale del pin e non l'ADC, che viene agganciato al pin in oggetto dalla funzione analogRead.

@d407376:
esiste una modalità di lettura, descritta nel datasheet, detta "Free Running Mode", in cui si possono eseguire più letture una dietro l'altra. Se però in questa modalità si cambia canale (cioè pin letto), la prima lettura dopo il cambio di canale rispecchierà il canale precedente e solo quella successiva sarà riferita al nuovo canale.
Ora, analizzando l'analogRead dell'Arduino mi pare che sia impostata proprio questa modalità per cui il problema riscontrato potrebbe essere dato da questo. Quindi la lettura a vuoto per ricalibrare l'ADC è necessaria affinché esso cambi canale correttamente.

pinMode per i pin analogici sò che non va usato, come ha detto leo.

leo72:
@d407376:
esiste una modalità di lettura, descritta nel datasheet, detta "Free Running Mode", in cui si possono eseguire più letture una dietro l'altra. Se però in questa modalità si cambia canale (cioè pin letto), la prima lettura dopo il cambio di canale rispecchierà il canale precedente e solo quella successiva sarà riferita al nuovo canale.
Ora, analizzando l'analogRead dell'Arduino mi pare che sia impostata proprio questa modalità per cui il problema riscontrato potrebbe essere dato da questo. Quindi la lettura a vuoto per ricalibrare l'ADC è necessaria affinché esso cambi canale correttamente.

Grazie, ho capito il perchè :wink:
Mettendo un analogRead() a vuoto prima non è un grand problema, ma se si volesse mettere non in free running sarebbe possibile?
Questa modalità riguarda proprio l'altmega o come è scritta la funzione?

d407336:
se si volesse mettere non in free running sarebbe possibile?
Questa modalità riguarda proprio l'altmega o come è scritta la funzione?

La risposta semplice è no. Devi cambiare il core dell'Arduino ed ovviamente poi tutto quello che fa uso dell'analogRead non funzionerebbe più per come era stato inizialmente pensato per cui lascia perdere. :wink:

ok
un'altra cosa, se all'interno del programma metto analogReference(INTERNAL) per leggere da un pin, poi rimetto analogReference(DEFAULT) per leggere da un altro pin e lo faccio in continuazione non ci sono problemi?

d407336:
ok
un'altra cosa, se all'interno del programma metto analogReference(INTERNAL) per leggere da un pin, poi rimetto analogReference(DEFAULT) per leggere da un altro pin e lo faccio in continuazione non ci sono problemi?

Non collegare nulla al pin AREF, però.

no, non collego niente :wink:
chiedevo solo per sapere se fare continuamente queste operazione è troppo "stressante" per l'atmega

Ha ragione Leo quando dice che non è indispensabile usare il pinmode per gli ingressi analogici, ma io lo uso lo stesso per attivare o disattivare il resistore interno.

Cosa ne fai delle resistenze Pullup nei ingressi analogici? Sbagli la misura visto che creii un partitore resistivo tra impedenza del segnale che leggi e la resistenza pullup che é tra 20k e 50kOhm.
Ciao Uwe

uwefed:
Cosa ne fai delle resistenze Pullup nei ingressi analogici? Sbagli la misura visto che creii un partitore resistivo tra impedenza del segnale che leggi e la resistenza pullup che é tra 20k e 50kOhm.
Ciao Uwe

non ho capito a cosa ti riferisci...

d407336:

uwefed:
Cosa ne fai delle resistenze Pullup nei ingressi analogici? Sbagli la misura visto che creii un partitore resistivo tra impedenza del segnale che leggi e la resistenza pullup che é tra 20k e 50kOhm.
Ciao Uwe

non ho capito a cosa ti riferisci...

Si riferisce a cyberhs, che abilita le pull-up interne ma legge il pin in modo analogico. Non ho idea di come lavori arduino internamente, ma a basso livello si può scollegare la porta digitale condivisa con quella analogica, lasciando collegato solo il circuito di conversione AD, se arduino fà la stessa cosa allora abilitare le pull-up non porta alcuna differenza in quanto vengono scollegate dal pin.

Ciao.

No, l'Arduino non disabilita i buffer digitali sui pin analogici quando fa la lettura analogica.

leo72:
No, l'Arduino non disabilita i buffer digitali sui pin analogici quando fa la lettura analogica.

Ok, ora lo so, quindi rimane il quesito posto da uwefed nei confronti di cyberhs. Mi rispondo da solo, se al pin collegni un NTC verso GND eviti di usare una R serie fisica per il partitore.

Ciao.

Per UWE.
Nell'ultima applicazione (complessa) che ho fatto ho dovuto usare i pin analogici come semplici ingressi digitali e mi faceva comodo avere il resistore di pullup interno.

Per la verità ho usato anche un ingresso analogico con il pullup per alimentare una misura di resistività dell'acqua (una semplice sonda metallica con un pin a massa) che se bagnata riduceva la tensione sull'ingresso analogico.

MauroTec:

leo72:
No, l'Arduino non disabilita i buffer digitali sui pin analogici quando fa la lettura analogica.

Ok, ora lo so, quindi rimane il quesito posto da uwefed nei confronti di cyberhs. Mi rispondo da solo, se al pin collegni un NTC verso GND eviti di usare una R serie fisica per il partitore.

Ciao.

Visto che le resistenze pullup interne sono moooolto inprecise ( il datasheet parla di resistenza tra 20kOhm e 50 kOhm) non hai una lettura calibrata, ma differete tra ATmega e Atmega e tra entrata e entrata. Se si deve fare solo una lettura grossolana dove devi misurare 2 punti molto differenti come il sensore di liquido che descrive cyberhs puó funzionare, ma con NTC per leggere una temperatura non funziona.

Ciao Uwe

ma quindi posso o no usare due pin analogici come se fossero digitali e altri pin analogici poer leggere un valore correttamente?

d407336:
ma quindi posso o no usare due pin analogici come se fossero digitali e altri pin analogici poer leggere un valore correttamente?

Sí puoi.
Non puoi usare le resistenze interne di pullup e pensare di leggere dei valori "calibrati" di ADC dalla entrata analogica.

Ciao Uwe

ok grazie