Lettura analogica non conforme su nodemcu e esp8266

Ciao a tutti. Sto cercando di capire il perche' il convertitore analogico digitale non restituisce esattamente quello che legge. Se invio sull'ingresso A0 di questi dispositivi una tensione di 170mv misurata costantemente con un voltmetro, ottengo 140mv in conversione. Le ho provate tutte, qualcuno sa il perche'?
Ovviamente tutti i calcoli di adattamento di tensione, il convertitore a 10bit, e tutto il contorno che ne segue e' stato considerato.

Grazie

Beh sicuramente qualcuno più esperto di me potrà risponderti ma direi che, primo, se hai 1024 livelli su 5V significa una risoluzione massima "teorica" attorno ai 5 mV. Secondo, c'è da considerare la velocità con la quale leggi il dato (che influsice anche sul multiplexer interno), la precisione dell'ADC interno, la stabilità della tensione di riferimento, eccetera. Per cui sempre "ad occhio" direi che tensioni così basse ci possa stare una (im)precisione sui 30 mV.

Se vuoi maggiore precisione, usa un ADC di maggiore precisione esterno come QUESTO (che non conosco e non te lo sto passando come "buono" ma è solo il primo che ho trovato in rete, meglio se fai anche tu una ricerca specifica).

Con 3,3V ottieni 1023? Fai una tabellina tensioni/letture per analizzare il problema.

pascal69:

The ESP8266 has a single analog input, with an input range of 0 - 1.0V. If you supply 3.3V, for example, you will damage the chip. Some boards like the NodeMCU have an on-board resistive voltage divider, to get an easier 0 - 3.3V range. You could also just use a trimpot as a voltage divider.

The ADC (analog to digital converter) has a resolution of 10 bits.

In pratica, su alcune schede (es. NodeMCU) hai un partitore fatto così:


... tienne conto per i calcoli (... e tieni conto della tolleranza dei componenti). Ad esempio, se vuoi misurare fino a 5V dovrai fare:


Guglielmo

Grazie a tutti per tutte le spiegazioni ma il problema e' un po' diverso.
Mi spiego meglio:
l'ESP8266 accetta all'ingresso del suo convertitore ADC massimo 1.06V e non 1V come illustrato nella maggior parte degli schemi elettrici che circolano. Ma anche se prendessimo per buono il massimo valore di 1V i conti non tornano.
Applicando sull'ingresso A0 170mV, considerando che abbiamo la risoluzione dell'ADC di 10bit, il calcolo e' abbastanza semplice. Se per 1V dovrei leggere 1023, perche' lo zero nel digitale viene contegiato quindi 1024 in realta' va da 0 a 1023, si deduce che:

tensione applicata sull'ingresso analogico * Vmax accettata in ingresso / 1023

che nel mio caso, applicando 170mV, dovrei leggere un valore equivalente a 166~, e non 140 come accade.

Con il NodeMCU il discorso si complica ancora di piu', a causa del partitore resistivo presente di default nel circuito, motivo per cui l'esempio e la prova del 9 l'ho voluta fare anche con l'ESP8266 nuda e cruda.

Questo e' il mio problema, sapere fino a che punto e' affidabile il convertitore ADC

Grazie
Pasquale

A parte che si divide per 1024, non 1023

Ma che affidabilità dai al tuo voltmetro?

1023 o 1024 non variano il risultato finale piu' di tanto, quindi mi va bene anche 1024.
l'affidabilita' che do al mio voltmetro e' abbastanza alta, considerato che la misura l'ho effettuata con piu' di un voltmetro, persino con il mitico 680R analogico comprato quando andavo a scuola ben 37 anni fa'....

e comunque per quel che e' 1024 valori non vuol dire che quando applichero' la massima tensione di 1Volt sull'ingresso ADC leggero' 1024, ma 1023, in quanto:

10 bit = 1024 valori = da 0 a 1023, cioe' 0b1111111111 = 1023 e non 1024

se leggessi 1024 i valori sarebbero 1025

quindi se leggo 1023 e divido per 1024 il mio 1Volt verra' letto come 0,9990234375Volt

anche 8bit sono 256 valori, ma 0xFF equivale a 255 come anche 0b11111111

pascal69:
quindi: tensione applicata sull'ingresso analogico * Vmax accettata in ingresso / 0b1111111111

Si, che in sostanza è quello che ti scrivevo nel post #1. Dato che la risoluzione è 1024 livelli (0-1023 appunto) con 5V si hanno circa 5 mV di risoluzione (in pratica basta dividere a mente per 1000 per avere il valore approssimato) mentre per 1V sarebbe 1mV. Ma la risoluzione non è significativa se non nel senso che è il valore "minimo teorico" tra un livello ed il successivo.

Sono ormai passati anni da quando studiavo queste cose, ma direi che, distinguendo comunque "risoluzione" da "precisione", devi considerare gli altri aspetti di cui parlavo come la precisione e tolleranza dei componenti, ad iniziare dalle resistenze, la precisione dell'ADC e la sua "velocità" (tanto più se, come su Arduino, siamo in presenza anche di un multiplexer), e tutte queste "incertezze" vanno tra loro moltiplicate. Inoltre ci sono anche altre considerazioni come la variazione nel tempo del segnale in ingresso e sue caratteristiche elettriche (resistive, capacitive, ecc.)

