Torna alla visione normale della pagina
Questa è una pagina ottimizzata per la stampa - Torna alla pagina normale

Ricarica delle batterie alcaline. Fase 2: data logger e caricatore

Circuito di test e ricarica batterie alcaline

Per eseguire dei test si è reso necessario costruire un circuito in grado di testare e ricaricare le batterie alcaline che integra un data logger per registrare tutti i parametri salienti che intervengono nella ricarica. Registrando i dati si ha successivamente la possibilità di eseguire delle analisi sugli stessi e ricavare dei dati sulla ricarica che permettono di modificare e migliorare progressivamente sia il caricabatterie che il software di gestione dello stesso.

Schema elettrico del circuito di prova e carica delle batterie alcaline con la possibilità di memorizzare via seriale sul computer i dati di carica

Schema elettrico del circuito di prova e carica delle batterie alcaline con la possibilità di memorizzare via seriale sul computer i dati di carica. Rispetto alla prima versione dello stesso circuito sono stati aggiunti i condensatori C5 e 2 condensatori che costituiscono il parallelo C4 che funge da serbatoio per generare le extracorrenti che attraverseranno la batteria. Queste modifiche hanno permesso di incrementare notevolmente i transitori di corrente. In definitiva la batteria alcalina in questo modo viene caricata con degli impulsi di corrente.

Elenco dei componenti:

Rricarica batterie alcaline: alcune foto

Parte delle Batterie alcaline testate Prototipo circuito di ricarica e test per batterie alcaline

Queste sono una parte delle batterie recuperate da un contenitore per lo smaltimento e sottoposte a test di ricarica e misura. Si tratta di batterie quasi del tutto scariche soprattutto per quello che riguarda il formato AAA delle quali è stato possibile in recupero solo in qualche raro caso.

Primo prototipo del circuito di test e ricarica per batterie alcaline. Il circuito è stato realizzato per praticità su una basetta millefori.

Prototipo circuito di ricarica e test per batterie alcaline Forma d'onda rilevata ai capi della batteria durante il test di ricarica

Visione d'insieme del circuito con i portabatterie utilizzati per il test. Quello nella foto è in prototipo nella sua versione iniziale, leggermente diverso da quello definitivo.

Andamento della tensione di ricarica misurata sulla batteria. Si noti l'impulso sul fronte di salita della tensione che supera i 2V e denota una certa inerzia della batteria nell'assorbire transienti particolarmente veloci.

Funzionamento del circuito di ricarica per batterie alcaline

Il circuito visibile sopra è abbastanza semplice, è composto da un generatore di corrente costante da circa 200 mA costituito dall'integrato 7805 e dalla resistenza R11. Questo circuito è una sorta di protezione hardware che non ci permette di superare la corrente media impostata evitando il rischio durante le prove di ricaricare la batteria con una corrente eccessiva. La corrente di ricarica impulsiva può essere invece molto più alta sfruttando la scarica del condensatore C4 e il controllo PWM di arduino.

Il transistor Tr1 pilotato in PWM dall'uscita D3 di arduino genera una corrente proporzionale alla tensione di D3, questa corrente attraversa la resistenza R3 che funge da shunt amperometrico per misurare la corrente che scorre sulla batteria e poi ricarica la batteria. La resistenza R10 elimina l'errore di misura dovuto alla corrente di fuga di Tr1 in fase di interdizione.

Il gruppo R4-DL2-C1 costituisce un circuito integratore della tensione presente sulla batteria e alimenta A1 che è un ingresso analogico di arduino. Il diodo led funge da zener entrando in conduzione a 2,4V (led blu) ed evitando di mandare una tensione pericolosa all'ingresso A1 che ricordiamo funziona il un range da 0 a 5V. In pratica si tratta di un zener che si illumina quando interviene.

Il gruppo R5-DL3-C2 serve per misurare la tensione prima della resistenza R3 per determinare per differenza la tensione su R3 e misurare la corrente che la attraversa.

Il transistor TR2 attraverso R6 serve per scaricare la batteria, il gruppo R7-DL5-C3 serve per rilevare la tensione media sul collettore di TR2 e determinarne la tensione di saturazione e per differenza la tensione sulla resistenza R6 per ricavare la corrente che la attraversa che è quindi la corrente di scarica. TR2 è controllato dal pin D4 di arduino. Il limite risiede nel fatto di non poter scaricare una batteria che ha una tensione uguale o inferiore alla tensione Vce del transistor TR2. Tuttavia essendo la Vce di circa 0,7V se la batteria ha una tensione inferiore è sicuramente compromessa. Batterie con una tensione sotto carico (e quindi in scarica) vicina alla tensione Vce di saturazione di Tr2 saranno affette da un errore della misura della resistenza interna molto alto.

