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

Ciao a tutti,
Mi scuso per la serie di domande ma ultimamente stanno succedendo delle cose strane :confused:

Per il progetto della torcia subacquea già descritto nel thread sul Mosfet mi trovo ad affrontare questo problema.
Per leggere la tensione di ogni cella di una batteria ai Polimeri di Litio ho creato un partitore come da schema:

Uploaded with ImageShack.us

Il GND della batteria è già connesso al GND di Arduino perchè viene da essa alimentato (tramite DC/DC 12V)

Ai capi del partitore ho tensioni di circa 4.1 V come da calcolo sono corrette, il problema è che dopo un po' l'ingresso analogico 5 (quello che legge la somma delle 6 celle) smette di funzionare e addirittura diventa un output a 5V.. immagino perchè qualcosa si sia rotto.

Questo è successo su due schede nuove quindi escludo la casualità.

Io non capisco come sia possibile, se la tensione non sale mai oltre i 4.1V , che la porta si guasti.

C'è qualcosa che mi sfugge ?
E' necessario impostare la porta come input in qualche modo ?

Serve qualche componente aggiuntivo per salvaguardare la porta ?

Grazie 1000 per qualsiasi aiuto, vorrei evitare di bruciare il 3° micro... :cold_sweat:

Che succede se lo fai funzionare con A5 scollegato?
Puoi farci vedere il software?
Ciao

Tempo fa qualcuno aveva fatto danno con un "nano" solo perché era una versione alimentata a 3,3V e lui gli applicava segnali a 5V, hai verificato che il tuo sia effettivamente un circuito che lavora a 5V; in caso contrario è ovvio che bruci le porte se applichi 4 e passa volt.
Chiarito questo se il circuito lavora a 5v e temi che le batterie possano erogare tensione maggiore della nominale, potresti mewttere uno zener da 5,1V tra ogni porta e massa.