Per cui se, facendo un esempio "grossolano" (magari poco corretto ma è solo per capirci), abbiamo una precisione del 99.5% per via della risoluzione a 10 bit, del 90% (+/- 5%) di tolleranza delle resistenze del partitore, di un 95% dell'ADC (che non so quale sia, comunque), avremo in sostanza 0.9950.90.95=0.85 cioè un 85% di precisione.
Il che significa quindi che hai una variabilità massima della misurazione di circa il +/- 7-5% (0.15/2 assumendo che l'errore sia sempre simmetrico) che su 1V significano 150mV ossia +/-75 mV ripeto, massimi. Se quindi tu applicando 170 mV leggi 140 mV, quindi circa 30 mV in meno, a mio avviso rientri nella precisione dell'insieme partitore-circuiti-ADC.

In sostanza, secondo me se hai bisogno di una maggiore precisione devi usare un ADC esterno come quello che ti ho indicato, con caratteristiche compatibili con le tue esigenze.

Allora, se ne è parlato varie volte ...

... se si hanno 10 bit significa che si possono avere 1024 valori, quindi da 0 a 1023. Se si vanno a leggere alcuni datasheet, ad esempio quelli del ATmega328P, viene chiaramente spiegato che, in realtà:

Vref / 1024 è lo step e quindi ogni valore è pari a (Vref / 1024) x valore_fornito_ADC ... ovvero, raggiunto il valore di (1023 x step) oltre NON si può andare e questo è il valore massimo calcolabile ...da quello in poi si ha sempre 1023.

Quindi, come scritto nel suddetto datasheet, "0x3FF represents the selected reference voltage minus one LSB." ...

Ovvero, 1023 (valore massimo che può fornire con 10 bit) rappresenta Vref meno uno step (== meno 1 bit meno significativo) ... cosa, del resto, piuttosto ovvia ... se dividi per 1024 e moltiplichi per 1023 :grin:

pascal69:
... quindi se leggo 1023 e divido per 1024 il mio 1Volt verra' letto come 0,9990234375Volt

... esatto, dal valore 0,9990234375Volt in poi leggerai sempre 1023 :slight_smile:

Guglielmo

Buongiorno Gugliemo, a volte e' proprio tutto quello che gira intorno a un discorso che genera confusione.
La logica basilare che racchiude tutto cio' che hai esposto stabilisce che se posso ottenere il massimo valore equivalente a 1023, non posso dividere per 1024, perche' nella migliore ipotesi se ottengo 1023 e divido per 1024 non potro' mai ottenere l'elementare unita', ovvero 1.

Ho capito bene? Oppure non ho capito ancora niente?

pascal69:
Ho capito bene? Oppure non ho capito ancora niente?

No, infatti, NON potrai mai avere 1V, ma un bit di meno ... ed è chiaramente spiegato in molti datasheet (come ho riportato sopra, post #8) perché si divide per 1024 per avere lo step e si arriva però al massimo a 1023.

Guglielmo

... ho cancellato io una serie di post fuori luogo (... quattro per l'esattezza) atti solo ad innescare "flame" ... astenetevi o ... al prossimo applico un BAN.

Guglielmo

Io comprendo

Ma per la serietà del forum almeno segnaliamo che le misure si fanno con strumenti adeguati

Guglielmo e volessi applicare 1V e leggere 1V cosa dovrei fare?
Fammi un esempio pratico

Semplicemente NON puoi perché, per come funziona un ADC, ti da il valore massimo quando arriva allo (step x valore massimo binario).

Come ho già detto, nel caso del ADC a 10 bit, 1023 indica che sei arrivato all'ultimo gradino che va dal (valore massimo - un gradino) al (valore massimo ed oltre). :slight_smile:

E, se uno disegna una scaletta con il piano che rappresenta 0x000 s'accorge che disegnado i 1024 passi (incluso il piano) con il gradino 0x3FF NON arriva in cima, ma un gradino sotto :smiley:

Guglielmo

Qui c'è una bella trattazione sugli ADC:

… trattazione molto completa … con l’unico difetto di essere di 120 pagine :astonished:QUI una trattazione molto, ma molto più coincisa, in questo application note, di una ventina di pagine, dove, verso la metà, in una paginetta, fa vedere il comportamento di un ADC :grin: :grin: :grin:

Ovviamnete quella di Datman è ottima e abbondante e, per chi vuole specializzarsi nell’argomento, è molto completa !

Guglielmo

Per evitare di spaventare chi legge: nel documento a cui mi riferivo, pur essendo di 120 pagine in tutto, per il problema che stiamo trattando basta leggere le prime 20 pagine :slight_smile:

Datman:
Per evitare di spaventare chi legge ...

... invece, per spaventare chi legge :stuck_out_tongue_closed_eyes: , io ho recuperato tutti i 9 capitoli che compongono l'insieme pubblicato da "Analog Devices". Li ho messi tutti assieme in uno .zip che si può scaricare da QUI :smiley: :smiley: :smiley:

Sono un bel mattone, ma, per chi è interessato all'argomento, molto ben fatti :slight_smile: Grazie Datman !

Guglielmo

Si, ma io continuo a chiedermi il perche' le notizie ognuno deve darle a modo suo. Interpellando centinaia di pagine su internet la confusione che regna e' totale. Andando direttamente sul sito del produttore, che e' la parte piu' interessante, per quel che riguarda il 1024 o 1023, viene riportato questo:

https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/peripherals/adc.html

Tralasciando che ormai si e' capito che l'ADC di questi dispositivi e' completamente inaffidabile. Certuni lo paragonano a un ADC a 7bit, per quel che riguarda la precisione, ed era proprio quello che volevo sapere.

Grazie a tutti per tutte le delucidazioni che mi hanno indirizzato ad effettuare le corrette ricerche del caso

Pasquale