Tutto il funzionamento viene gestito via software. Il software lo potere vedere di seguito. Per il progetto abbiamo utilizzato, per motivi di spazio arduino nano. Tutti i dati ricavati verranno pubblicati e discussi a parte per motivi di spazio.

E' interessante notare che il transistor che gestisce la ricarica, TR1 è comandato in PWM quindi avremo una onda quadra asimmetrica di controllo che assumerà un valore "1" per un tempo decisamente inferiore a quello in cui assumerà valore "0". All'atto della commutazione la corrente sarà molto alta rispetto a quella media letta da arduino tramite il circuito integratore grazie anche al condensatore C4 di grossa capacità costituito dal parallelo di 2 condensatori elettrolitici (1000uF e 2200uF) e da un terzo condensatore poliestere da 100nF. Quindi possiamo facilmente calcolare che se la misura indica 200mA come corrente di ricarica, questa sarà la corrente media, la corrente di picco di ricarica sarà data dal rapporto fra il tempo off e quello on dell'uscita PWM, quindi supponendo che la corrente sia stata rilevata all'ultimo step di ricarica (vedi programma sotto) che corrisponde al 60 la corrente di picco sarà di (255/60)*200=850mA. Lo stesso ragionamento si può in altri termini applicare alla tensione di picco ai capi della batteria alcalina in ricarica. Per avere una visione corretta occorre impiegare un oscilloscopio in grado di visualizzare la forma d'onda di ricarica per eseguire delle misure reali.

Ricaricare le batterie alcaline: Programma di controllo per arduino nano

Questo programma ricarica le batterie e scrive un log utilizzando la seriale. Lato computer occorre installare un programma di logging della seriale in modo da salvare i dati restituiti dal circuito su file per una analisi. Il seguente programma è un prototipo già perfettamente funzionante.