Dunque,
Arduino è a 5V e le celle Lipo per natura non superano i 4.2 V per cella, quindi all'uscita dei partitori non ho piu' di 4.2/4.3 V ( considerando anche gli errori delle resistenze che sono all' 1% ).
Non ho provato a scollegare A5 perchè pensavo fosse un caso che si sia bruciata propio quella porta, è altrettanto strano il fatto che ora ho +4.5V sul pin A5, chiaramente non ho piu' collegato nulla da quando ho riscontrato il problema.

Questa è la routine con cui leggo i Voltaggi

  int cell_1 = 0; //DEFINISCO IL PIN DI LETTURA DELLA CELLA 1
int cell_2 = 1;//DEFINISCO IL PIN DI LETTURA DELLA CELLA 2
int cell_3 = 2;//DEFINISCO IL PIN DI LETTURA DELLA CELLA 3
int cell_4 = 3;//DEFINISCO IL PIN DI LETTURA DELLA CELLA 4
int cell_5 = 4;//DEFINISCO IL PIN DI LETTURA DELLA CELLA 5
int cell_6 = 5;//DEFINISCO IL PIN DI LETTURA DELLA CELLA 6
void read_cells(){
        
  C1 = analogRead(cell_1);  //LEGGO LA CELLA 1
 
  C2 = analogRead(cell_2);  //LEGGO LA CELLA 1+2

  C3 = analogRead(cell_3);  //LEGGO LA CELLA 1+2+3

  C4 = analogRead(cell_4);  //LEGGO LA CELLA 1+2+3+4

  C5 = analogRead(cell_5);  //LEGGO LA CELLA 1+2+3+4+5

  C6 = analogRead(cell_6);  //LEGGO LA CELLA 1+2+3+4+5+6
  
  CS1 = smooth(C1); // medio 10 valori per stabilizzzare la lettura
  CS2 = smooth2(C2);
  CS3 = smooth3(C3);
  CS4 = smooth4(C4);
  CS5 = smooth5(C5);
  CS6 = smooth6(C6);

    if ( CS1 > 500 ) { CS1 = CS1; } // porto a 0 se il valore è inferiore alla soglia nel caso utilizzo meno di 6 celle
  else { CS1 = 0; }
  if ( CS2 > 500 ) { CS2 = (CS2 * 2) - CS1; }
  else { CS2 = 0;   }    
  if ( CS3 > 500 ) { CS3 = (CS3 * 3) - (CS2 + CS1); }
  else { CS3 = 0; }
  if ( CS4 > 500 ) { CS4 = (CS4 * 4) - (CS3 +CS2 +CS1);  }
  else { CS4 = 0; }
  if ( CS5 > 500 ) { CS5 = (CS5 * 5) - (CS4 + CS3 + CS2 + CS1);  }
  else { CS5 = 0; }
  if ( CS6 > 500 ) { CS6 = (CS6 * 6) - (CS5 + CS4 + CS3 + CS2 + CS1);  }
  else { CS6 = 0; }

  VoltageC = (CS1 + CS2 + CS3 + CS4 + CS5 + CS6)*5/1024;  //Calcolo il voltaggio totale come somma delle celle (da rifinire il moltiplicatore in base alle resistenze del partitore)

posta il codice intero, ogni volta va postato il codice intero perchè se in smooth c'è qualcosa di sbagliato ora non si sa, i codici a meno che non siano segreti industriali (ed in quel caso si presume che la gente di quel livello sappia risolvere i problemi) devono essere postati per intero

Super, il codice intero è lunghissimo perchè c'è la gestione del display che richiede molto codice. Non ho problemi a postarlo ma credo sia complesso da leggere (soprattutto perchè non sono un programmatore quindi l'ho scritto con una logica mia :-P)

Posto la funzione smooth che è l'unica che interessa la parte di lettura analogica

int smooth(int C1){

  total= total - readings[index];         
  readings[index] = C1; 
  total= total + readings[index];       
  index = index + 1;                    
  if (index >= numReadings) { index = 0; }    
  
  average = total / numReadings;      

  return average;  
}

la funzione si ripete identica per le 6 celle

MatrixGTI:
C'è qualcosa che mi sfugge ?
E' necessario impostare la porta come input in qualche modo ?

Come prima cosa utilizzi resistenze di valore troppo alto per i partitori, l'ADC del ATmega 328 vuole una impedenza d'ingresso non maggiore di 10 kohm per poter funzionare correttamente, con i tuoi valori leggi valori non corretti.
Imposta il primo partitore con due resistenze da 18k, per via del teorema di Thevenin la resistenza equivalente vista dall'ADC è pari al parallelo delle due resistenze quindi solo 9k, poi tutti gli altri a scalare usando come prima resistenza una 10k.
Altra cosa strana che vedo è AGND che su Arduino non c'è, esiste solo GND quindi se hai in un qualche modo separato le masse fammi vedere lo schema completo del tutto perché così non si capisce nulla.
Ultima cosa, sicuro che sull'ultimo partitore, quello su A5 i valori delle resistenze montate sono quelli previsti (sebbene non adatti), è un attimo sbagliarsi e con 25V in ingresso è un attimo friggere il pin.

Dunque,
la massa nello schema è unica, la libreria che ho trovato per eagle riportava AGND come pin di massa...
L'impedenza in ingresso maggiore di 10k è una novità per me, non sapevo ci fosse questo limite.
Pero' mi chiedo.. ok i valori letti potrebbero non essere corretti, ma si puo' bruciare una porta per un'impedenza alta ? o_O
Se ora mi da' +5V sull'input significa che è andata in corto con l'alimentazione internamente suppongo.
Sui voltaggi sono assolutamente sicuro, prima di collegare Arduino ho testato ogni singola uscita del partitore con la batteria completamente carica e leggevo valori nell'ordine di 4 / 4.1 V con un Fluke.

Un pin di un Atmega è dato per reggere fino a 6V max di tensione.

Cmq per verificare se il pin è andato, carica uno sketch banalissimo tipo il BLINK che non usa i pin analogici e poi misura se su quel pin hai sempre i +5V.

MatrixGTI:
Se ora mi da' +5V sull'input significa che è andata in corto con l'alimentazione internamente suppongo.

Controlla con il multimetro se tra A5 e Vcc c'è una resistenza diretta di poche decine di ohm, ovviamente con la scheda non alimentata e non collegata a nulla.

hai usato un arduino nano, cosi' come si legge dallo schema o hai usato componenti standalone ?
te lo chiedo per essere sicuro che tutti i piedini di massa e di alimentazione siano connessi insieme, come da schema del nano.

ho ricontrollato i calcoli dei partitori e sono buoni.

Ho usato un arduino nano "originale" a 5V,
Ora non ho modo di provare se fra A5 e VCC ho continuità, appena posso provo.

A questo punto mi chiedo due cose,

  1. Possibile che con un inpedenza maggiore di 10k sui pin fra A3 e A5 una porta si possa guastare al punto tale da andare in corto con VCC ?

  2. Volendo evitare il problema dell'impedenza che valori mi consigliate per il partitore ? Questi potrebbero andare ?

Cella 6 R1: 50K R2:10k
Cella 5 R1: 40K R2:10k
Cella 4 R1: 30K R2:10k
Cella 3 R1: 20K R2:10k
Cella 2 R1: 10K R2:10k
Cella 1 - senza partitore < 5V

Devo pero' considerare la corrente assorbita dal sistema, essendo un oggetto che per natura avrà la batteria connessa per mesi.

La resistenza verso massa dovrebeb essere uguale alle due in serie, quindi considerando la piu' piccola sono 20k che a 8.4 V fanno 0.0004 A e la piu' grande 0.0013 A , direi che è sufficentemente piccola per rimanere connessa per mesi.

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

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

Ho testato il nano guasto non connesso a nulla e non alimentato e questo è il risultato;

da A0 fino A7 ho impedenza >2000K verso Vin

Da A0 a A4 e da A6 a A7 ho impedenza >2000 k l'uscita +5V invece su A5 ho solo 2 ohm

Da A0 a A4 e da A6 a A7 ho impedenza >2000 k verso GND invece su A5 ho 0.1 ohm

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

il micro in ogni caso funziona, ho provato ad alimentarlo via USB con uno sketch semplice per leggere A4 e dimmerare il Led su D13 e il tutto funziona, logicamente su A5 ho 4.5 V in uscita... ho provato solo per qualche secondo perchè immagine che avere il +5 a gnd non faccia bene al già malandato nano :slight_smile:

Io credo che, come ti chiedeva già Astrobeed un po di post fa, bisognerebbe vedere l'intero schema elettrico, oppure "dubitare" del collegamento del partitore rispetto allo schema postato; a mio avviso è evidente che al pin A5 è arrivata una corrente ben maggiore di quella che può far passare una R da 510K, che peraltro è un valore un po' particolare (hai proprio una R di quel valore o l'hai ottenuta con serie/parallelo?). Ma se è esatta quel pin non si rompe nemmeno se invece di 25V gli rifili 1KG di TNT. :smiley:

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 ?