Monitorare celle 3S

Ciao a tutti,

ho girato in lungo e in largo per il web ma alla fine ne sono uscito con le idee più confuse di prima...
vengo subito al sodo:

il mio progetto comprende un Arduino micro (5V), un driver (DRV8825), uno stepper da 17,un display da 3,2 TFT e il tutto dovrebbe essere alimentato da un pacco batteria da 12V...

la mia intenzione sarebbe quella di farmi un "pacco batteria" utilizzando delle 18650 e fin qui nessun problema (speriamo) però vorrei monitorare le singole celle per non andare sotto il punto di non ritorno

gentilmente potreste indicarmi una soluzione per fare tutto ciò?
o meglio io ho abbozzato questa strada ma vorrei sapere se va bene e se ci sono altre strade:

partitore:
Cella 1 diretta
Cella 2 R1 10K R2 10k
Cella 3 R1 20K R2 10k

e questo è il codice che ho reperito qui sul forum (grazie mille) e sul quale ho fatto alcune modifiche:

void setup() {
 Serial.begin(9600); //Start serial connection with computer

}

void loop () {

 int Cella1 = analogRead(A0);
 int Cella2 = analogRead(A1);
 int Cella3 = analogRead(A2);

 float Voltage1;
 float Voltage2;
 float Voltage3;

 // Cella1

 Voltage1 = Cella1 * (5.0 / 1023.0);

 if (Voltage1 < Voltage_limite) {
   Voltage1 = 0;
 }

 float Volt_T = Voltage1;

 // Cella2

 Voltage2 = (Cella2 * (5.0 / 1023.0)) * 2 - Volt_T;

 if (Voltage2 < Voltage_limite) {
   Voltage2 = 0;
 }

 Volt_T = Volt_T + Voltage2;

 //Cella3

 Voltage3 = (Cella3 * (5.0 / 1023.0)) * 3 - Volt_T;

 if (Voltage3 < Voltage_limite) {
   Voltage3 = 0;
 }

 Volt_T = Volt_T + Voltage3;

 //conta il numero di celle
 int num_celle = 0;
 if (Voltage2 == 0) {
   num_celle = 1;
   goto fineconteggio;
 }
 if (Voltage3 == 0) {
   num_celle = 2;
   goto fineconteggio;
 }
 {
   num_celle = 3;
 }
 
fineconteggio :

 float media_celle;
 float Vmin_rif;
 float Vmax_rif;
 float carica_rimanente;

 Vmin_rif = 3.30;
 Vmax_rif = 4.20;

 media_celle = (Voltage1 + Voltage2 + Voltage3 ) / num_celle;
 carica_rimanente = (media_celle - Vmin_rif) / ((Vmax_rif - Vmin_rif) / 100);


 delay (5000);

 Serial.println("CELLA 1 " + String(Voltage1));
 Serial.println("CELLA 2 " + String(Voltage2));
 Serial.println("CELLA 3 " + String(Voltage3));
 Serial.println("CARICA RIMANETE " + String(carica_rimanente));
 Serial.println("------------------------------------");


grazie mille
Roberto

ciao 01 (scusa l'abbreviazione),

per cortesia inserisci il tuo codice tra i tag code (pulsante </> sopra le faccine)...per far ciò devi modificare il tuo post...thanks

ORSO2001:
ciao 01 (scusa l'abbreviazione),

per cortesia inserisci il tuo codice tra i tag code (pulsante </> sopra le faccine)...per far ciò devi modificare il tuo post...thanks

ops... si scusami... fatto

>0101001000: ... so che avevi un precedente "login", ma visto che NON ce ne è più traccia ed hai fatto un nuovo account, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di ri-presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO che, negli ultimi periodi, è stato in vari punti aggiornato. Grazie.

Guglielmo

gpb01:
>0101001000: ... so che avevi un precedente "login", ma visto che NON ce ne è più traccia ed hai fatto un nuovo account, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di ri-presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO che, negli ultimi periodi, è stato in vari punti aggiornato. Grazie.

Guglielmo

Ciao Guglielmo,
ok fatto!.

0101001000:
ok fatto!.

Grazie mille :grin:

Guglielmo

Per misurare la tensione delle singole celle di un pacco LiPo occorre usare tanti canali ADC quante sono le celle, quindi per 3 celle servono tre canali ADC, ovvero tre pin analogici di Arduino.
Non devi fare altro che usare idonei partitori resistivi in modo da ridurre la tensione dei singoli punti di contatto tra le celle ad una tensione minore di quella usata per l'alimentazione di Arduino, p.e. 5V, e fare la misura su tutti e tre i canali in sequenza, meglio se fai una media di più letture in sequenza.
Elimina quegli orrendi goto, da fucilazione in C, e scrivi una funzione dedicata, deve solo leggere i tre pin analogici, da richiamare ciclicamente nella loop.
Ovviamente la risoluzione della lettura dipende dal rapporto del partitore, pertanto alla fine ottieni valori utili al decimo di volt, non certo al singolo mV, per uso come controllo stato carica e celle va bene, non va bene per fare l'equalizzazione dove serve una precisione minima di 0.01 V.

Cosi al volo, solo un paio di dubbi ... dove se la tensione e' sotto il limite la metti a zero, poi non ti causa un'errore nella parte che conta le celle ? (nel senso che non le conti anche se presenti ma con valore sotto il limite) ...

Poi, quella variabile Volt_T, non mi sembra che la azzeri all'inizio del ciclo o da nessun'altra parte, quindi dopo il primo ciclo non continua a sommare valori sempre piu alti ai cicli successivi ?

(poi se Astro ti vede ad usar i goto, ti sgrida ... :D)
EDIT: troppo tardi, ti ha gia visto :smiley:

Ciao,
grazie mille per la risposta...

mi sono dimenticato di dire che sto già facendo dei test a banco e sia i partitori come da schema nel primo post...

Cella 1 diretta
Cella 2 R1 10K R2 10k
Cella 3 R1 20K R2 10k

per lo sketch non ho fatto altro che un copia incolla da uno preso in rete e siccome non sapevo se ero partito con il piede giusto l'ho lasciato per il momento così...
per modificarlo e metterci una media delle letture nessun problema

mi interessa solo sapere se va bene come inizio o c'è di meglio, come detto mi basta un controllo in sicurezza nulla di precisissimo...

AHHH visto che le resistenze saranno sempre collegate come potrei evitare che la batteria venga scaricata inutilmente?

grazie ancora
Roberto

Etemenanki:
Cosi al volo, solo un paio di dubbi ... dove se la tensione e' sotto il limite la metti a zero, poi non ti causa un'errore nella parte che conta le celle ? (nel senso che non le conti anche se presenti ma con valore sotto il limite) ...

Poi, quella variabile Volt_T, non mi sembra che la azzeri all'inizio del ciclo o da nessun'altra parte, quindi dopo il primo ciclo non continua a sommare valori sempre piu alti ai cicli successivi ?

(poi se Astro ti vede ad usar i goto, ti sgrida ... :D)
EDIT: troppo tardi, ti ha gia visto :smiley:

ciao grazie anche a te per il contributo...
come detto ho fatto un copia incolla per avere un punto di partenza
il codice è stato fatto da un'altro utente qui sul forum e lo ha elaborato con i consigli di altri
lo volevo solo testare...

Per ridurre la corrente di scarica, usa dei partitori con valori maggiori ... considera che, anche se in genere l'impedenza dei circuiti di ingresso analogici di arduino dovrebbe essere tenuta sui 10K, questo e' valido per misure di variazioni "veloci" ... tu devi monitorare una batteria sempre collegata, quindi se usi valori di alcune centinaia di kiloohm, anche diverse centinaia, poco cambia ... :wink:

Etemenanki:
Per ridurre la corrente di scarica, usa dei partitori con valori maggiori ... considera che, anche se in genere l'impedenza dei circuiti di ingresso analogici di arduino dovrebbe essere tenuta sui 10K, questo e' valido per misure di variazioni "veloci" ... tu devi monitorare una batteria sempre collegata, quindi se usi valori di alcune centinaia di kiloohm, anche diverse centinaia, poco cambia ... :wink:

si potrei usarli ma alla fine ho sempre un consumo che mi porterebbe nel tempo a scaricarle...

ma se usassi dei opto-isolatori come "interruttore" (ne ho svariati di 4N35) sarebbe un'idea malsana?

grazie ancora
Roberto

Si, perche' gli opto hanno un'uscita a transistor, che ha una sua caduta interna che falserebbe la lettura ... pero' potresti usare dei piccoli mosfet per segnali sui partitori, tipo BSS306N o simili, che avendo una RdsON di poche decine di milliohm, per le letture sarebbero ininfluenti ... anzi, con un'opportuna circuiteria ed un'amplificatore differenziale, potresti perfino creare un commutatore a mosfet, in modo da leggere una cella alla volta direttamente, ma questo aumenterebbe la complicazione circuitale ...

Etemenanki:
Si, perche' gli opto hanno un'uscita a transistor, che ha una sua caduta interna che falserebbe la lettura ... pero' potresti usare dei piccoli mosfet per segnali sui partitori, tipo BSS306N o simili, che avendo una RdsON di poche decine di milliohm, per le letture sarebbero ininfluenti ... anzi, con un'opportuna circuiteria ed un'amplificatore differenziale, potresti perfino creare un commutatore a mosfet, in modo da leggere una cella alla volta direttamente, ma questo aumenterebbe la complicazione circuitale ...

Ti ringrazio per il tuo continuo supporto...

si so che hanno "fame" e si mangiano qualcosina, volevo vedere se intanto è fattibile ed eventualmente potrei "compensare" con dei calcoli...

i Mosfet non gli ho mai usati (non sono un elettronico ma solo un modesto appassionato)
come andrebbero utilizzati?

grazie ancora
Roberto

Come "interruttori in serie", fra i partitori e le celle, ad esempio ... ma per semplificare ancora di piu il tutto, senza crearti da zero tutta la circuiteria, potresti usare un 4066, che contiene gia 4 "interruttori" cmos indipendenti all'interno (te ne serve uno per cella, quindi massimo 4 celle) ... anche se hanno una resistenza interna di 125 ohm, non dovrebbero causare problemi, basta ricordarsi che al massimo possono reggere 10mA, per cui si dimensiona il ramo verso massa per farcene passare massimo 5 o anche meno e via ... li piloti con un'uscita di Arduino, li usi per collegare le celle solo al momento in cui fai le letture, attacchi, attendi un'istante, fai tutte le letture, poi li "spegni", scollegando in pratica le celle dai partitori ... :wink:

Etemenanki:
Come "interruttori in serie", fra i partitori e le celle, ad esempio ... ma per semplificare ancora di piu il tutto, senza crearti da zero tutta la circuiteria, potresti usare un 4066, che contiene gia 4 "interruttori" cmos indipendenti all'interno (te ne serve uno per cella, quindi massimo 4 celle) ... anche se hanno una resistenza interna di 125 ohm, non dovrebbero causare problemi, basta ricordarsi che al massimo possono reggere 10mA, per cui si dimensiona il ramo verso massa per farcene passare massimo 5 o anche meno e via ... li piloti con un'uscita di Arduino, li usi per collegare le celle solo al momento in cui fai le letture, attacchi, attendi un'istante, fai tutte le letture, poi li "spegni", scollegando in pratica le celle dai partitori ... :wink:

Ciao,
scusa per il ritardo nel rispondere ma ero via nel WK...

ok per il 4066 (che non conoscevo affatto) gli ordino li provo e vi farò sapere...
intanto ho anche ordinato le resistenze al 1% dato che quelle al 5% mi causano errori nella lettura
grazie mille e a risentirci
Roberto

Ciao a tutti...
Dopo un bel po' mi è arrivato il 4066...
Ho fatto i vari collegamenti ma questo dopo pochi secondi si scalda parecchio e senza neppure alimentarlo...
Spiego meglio:
Ho ridotto al minimo i collegamenti ovvero ho collegato solo i tre capi del mio pacco batteria eppure dopo poco non si riesce a tenere il dito sopra...

Invece se faccio il passaggio contrario, ovvero passo dai partitore la temperatura del 4066 è accettabile... ma così non raggiungo il mio scopo...

Avete idee in merito per favore?
Grazie Roberto