void setup() {
pinMode(3, OUTPUT); // imposta il D3 come OUTPUT
pinMode(4, OUTPUT); // imposta il D4 come OUTPUT
pinMode(14, INPUT); // imposta il A0 come INPUT
pinMode(15, INPUT); // imposta il A1 come INPUT
pinMode(17, INPUT); // imposta il A3 come INPUT
Serial.begin(115200); // Inizializza la seriale
// Modifica la frequenza del pwm sul piedino 3 impostando come divisore a 1
// Occorre usare un piedino diverso dal 6 e non collegato al timer0
setPwmFrequency(3, 1); // 31250Hz
}
float nA0; // Tensione sul pin A0
float nA1; // Tensione sul pin A1
float nConv=0.0046; // Fattore di conversione per determinare la tensione (pesato con voltmetro di precisione esterno)
// Notare che rappresenta anche l'errore di lettura dovuto alla risoluzione dell'ADC
float nRc=7.5; // Resistenza di carico per scarica della batteria
float nA11; // Differenza fra tensione a vuoto e sotto carico della batteria
float iRc; // Corrente sulla resistenza di carico
float nResInt; // Resistenza interna della batteria calcolata come differenza di tensione ai capi fratto differenza di corrente
int nPwm=0; // Variabile che gestisce il pwm in carica
float nVcar; // Tensione di carica
float nVlim; // Tensione limite di carica
float nV3; // Tensione su pin A3
float nV3diff; // Tensione su pin A3
int vMaxprot; // Sistema in protezione per sovratensione sulla batteria
float nIlim=0.2; // Corrente massima di carica in A;
float nSecCar; // Tempo di ricarica
int iMaxprot; // Sistema in protezione per sovracorrente sulla batteria
float tScar=3000; // Tempo di scarica in millisec
float tCar=30000; // Tempo di carica in millisec
float nMin=0; // Minuti dall'avvio di arduino
int nUscita=0; // Regola il ciclo di carica se si è verificata una sovratensione/sovracorrente
float vBattVuoto=0; // Memorizza la tensione della batteria a vuoto
void loop() {
vMaxprot=0;
iMaxprot=0;
nVcar=0;
nV3diff=0;
nUscita=0;
nVlim=1.75;

// Azzeramento delle uscite per evitare condizioni di indeterminazione
analogWrite(3,0);
digitalWrite(4,0);
// Depolarizzazione
digitalWrite(4,1); // Abilita la scarica
delay(1000);
digitalWrite(4,0); // interrompe la scarica

delay(tScar); // Tempo per stabilizzare la tensione a vuoto ai capi della batteria
nA0=analogRead(14)*nConv;
nA1=analogRead(15)*nConv;
nA11=nA1;
vBattVuoto=nA0;
// Serial.print("Tensione Pin A0 a vuoto: \n");
Serial.print(nA0,3);
Serial.print(";");
// Serial.print("Tensione Pin A1 a vuoto: \n");
Serial.print(nA1,3);
Serial.print(";");

digitalWrite(4,1); // Abilita la scarica
delay(tScar);

nA0=analogRead(14)*nConv;
nA1=analogRead(15)*nConv;
nA11=nA11-nA1;
iRc=(nA1-nA0)/nRc;
nResInt=nA11/iRc;

// Serial.print("Tensione Pin A0 in scarica: \n");
Serial.print(nA0,3);
Serial.print(";");
// Serial.print("Tensione Pin A1 in scarica: \n");
Serial.print(nA1,3);
Serial.print(";");
// Serial.print("Differenza di tensione fra a vuoto e scarica: \n");
Serial.print(nA11,3);
Serial.print(";");
// Serial.print("Corrente di scarica: \n");
Serial.print(iRc,3);
Serial.print(";");

// Serial.print("Resistenza Interna: \n");
Serial.print(nResInt,3);
Serial.print(";");
digitalWrite(4,0); // Disabilita la scarica

// Serial.print("Inizio Carica \n");
// Abilita la carica con treni di impulsi all'inizio con scarica capacitiva (impulso ad alta corrente)

if (nVlim>vBattVuoto) // La tensione a vuoto della batteria non ha raggiunto il valore limite
{
nSecCar=millis();
if (nVlim-vBattVuoto<=0.1) {nVlim+=0.1;} // compensazione della massima tensione di carica (+100mV)

do {
analogWrite(3, nPwm);
delay(100);
nVcar=analogRead(15)*nConv;
nV3=analogRead(17)*nConv;
nV3diff=nV3-nVcar;

if (nVcar>=nVlim) { vMaxprot=1; nUscita=1;} // Controlla che non si sia raggiunta la tensione di carica critica
if (nV3diff>=nIlim) { iMaxprot=1; nUscita=1;} // Controlla che non si sia raggiunta la corrente di carica critica
if (nUscita==0) {nPwm++; nUscita=0; }
if (nUscita==1 || nPwm>=255) {nPwm--; nUscita=0; }
//Serial.print(f);
//Serial.print(";");
//Serial.print(nV3diff,3);
//Serial.print(";");
//Serial.print(nVcar,2);
//Serial.print("\n");

} while (millis()-nSecCar<=tCar);

nSecCar=millis()-nSecCar;

nMin=(millis()/1000)/60; // Calcola in numero dei minuti dall'avviamento di arduino

Serial.print(nVcar,3);
Serial.print(";");
Serial.print(nV3diff,3);
Serial.print(";");
Serial.print(nSecCar/1000,3);
Serial.print(";");
Serial.print(tScar/1000,3);
Serial.print(";");
Serial.print(vMaxprot);
Serial.print(";");
Serial.print(iMaxprot);
Serial.print(";");
Serial.print(nMin,0);
Serial.print("\n");

// Serial.print("Fine Carica \n");
analogWrite(3, 0); // Disabilita la carica
}
else
{
delay(tCar);
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print(";");
Serial.print("0");
Serial.print("\n");
}
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}

* La funzione setPwmFrequency() è stata presa da https://playground.arduino.cc/Code/PwmFrequency

