problema lettura su porte analogiche, arduino in fumo :-/

La prima cosa che ho pensato è stata effettivamente un errore nelle connessioni, il partitore è realizzato esattamente come da schema e le resistenze sono esattamente dei valori riportati , infatti inzialmente avevo previsto resistenza da 500K e 400K per avere un divisore intero ma il mio fornitore aveva disponibili nel formato che volevo (SMD 0602) solo 510 e 402.
Ho verificato accuratamente il cablaggio e le tensioni in uscita e sono come dovrebbero essere... almeno per quanto posso misurare con un tester. Pero' non credo possano esserci sorprese se la sorgente è una batteria la cui tensione non credo possa salire oltre i valori nominali se non di qualche decimo di volt.
Fatto questo ho pensato ad un difetto della prima board Arduino e l'ho sotituita con una nuova di pacca, dopo qualche ora di funzionamento il problema si è ripresentato come descritto, cioè la prima board eaveva la parte ADC completamente inutilizzabile e la seconda invece solo su A5.

per completezza allego lo schema completo ma la parte di lettura analogica non è legata ad altro.

Uploaded with ImageShack.us

Se escludiamo per un momento il problema hardware mi viene da pensare al software, magari qualcosa di particolare tipo la lettura sequenziale e veloce di tutte le porte ADC.. pero' immagino che ci siano decine di progetti dove questa cosa viene fatta e i vari codici che ho visto, compreso il tutorial sul wiki, è fatto allo in maniera simile alla mia.

Ora sono nel dubbio perchè mi spiacerebbe rovinare un'altra scheda,anche perchè essendo smd non ho modo di sostituire solo il micro, e la board nano non è che sia proprio economica :confused:

Testato:
dico la mia,
e' vero che il datasheet parla di connettere circuiti con impedenza sui 10K, ma al fine di caricare in tempi ragionevoli l'RC di ingresso. Usare impedenze piu' alte fa scorrere meno corrente e quindi tempi lenti di risposta.
Ma il tuo e' un circuito con tempistioche lentissime quindi no problem.
il datascheet riporta infine un valore di resistenza di ingresso di 100Mega

Le entrate analogiche sono costruite nel seguente modo: C'é un unico convertitore A/D che viene collegato tramite un multiplexer analogico alle 6 / 8 entrate analogiche del ATmega.
Il convertitore carica un condensatore (sample and hold) per convertire la tensione e per evitare che la tensione cambi durante la conversione visto che il convertitore non é paralello.
Per caricare tael condensatore serve una corrente. Una fonte di segnale da misurare che ha una impedenza troppo alta non fa che il condensatore si acichi alla tensione giusta percui leggi sbaglaito.

Ciao Uwe

ciao MatrixGTI
Ci sono alcuni punti che non mi sono chiari.

  • Se misuri tra i pin 5V e s A5 e anche tra massa e A5 una tensione cosí bassa dovresti avere un corto tra 5V e amssa che non hai perché dici che il Arduino funziona.
  • Se hai 5V sull uscita A5 direi che hai un errore nel programma e lo stai usando come uscita. Ma anche in quel caso con un partitore resistivo non dovresti essere riuscito a rotto niente.
  • Perché devi controllare le tensioni di tutte le celle della Batteria LIPO?
  • Se hai una batteria LiPo da 6 celle (ne hai 6 contatti da leggere la tensione) dovresti avere 25,2V. Col partitore 510 kOhm - 100kOhm dovresti avere 4,2 V

Per proteggere le entrate A1 a A5 metti tra pin analogico e partitore una resistenza da 1kOhm e un Zener da 4,7V tra il punto di unione del 1kOhm e il partitore per diminuire la tensione dell abatteria verso massa. In questo modo sei sicuro che delle sopratensioni verranno bloccate dal diodo zener.
Il pin A0 é particolare perché non hai messo un partitore e percui non puoi mettere un zener direttamente. devi mettere una resistenza da 1kOhm in seria a una da 10kOhm. La 1k va a A0 e la 10k alla Batteria: in mezzo tra la due resistenze metti il diodo zener verso massa. Queste resistenze sono abbastanza piccole da non disturbare la lettura e abbastanza grandi da proteggere le Uscite.
Ciao Uwe

uwefed:

Testato:
dico la mia,
e' vero che il datasheet parla di connettere circuiti con impedenza sui 10K, ma al fine di caricare in tempi ragionevoli l'RC di ingresso. Usare impedenze piu' alte fa scorrere meno corrente e quindi tempi lenti di risposta.
Ma il tuo e' un circuito con tempistioche lentissime quindi no problem.
il datascheet riporta infine un valore di resistenza di ingresso di 100Mega

Le entrate analogiche sono costruite nel seguente modo: C'é un unico convertitore A/D che viene collegato tramite un multiplexer analogico alle 6 / 8 entrate analogiche del ATmega.
Il convertitore carica un condensatore (sample and hold) per convertire la tensione e per evitare che la tensione cambi durante la conversione visto che il convertitore non é paralello.
Perfetto, hai confermato esattamente quello che ho detto, e visto che il circuito per un po' di tempo funziona regolarmente e solo dopo si rompe, la questione impedenza e' da scartare.

Per caricare tael condensatore serve una corrente. Una fonte di segnale da misurare che ha una impedenza troppo alta non fa che il condensatore si acichi alla tensione giusta percui leggi sbaglaito.

Ciao Uwe

esatto, ed aggiungendo il fatto che per un determinato periodo il tutto funziona, non ha senso seguire la strada dell'impedenza.
sono daccordo con gli altrui punti evidenziati, ed il consiglio degli zener e' una bellissima idea.

Uwe,
Non ti so spiegare il perchè ma ho ricontrollato di nuovo le misure e ho pochi Ohm sia tra +5 e A5 sia tra A5 e GND, quindi è quasi in corto ma arduino funziona lo stesso, forse perchè alimentato via USB c'è un limite di corrente ?

Le celle Lipo le devo monitorare perchè devo evitare che una cella scenda sotto il voltaggio critico di 3V. Se per ipotesi monitorassi solo la tensione dell'intero pacco non potrei sapere se una cella è scesa piu' delle altre oppure sono scese tutte e 6 in maniera uniforme.

Per il discorso dell'impedenza ho un dubbio, per le ore che il sistema ha funzionato correttamente io leggevo circa 855 come ADC sugli ingressi, la batteria era carica al massimo quindi se non sbaglio 855 * 5/1023 = 4,17 V che è in linea con quello che leggo realmente all'uscita del partitore ( diciamo da 4.1 a 4.2 V ).

L'idea dello zener mi piace e se riesco a trovare posto sulla board li mettero', ma sinceramente ancora non mi spiego come il guasto sia avvenuto.

Se il problema fosse software...
Domanda:

I Pin analogici non devono essere dichiarati come Input come avviene per i Digitali ? Se si qual' è la procedura corretta ?

MatrixGTI:
Quindi escludi che il problema dell'impedenza possa aver causato il guasto ?

L'impedenza vista dal ADC crea problemi solo a livello di precisione se è troppo alta, non rompi nulla nemmeno se colleghi l'input dell'ADC direttamente ai 5V.

Ergo A5 è in corto sul +5 e a GND :frowning:

Questo non è possibile perché altrimenti sarebbe in corto l'alimentazione stessa, dato che alimentando la scheda il tutto funziona salvo A5 è
ovvio che non c'è nessun corto tra Vcc e GND.
Senza poter verificare le cose direttamente è molto difficile fare una diagnosi, però ritengo molto probabile che hai qualche problema sul pcb, p.e. piste/isolamento/saldature difettosi che mettono in corto direttamente A5 con la tensione della batteria senza passare per il partitore quando il pcb flette.

i pin sono dichiarati bene altrimenti non ti funzionerebbe.
Non dimentichiamoci che il circuito funziona per molt0o tempo. solo in secondo momento si guasta, quindi saltano anche le ipotesi di pcb difettosa.
metti gli zener ed investi i un'altra arduino. la tua difettosa la compro io a meta' prezzo :slight_smile:

Testato:
non ha senso seguire la strada dell'impedenza.

La questione impedenza d'ingresso invece è molto importante, Atmel ha almeno una ventina di Application Note su questo punto dove si "sgola" a spiegare perché deve essere minore di 10k se vuoi usare più di un canale per volta e devi fare misure veloci, cosa che ho ampiamente spiegato in altro thread.
Nel caso in questione non c'è nessun problema di velocità in quanto il fenomeno da misurare varia lentamente, ma c'è il problema che si usano più canali ADC, e dato che l'ADC vero è proprio è solo uno se l'impedenza d'ingresso è maggiore, e in questo è enormemente maggiore, di 10k non puoi leggere in modo corretto le differenze di tensione tra canali.

Testato:
quindi saltano anche le ipotesi di pcb difettosa.

Mai visto un circuito che funziona benissimo per ore/giorni/mesi e poi non appena lo tocchi va tutto in fumo ? Io ne ho visti anche troppi e la causa è sempre un difetto del pcb o delle saldature.

Intanto grazie a tutti per le rapide e precise risposte.

A questo punto ho pensato di procedere in questo modo:

  1. Monto un nuovo nano sulla board e senza collegare la batteria al partitore verifico che A5 non sia a +5V ( nel caso significa che nel SW c'è qualcosa che non va )

  2. Cambio l'intero PCB con uno nuovo ( ne ho 3 identici non saldati ) e provo con un alimentatore da laboratorio a dare le tensioni che avrei sulla batteria ai vari ingressi leggendo cio' che mi ritrovo all'uscita del partitore, magari provando a flettere leggermente la scheda, se i valori sono tutti intorno ai 4.2 V allora installo il Nano nuovo e dovrebbe funzionare tutto.

  3. Se il problema non si ripresenta allora significa che ho fatto due errori simili su due board diverse e posso solo picchiare la testa al muro, se invece succede di nuovo dopo un periodo di funzionamento corretto allora mi tocca rifare il PCB da 0 aggiungendo gli zener come giustamente consigliato ( logico che se posso evitare di rifare i PCB il mio portafogli è piu' felice )
    Ma rimane comunque il dubbio sul perchè sia successo.

Non posso escludere a priori un doppio errore di disattenzione, però ci tengo a precisare che lavoro con un metodo preciso, la batteria è impacchettata e isolata da tutto, il connettore di bilanciatura arriva sulla scheda su un connettore per evitare errori di inversione etc, il pcb è montato su una basetta con 4 torrette e non subisce stress meccanico etc.
Questo per dire che l'errore è sempre possibile ma ho fatto il possibile per evitarlo... :slight_smile:

MatrixGTI:

  1. Monto un nuovo nano sulla board e senza collegare la batteria al partitore verifico che A5 non sia a +5V ( nel caso significa che nel SW c'è qualcosa che non va )

Ottieni i 5V su A5 solo le setti esplicitamente come OUT e ci scrivi sopra uno stato logico HIGH, altrimenti per default è un input ad alta impedenza.
Per caso hai disponibile un oscilloscopio ?
Se la risposta è si controlla se il driver dei led genera degli spike ad alta tensione, possono farlo, se ci sono possono essere loro la causa della dipartita di A5.

astrobeed:

Testato:
non ha senso seguire la strada dell'impedenza.

La questione impedenza d'ingresso invece è molto importante, Atmel ha almeno una ventina di Application Note su questo punto dove si "sgola" a spiegare perché deve essere minore di 10k se vuoi usare più di un canale per volta e devi fare misure veloci, cosa che ho ampiamente spiegato in altro thread.
Nel caso in questione non c'è nessun problema di velocità in quanto il fenomeno da misurare varia lentamente, ma c'è il problema che si usano più canali ADC, e dato che l'ADC vero è proprio è solo uno se l'impedenza d'ingresso è maggiore, e in questo è enormemente maggiore, di 10k non puoi leggere in modo corretto le differenze di tensione tra canali.

Non sto' dicendo che non e' importante ma solo che non e' la causa del problema attuale, e quindi non serve mettere mano ai partitori perche' nonostante sia molto maggiore di 10k funziona bene, la lettura e' precisa.
Quindi il problema e' da un'altra parte, voterei a questo punto anche io per la tua idea di pcb difettosa.

Dunque,
Nel codice non dichiaro A5 come output, ora mi viene un dubbio amletico, per pilotare il mosfet che stacca il carico usco il pin digitale 5

Dichiarato come:

int enable = 5;

pinMode(enable, OUTPUT); // SETTO IL PIN 5 COME OUTPUT PER PILOTARE IL MOSFET

e gestito lo stato come

digitalWrite(enable, LOW); //apro il circuito di alimentazione

digitalWrite(enable, HIGH); //chiudo il circuito di alimentazione

Questo non dovrebbe modificare lo stato di Input del pin A5 ?

Per avere il pin A5 come output dovrei dichiarare "enable" come A5 e non 5

Testato:
Non sto' dicendo che non e' importante ma solo che non e' la causa del problema attuale, e quindi non serve mettere mano ai partitori perche' nonostante sia molto maggiore di 10k funziona bene, la lettura e' precisa.

Io non ho detto che l'impedenza è la causa del guasto, ho detto che con quei valori l'ADC funziona male, le letture che fa sono inattendibili, ti faccio un esempio pratico:
Se le sei celle stanno tutte a una tensione molto simile l'ADC legge i cinque valori tutti uguali +/- 2 count del suo errore tipico, ed è la condizione standard.
Se una cella comincia a scaricarsi molto di più delle altre, p.e. cinque sono a 4.00 V e una è a 3.02 V questo'ultima viene letta come un valore molto prossimo a 4.00V perché il sample and hold del ADC non può caricarsi al nuovo valore di tensione abbastanza in fretta per via della elevata impedenza d'ingresso.

Ottieni i 5V su A5 solo le setti esplicitamente come OUT e ci scrivi sopra uno stato logico HIGH, altrimenti per default è un input ad alta impedenza.
Per caso hai disponibile un oscilloscopio ?
Se la risposta è si controlla se il driver dei led genera degli spike ad alta tensione, possono farlo, se ci sono possono essere loro la causa della dipartita di A5.

Purtroppo non ho un oscilloscopio disponibile, il drive che sto usando è questo : http://www.taskled.com/hboost.html , non so se possa creare spike ad alta tensione.

MatrixGTI:
int enable = 5;
pinMode(enable, OUTPUT); // SETTO IL PIN 5 COME OUTPUT PER PILOTARE IL MOSFET

Come buona norma di programmazione evita di usare variabili intere (16 bit = 2 byte di preziosa ram) per definire un pin, usa le define che non sprecano memoria e non sono alterabili da nulla.

#define  enable 5

pinMode(enable, OUTPUT);

e gestito lo stato come

Per utilizzare i pin analogici tocca indicarli come A0-A5 oppure come valori numerici tra 14 e 19.

Inzialmente usavo il #define ma mi cambiava dei testi nel codice se contenevano la variabile dichiarata, comunque è un consiglio prezioso perchè non sapevo che non utilizzasse ram. :slight_smile:

Ciao,

ho guardato la discussione e, come dice Astrobeed, io guarderei meglio il circuito.
Le resistenze che usi, se ho capito bene, sono SMD.

Hai fatto le misure all'uscita del ripartitore per controllare che la saldatura degli SMD non crei problemi?

Ciao,
Marco.

Si, tutte lemisure le ho fatte sul pcb con le R montate. A questo punto puo' essere un problema legato al Drive che fa salire la tensione della batteria con degli spike tali da bruciare la porta del micro dietro 500k di R ?

Astro stiamo dicendo la stessa cosa, lavoriamo solo in modo diverso :slight_smile:
Se mi si fulmina A5 non sto' a guardare l'impedenza del partitore. Per non far andare fuori strada il collega nemmeno la nomino.

Rosolto il problema si dice: oltre a questo ci sarebbe anche a-b-c-d, cosi' come ad esempio ora hai dato il consiglio del define, che e' ottimo, ma per come lavoro io non l'avrei nominato. Perche' nulla centra con il problema.

Poi logicamente ognuno fa come cavolo vuole :slight_smile:

Visto che non c'e' oscilloscopio monta gli zener come consigliato e si attende la diagnosi postuma. Se funziona ci sono degli spikes, da dove provengono lo si potra' solo supporre ma almeno il problema e' risolto, se invece si riguasta si continua.