Go Down

Topic: problema lettura su porte analogiche, arduino in fumo :-/ (Read 5 times) previous topic - next topic

MatrixGTI

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

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...  :smiley-roll-sweat:

MGuruDC

Che succede se lo fai funzionare con A5 scollegato?
Puoi farci vedere il software?
Ciao
Linux User #503422 | Linux Machine #414597-8 | Ubuntu User #30132

Michele Menniti

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.
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

MatrixGTI

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

Code: [Select]
  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


Code: [Select]
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)


superlol

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
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

MatrixGTI

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

Code: [Select]
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

astrobeed


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.

MatrixGTI

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.

leo72

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.

astrobeed


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.


Testato

#10
Aug 21, 2011, 11:06 am Last Edit: Aug 21, 2011, 11:18 am by Testato Reason: 1
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.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

MatrixGTI

#11
Aug 21, 2011, 07:12 pm Last Edit: Aug 21, 2011, 07:14 pm by MatrixGTI Reason: 1
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.

Testato

#12
Aug 21, 2011, 08:59 pm Last Edit: Aug 21, 2011, 09:03 pm by Testato Reason: 1
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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

MatrixGTI

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 :-(

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 :-)




Michele Menniti

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. :D
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