Ricaricare le batterie alcaline: funzionamento di massima del programma

  1. La batteria viene scaricata per un secondo.

  2. Viene atteso un certo tempo per permettere la stabilizzazione della tensione ai capi della batteria e la stabilizzazione della tensione sul circuito integratore che fornisce la tensione all'ADC di arduino.

  3. Viene eseguita la misura della tensione.

  4. Viene abilitata la scarica

  5. Viene letta la tensione di scarica

  6. Viene disabilitata la scarica

  7. Se la tensione a vuoto è troppo alta imposta un delay di 30" poi torna al punto 1

  8. Viene abilitata la carica con una rampa di corrente incrementale (si incrementa l'uscita PWM variando il duty cycle di uno step al secondo partendo da un rapporto 1/255 per arrivare a 255/255 fra Ton e Toff) fino a che la corrente o la tensione di carica non arrivano al valore massimo consentito oppure che il ciclo è terminato (30 secondi). Nel caso non sia stata raggiunta la tensione o la corrente massima il ciclo continua aggiustando il duty cycle per mantenere la batteria all'interno del range di tensione/corrente di carica.

  9. Il ciclo ricomincia dal punto 1.

Essendo un circuito sperimentale nel software non è stata introdotta nessuna condizione di fine carica, nella prossima versione analizzando i dati verrà ad un certo punto fermata la carica in funzione di parametri che andremo a definire.

Ricaricare le batterie alcaline: formato dei dati in uscita dal circuito con arduino nano

I dati sono separati fra loro in corformità con la formattazione di un file .csv da punto e virgola. Il fine record è un carattere di ritorno a capo "\n", ovvero new line. Di seguito un esempio di record.

1.679;1.684;0.731;1.638;0.046;0.121;0.381;1.753;0.170;44.019;3.000;1;0;11

Come potete vedere abbiamo registrato più cose di quelle che effettivamente servono, questo allo scopo di individuare possibili anomalie di funzionamento del circuito di ricarica. Alcuni valori sono calcolati da altri, come ad esempio la resistenza interna della batteria. Con questi valori è possibile utilizzando un foglio di calcolo costruire dei grafici che rendono più chiaro il comportamento della batteria il fase di carica per migliorare il programma e lo stesso circuito di carica. Se il computer dove gira office è settato per la lingua italiana occorre trasformare tutte le virgole in punti per i valori rilevati con decimali. Il funzionamento del circuito e dell'hardware ha un certo grado di complessità ma ci permette di estrapolare dati molto interessanti.

Nella interpretazione dei valori misurati occorre tenere in considerazione che gli ADC di arduino hanno una precisione di 0,0044V (5/210), quindi l'errore di misura è circa 5 mV. L'errore si propaga aumentando in tutti i dati ricavati con un calcolo in cui sono coinvolte una o più misure eseguite con l'ADC.

Grafico di ricarica di una batteria alcalina costruito utilizzando i dati ricavati e il programma openoffice Calc.

A titolo di esempio, nel grafico a lato:

  • la linea in rosso rappresenta la tensione di carica

  • la linea blu la tensione ai capi della batteria a fine ciclo di carica

  • la linea verde la resistenza interna della batteria

  • la linea gialla la corrente di ricarica.

Ricaricare le batterie alcaline: predizione della ricaricabilità

Come abbiamo potuto rilevare tentando di eseguire la ricarica di un numero considerevole di batterie e analizzando i log di carica, il parametro più importante, quello che definisce la ricaricabilità di una batteria è la resistenza interna. Se la batteria è compromessa da una scarica troppo profonda, oppure è troppo vecchia, la resistenza interna sarà alta, purtroppo questo valore è irreversibile (o meglio, con questi esperimenti non abbiamo trovato nessun modo per farlo), anche caricandola la resistenza interna si manterrà alta e la batteria sarà da smaltire.

Allo scopo, per individuare prontamente le batterie che si possono ricaricare abbiamo analizzato delle batterie nuove e abbiamo rilevato la resistenza interna. Se la batteria da ricaricare ha una resistenza interna simile allora il processo di ricarica andrà a buon fine, altrimenti ci conviene buttarla subito senza perdere tempo.

Ricaricare le batterie alcaline: resistenza interna di una batteria alcalina nuova.

Formato

Resistenza Interna

AA

0,2-0,5

AAA

0.38-0,5

Il valore è stato rilevato con lo schema precedentemente illustrato. Come vedete la resistenza interna per entrambi i formati deve essere inferiore a 0,5 Ω. Vi è una certa variabilità in questo valore, in definitiva dipende dalla qualità della batteria, le migliori hanno una resistenza interna minore. Noi volutamente abbiamo preso come riferimento delle batterie di bassa qualità, quelle vendute nei supermercati per pochi euro per intenderci.

Ricaricare le batterie alcaline: prossime modifiche.

Nel circuito definitivo verranno fatte le seguenti modifiche per renderlo più adatto ad un uso da parte di chiunque: