Go Down

Topic: Aumentare la risoluzione analogica di Arduino, un parere (Read 1 time) previous topic - next topic

Michele Menniti

Mar 20, 2011, 02:17 pm Last Edit: Mar 20, 2011, 02:20 pm by menniti Reason: 1
Salve,
l'idea nasce dall'esigenza di avere una risoluzione migliore di quella attuale (1/1024 di VRef), se interessa la problematica posso esporla a richiesta. Lo schema concettuale (manuale  :~) è molto semplice:
Con un banale partitore mi ricavo la metà della tensione massima, che applico, mediante la posizione di riposo dello switch (per semplicità ho messo un relé a doppio scambio) al pin ARef; sempre nella stessa condizione di switch invio la tensione da misurare al pin analogico A0.
Il comparatore, nel momento in cui rileva che la tensione è >VMax/2 cambia lo stato dello switch, di conseguenza su ARef ora viene applicata la VMax e la tensione da misurare va al pin A1.
In questo modo la risoluzione raddoppia, diventando di circa 2,4mV; inoltre il metodo si potrebbe estendere contemporaneamente a tutti i 5 pin analogici ottenendo una risoluzione di circa 1mV che non sarebbe male, non vi pare?
Non ho fatto prove, ho fatto qualche ricerca ma non sono riuscito a trovare niente che mi servisse, concettualmente dovrebbe andare, ma non so come la prende Arduino..., ecco perché, per non perdere tempo inutilmente, chiedo il vostro parere.
Se la cosa è fattibile avrò bisogno di un paio di dritte su Arduino e sulla parte elettronica, se non è fattibile consideratela un'occasione per augurarvi buona domenica.
Quindi, parafrasando il grande Gassman ne "L'armata Brancaleone", vi dico: «Miei prodi, sequitatemi o sputazzatemi!"
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed

A parte il fatto che l'ATmega 328p non ha la possibilità di inserire un offset per l'ADC, cioè ha solo Aref e non Aref+ e Aref-, col tuo sistema al massimo "raddoppi" la sensibilità per i primi 2.5V, mentre quando vai a misurare tensioni maggiori rimane quella solita.
Per raddoppiare la sensibilità degli ADC si ricorre a tecniche di oversampling, questa è una application note di Atmel che spiega come portare la risoluzione dell'ADC a 11 o 12 bit tramite questa tecnica, è consigliabile non superare i 12 bit anche se in teoria si può andare oltre.

Michele Menniti

Ciao astrobeed, grazie per la risposta, ho capito quanto mi dici sulla mia idea, in effetti sul pin 1A arriverebbe una tensione tra 2,5 e 5V, con riferimento a 5V, quindi in ogni caso userei solo i secondi 512 punti della scala.
Ho dato una prima occhiata al link, non ho grandissima dimestichezza con l'inglese, mi pare d'aver capito che il contatore, generato da un pwm di Arduino, serve per regolare la tensione sull'ARef.
Quindi realizzando questo semplice circuitino e modulando via software il duty cicle del contatore, in base alla lettura della tensione sotto test, posso ottenere quello che mi serve?
Da cosa dipende l'impostazione dei bit?
Ti chiedo gentilmente qualche indicazione tecnica sulla realizzazione, se non devi perderci troppo tempo, o altrimenti qualche chiarimento teorico in modo che mi faccio un minimo di idea prima di tentare di tradurre questa cosa.
Mi andrebbero benissimo 13 bit, ma anche a 12 potrei ottenere il mio scopo.
Grazie!
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed


Ho dato una prima occhiata al link, non ho grandissima dimestichezza con l'inglese, mi pare d'aver capito che il contatore, generato da un pwm di Arduino, serve per regolare la tensione sull'ARef.


Sei totalmente fuori strada, il circuito che immette il pwm sull'Aref tramite un filtro passa basso serve per simulare del rumore bianco se il segnale da campionare è purissimo.
La tecnica dell'oversampling per poter funzionare richiede la presenza del rumore sul segnale da analizzare, condizione normale visto che un segnale di grande purezza normalmente si ottiene solo da costosissimi generatori di laboratorio.
Concettualmente l'oversampling sfrutta l'incertezza stocastica della lettura effettuata dall'ADC per creare i bit mancanti, non ti sto ad elencare tutta la teoria (tanta) matematica che c'è dietro, trovi tutta la documentazione che vuoi con google, però prendi per buono (dimostrabile) che per ogni bit di incremento devi campionare 4 volte più veloce.
Esempio pratico se per il segnale che analizzi ti basta prelevare un campione al secondo per elevare la risoluzione a 11 bit devi campionare 4 volte al secondo, per elevare di due bit devi campionare 16 volte al secondo e così via.
Se vuoi ottenere 12 bit, e ti consiglio di non andare oltre, prendi 16 campioni consecutivi, li sommi tra loro e poi dividi il tutto per 4, in questo modo ottieni un valore compreso tra 0 e 4095 pari a 12 bit.
Per ottenere 11 bit acquisisci 4 campioni consecutivi, li sommi tra loro e dividi per 2.
Ovviamente l'oversampling impatta sulla massima velocità di campionamento, però se si utilizza la tecnica del roll average (buffer circolare per i campioni) è possibile fruttare la massima velocità di campionamento dell'ADC anche con l'oversampling, in questo caso si ha una perdita, accettabile, di precisione.


Michele Menniti

Quote
La tecnica dell'oversampling per poter funzionare richiede la presenza del rumore sul segnale da analizzare, condizione normale visto che un segnale di grande purezza normalmente si ottiene solo da costosissimi generatori di laboratorio.
Concettualmente l'oversampling .................... che per ogni bit di incremento devi campionare 4 volte più veloce.
Esempio pratico se per il segnale che analizzi ti basta prelevare un campione al secondo per elevare la risoluzione a 11 bit devi campionare 4 volte al secondo, per elevare di due bit devi campionare 16 volte al secondo e così via.
Se vuoi ottenere 12 bit, e ti consiglio di non andare oltre, prendi 16 campioni consecutivi, li sommi tra loro e poi dividi il tutto per 4, in questo modo ottieni un valore compreso tra 0 e 4095 pari a 12 bit.

Te lo sei scelto perfetto l'alias, sei proprio di un'altra galassia :smiley-eek:
Il concetto mi è chiaro, ma non ho idea di come realizzarlo praticamente  :smiley-red: Non so se puoi aiutarmi anche in questo, ma forse ci vuole troppo tempo... La tensione che misuro entra proprio nel range 0-5V con una risoluzione di 1mV (p.es. 2,213 - 2,215 devono essere valori diversi), le variazioni avvengono in un lasso di tempo piuttosto lungo, mediamente ogni 0,5-1 secondo, a volte però capita che da 1,234 passi di colpo a 4,567, anche se sono situazioni rare.
Ti ringrazio in ogni caso!
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up