Buongiorno.
E' il mio primo post e spero di averlo messo nella sezione giusta.
Ho riscontrato un problema con l' acquisizione di un segnale sui PIN analogici.
Devo leggere una tensione che va da 24V a 75V continui. A livello HW ho realizzato il circuito che permette di avere una tensione di 1V quando questa tensione è 0V e di 2,5V quando la tensione e' 75V in maniera lineare.
La tensione che esce da una serie di operazionali è pulita e stabile ma quando la mando sul piedino analogico di arduino quello che esce sono valori che si spostano anche di 200 dal valore che dovrei avere. Faccio un esempio:
ho 1,876V su A2 e ARDUINO dovrebbe leggere 2561. Li legge ma il valore che mi da (che viene letto ogni secondo) si sposta anche di 200 in più o in meno senza mai stabilizzarsi.
Ho settato il convertitore ADC interno a 12BIT e messo una tensione su Aref di 3,000V (stabili anche quelli) e spostato la resistenza interna per abilitare il valore Aref esterno come riferimento del convertore (e toglierlo dal +3,3V interno).
Tutte le tensioni sono stabili sia misurandole con tester che con oscilloscopio.
Sull'ingresso analogico ci sono, verso massa, una resistenza da 4,7K e un condensatore da 0,1uF e la tensione arriva da un operazionale nella configurazione BUFFER.
Le alimentazioni sono stabili e sono +-5V e +-12V che servono per gli operazionali e arrivano da dei convertitore DC\DC collegati a una tensione costante fornita da un batteria. Non c'è collegamento a terra se non quando collego il cavo di programmazione a porta di ARDUINO. Inizialmente alimentavo ARDUINO con il +5V ma l' assorbimento mi sbilanciava il +-5V e allora lo ho collegato al +12V su pin Vin e non dal jack.
Dubitavo della scheda ARDUINO e allora ne ho usato un altro ma avevo solo un ARDUINO MEGA2560 e caricando il programma si comporta come ARDUINO DUE (ho tolto il comando che impostava il convertitore a 12BIT lasciando il suo a 10BIT)
Ho visto vari argomenti sull'argomento ma non sono riuscito a risolvere. A livello HW posso dire che è tutto OK (almeno a misurare) ma non riesco a risolvere questo problema.
Prova a misurare nelle stesse condizioni una batteria da 1,5 V, stacca gli operazionali e tutto il resto e misura solo quella. Se la misura è stabile o cambia di poco (una fluttuazione di 2/3 valori è normale) la causa va ricercata esternamente, altrimenti è l'ADC che subisce altri disturbi. Nel caso, talvolta è più semplice (e più stabile) usare un ADC esterno.
Domani provo. Faccio prove nel tempo libero a lavoro.
Comunque mi sono dimenticato di dire che ho provato a staccare gli operazionali nelle prove e mettendo A2 a massa mi dava correttamente 0 e mettendo a 3,000 mi dava 4095 stabili. Valori intermedi solo prendendo il valore di 1V (1,089V) che mi serviva per l' OFFSET bypassando tutti gli operazionali ma mi faceva lo stesso problema.
Un ADC esterno dovrei averlo. Tra vario materiale "obsoleto" avanzato negli anni.
La fluttuazione non è problematica , poi tramite SW metto soglie e un isteresi per stabilizzare il valore. Oltre a fare una media di più letture scartando quelle troppo diverse.
Ho fatto la prova con una batteria e il valore letto non oscilla più (molto meno comunque nell' ordine di 4/5 totali).
Ora devo vedere perche' con le uscite degli operazionali mi fa questo errore. Le tensioni che misuro con tester e oscilloscopio sono precise e non si muovono.
E comunque, per avere un' escursione del valore letto di 200 come mi accade dovrei avere una fluttuazione di 3/4096x200 = 0.146V rispetto al valore che metto (fluttuazione che non ho). Al massimo ho visto uno spostamento di 0,002V.
L'uscita degli operazionali hanno tutti una resistenza verso massa di almeno 10K e un condensatore minimo di 0,1uF.
Altra prova che ho fatto è mettere la pila in ingresso all' operazionale BUFFER con l' uscita collegata ad A2 e legge correttamente. Sembra la parte prima a non funzionare bene ma le tensioni sono corrette.
Senza vedere uno schema ed il layout della realizzazione è difficile fare una diagnosi, comunque prova a misurare la differenza tra il GND della scheda ed il GND degli operazionali, a volte il problema può essere li.
Ho misurato la tensione tra le masse ed è 0.002V stabili. Forse però ho trovato qualche cosa.
per i riferimenti di offset uso uno stabilizzatore regolabile TL431 con regolazione presa su +5V per portarla a +3,3V e funziona ma la corrente che gli facevo passare dentro era di 0.14A mentre da datasheet dava massimo 0.1A. Ora provo a cambiare le resistenze di limitazione e i tL431.
Per lo schema non lo ho ancora riportato su PC in bella ma ho solo abbozzi su carta. Mentre per la realizzazione ho costruito tutto sulla classica millefori per fare il prototipo.
Appena riesco a rifarli in "bella" li metto senza problemi.
E' il sistema che uso anch'io, solo che poi rimango sempre nella fase di prototipo...
Nella mia ultima realizzazione mi sono scontrato con un problema simile, questa è la scheda:
è un carico fittizio programmabile, mi succedeva che alimentato da USB tutto funzionava perfettamente, invece con l'alimentazione esterna (12V, necessaria per varie cose) avevo sempre delle false letture sugli shunt. Durante le prove ho notato che togliendo l'operazionale dallo zoccolo il problema spariva, perchè l'assorbimento dell'AO bastava a "sollevare" leggermente il GND da dove anche l'ADC fa la lettura. Ho risolto aggiungendo un altro GND verso il modulo dell'MCU.
Ho sostituito resistenze e stabilizzatori. Ho provato anche a mettere un rinfonrzo su GND con un filo grosso (1,5mmq) ma il risultato non cambia. La cosa strana è che se prendo un riferimento prima del BUFFER degli offset la lettura è abbastanza stabile (si sposta di circa 10). Se prendo lo stesso riferimento dopo il BUFFER la lettura diventa instabile. Su tutti e 3 gli offset che mi servono per 3 differenti letture.
I riferimenti li porto direttamente su A2 di ARDUINO.
Buongiorno.
Ho parzialmente risolto. Su un' altra scheda avevo fatto uno stabilizzatore con TL431 che mi serviva per adattare i livelli logici da 0/+3.3V a 0/+5V per pilotare un display (la maggior parte dei display funzionano anche con 0/+3.3V ma ogni tanto danno risultati strani, facendo questo adattatore di livello funzionano sempre) ma avevo messo una resistenza per limitare la corrente sulla caduta di tensione troppo bassa. Assorbendo di più c'era una corrente che (probabilmente) passando dalla massa sporcava in qualche modo il segnale.
Ora, sistemando quella parte di circuito e facendo passare una corrente molto più bassa (circa 1/10) la lettura si sposta di +-10 dal valore che dovrei aspettarmi. Decisamente più accettabile. Ora rivedo quei circuiti con TL431, non vorrei fosse sfuggito qualche cosa di altro e continuo a testare.
Chiedo perchè è il mio primo post. Devo spostare o dire che è risolto in qualche modo?
Comunque, facendo scorrere meno corrente limiti il problema, ma non lo elimini. Se per i tuoi scopi va bene, lascialo pure così, se fai una media di diverse letture il problema sarà risolto o quasi. Ma la soluzione ottimale probabilmente sta tra l'accopiamento dei GND di Arduino e del tuo circuito. Ho fatto questa veloce simulazione che evidenzia il problema:
R1 e R3 rappresentano la resistenza delle varie traccie del PCB, collegamenti,etc.
Come vedi, a seconda di dove viene letto il riferimento GND si hanno 3 letture diverse. Purtroppo non è un problema di così facile soluzione su un PCB millefori, su un PCB apposito con piano di massa il problema non si presenta (o quasi).
IN effetti penso sia un problema del genere. Infatti il problema si è molto ridotto ma comunque c'è instabilità. A volte oscilla di +-10 ma a volte sale anche di +-50.
Temo di dover rivedere lo stampato. La fregatura è che a mettersi con tutti gli strumenti (oscilloscopio, tester e OHMetro per valori bassi) non trovo anomalie che possano dirmi dove si trova il problema.
Credo di dover passare a un altro sistema. Pensavo di usare un ADC esterno (al momento ho un ADC1205CCJ-1) ma se non cambio tipo di stampato non credo di poter ottenere grandi differenze.
A rinforzare la massa o accorciare le piste si ottiene qualche miglioramento ma c'è sempre un' instabilità di fondo. Anche la scheda in se potrebbe creare problemi.
Altra possibile soluzione che mi viene in mente è l' uso di un circuito SIMPLE&HOLD. Lui legge la tensione che deve dare in pasto a ARDUINO ma non ci sarebbero le masse di mezzo (almeno in parte usando un S&H differenziale) mettendolo vicino ad ARDUINO e facendogli fare la lettura dopo aver bloccato il segnale. Ma ho qualche dubbio.
Nel caso tu sia orientato verso un adc esterno forse ti conviene cercare qualcosa di un po più moderno, quello ti impegna come minimo più di 10 pin per collegarlo all'MCU, è lento e decisamento obsoleto. Un ADS1115, ad esempio, di cui trovi con facilità la breakout board offre 16bit con riferimento interno preciso, un PGA per varie portate ed un collegamento I2C con solo 2 fili. Stesso discorso potrebbe valere, in via minore, per gli OA usati, l'LM324 è decisamente vecchiotto, oggi si può fare di meglio senza svenarsi.
Ciao, Ale.
Edit: dimenticavo, l'ADS1115 può effettuare letture differenziali, il che magari ti può aiutare se il GND è instabile.
Direi di si. La velocità non è una cosa essenziale. Alla fine ipotizzavo di fare 1 o 2 letture al secondo. Ma sono vecchiotti anche se funzionanti. La questione PIN l' avevo sottovalutata. Anche perche' le letture analogiche che deve fare sono 3 quindi avrei dovuto mettere anche un multiplex analogico per poter usare il convertitore ADC1205CCJ-1. Gli operazionali so che sono vecchiotti ma ne ho cassetti pieni che uso ancora per revisionare vecchie schede e ho optato per quelli. Posso sempre cambiarli, il PINOUT è abbastanza standard con la maggior parte degli operazionali moderni.
Ho visto che come ADS1115 ci sono anche delle schede già fatte con solo i pin da collegare. Possono essere affidabili o è meglio andare solo sull' integrato e fare il circuito esternamente?
Non metto link per evitare pubblicità ma si trovano queste schede già fatte.
PS. nonostante abbia ARDUINO DUE alcuni PIN non avevo intenzione di usarli e sono difficilmente utilizzabili su scheda. Eventualmente mi pare che i PIN analogici potevano lavorare come ingressi/uscite digitali. E' giusto?
Ti conviene optare per queste, sono abbastanza piccole di dimensioni e si possono integrare bene su un PCB (se guardi la foto al post#8 la vedi!). Io l'ho usate in un paio di progetti, e per funzionare funzionano. Nell'ultimo però, quello della foto, l'avrei barattato volentieri per un altro ADC, anche 12 bit ma SPI... vabbè, la prossima volta.
Veramente un link te l'ho già messo io sopra!
In genere si, però ho lavorato poco con il DUE, non mi ricordo se c'e qualche eccezione specifica.