Schema per Realizzare un Caricabatteria per Pile NI-CD e NI-MH con Protezione Termica e Rilevamento di Massima Carica…
INTRO
Le batterie NI-CD e NI-MH hanno un determinato sistema per comprendere quando esse sono a piena carica oppure no. Il primo consiste nel misurare la tensione ai capi e quando raggiunge un massimo stoppare la carica, il secondo è misurando la temperatura e stoppare la carica quando la temperatura ha un elevato incremento di circa 20 gradi più di quella ambiente.
La carica viene fatta con una corrente costante e si utilizza il primo metodo per stoppare la carica.
Si utilizza un microcontrollore per misurare la tensione ai capi della batteria e si controlla quando la tensione ha un delta negativo, ovvero invece di crescere con la corrente costante, diminuisce. Inoltre per sicurezza si va a misurare la temperatura delle pile per evitare che si danneggino.
Il seguente schema utilizza un microcontrollore PIC programmato con Mikroc e utilizza due riferimenti di corrente per generare la corrente costante di carica. Permette il controllo della temperatura e permette di avere una carica lenta o una carica veloce fast charge. Nello schema vi sono i componenti per caricare due pile alla volta ma è molto semplice raddoppiare il numero di pile caricabili con una piccola modifica del software e dell’hardware.
CODICE
Il codice è il seguente:
unsigned int batt1, batt2, valP_batt1, valP_batt2, Conversione, Temp; //Variabili utili
unsigned char canale;
unsigned char Leggi_ADC(unsigned char canale){ //Funzione Lettura ADC
switch (canale) { //Seleziona canale
case 0: ADCON0 = 0b11000000;
case 1: ADCON0 = 0b11001000;
case 2: ADCON0 = 0b11010000;
}
ADCON0.ADON = 1; //Accendi ADC
Delay_us(15); //Ritardo attesa nuova conversione
ADCON0.GO_NOT_DONE = 1; //Setta flag
while(ADCON0.GO_NOT_DONE); //Conversione terminata?
Conversione = ADRESL; //Leggi valore ADC
Conversione = Conversione + (ADRESH * 512);
ADCON0.ADON = 0; //Spegni ADC
return Conversione;
}
void main() { //Programma principale
ADCON1 = 0b11000000; //ADC con oscillatore interno e right adj
ADCON0 = 0b11000000;
TRISB = 0x00; //PORTB uscite
TRISC = 0x0F; //PORTC.F1 ingresso
PORTB = 0;
while(1){ //Ciclo infinito
Leggi_ADC(0); //Leggi valore batteria 1
Batt1 = Conversione;
Leggi_ADC(1); //Leggi valore batteria 2
Batt2 = Conversione;
Leggi_ADC(2); //Leggi temperatura
Temp = Conversione;
if(PORTC.F0 == 1){ //Se PORTC.F0 = 1
PORTB.F1 = 0; //Setta valori per fast charge
PORTB.F3 = 0;}
else{
PORTB.F1 = 1; //Altrimenti carica normale
PORTB.F3 = 1;}
if(Temp > 120) PORTB = 1; //Se t>60°C ferma carica
if(Batt1 < valP_batt1){ //Se d(V_bat1)/dt <0 ferma carica bat 1
PORTB.F0 = 1;
PORTB.F1 = 1;
}
if(Batt2 < valP_batt2){ //Se d(V_bat2)/dt <0 ferma carica bat 2
PORTB.F2 = 1;
PORTB.F3 = 1;
}
valP_batt1 = Batt1; //Aggiorna valore precedente V_bat
valP_batt2 = Batt2;
Delay_ms(500); //Aspetta 500ms
}
}
Si vanno prima di tutto a inizializzare le variabili necessarie durante l’esecuzione del codice. La prima funzione che si va ad inizializzare è quella per la lettura dell’ADC, che riceve come variabile il canale dal quale si legge e restituisce il valore convertito. Modificando “ADCON0” con la routine di case si cambia il canale di lettura e successivamente si accende l’ADC, si aspetta che la conversione sia finita e si legge il valore.
Nel programma principale si inizializzano le porte di ingresso uscita e l’ADC. Nel ciclo infinito si leggono i valori della prima pila, la seconda e poi del sensore di temperatura. Se la fast charge è attiva si settano i valori dei pin affinché il riferimento di corrente eroghi più corrente.
Se la temperatura è maggiore di 60°C si interrompe completamente la carica, altrimenti si vanno a controllare le tensioni sulle due batterie per decidere se stoppare o continuare la carica. Finite le operazioni si va a memorizzare il valore di tensione sulle due batterie in modo tale che quando ricomincia il ciclo infinito questo valore venga confrontato con quello attuale per capire se la carica è finita o no.
Il controllo viene fatto ogni secondo.
SCHEMA
Lo schema è il seguente:
L’alimentazione del circuito è a 5V continui e stabilizzati e viene usata sia per il microcontrollore che per i generatori di corrente che caricano le batterie. La tensione positiva è connessa al pin 20 del microcontrollore e al pin 1 attraverso una resistenza da 10 KOhm mentre la tensione negativa o GND è connessa invece al pin 19 e 8 del microcontrollore. Il cristallo da 4MHz con due resistenze da 22pF formano il circuito di oscillazione.
Se si vuole la fast charge o carica normale si usa uno interruttore SW1 con una resistenza di pull-down connessi al pin 11.
I riferimenti di corrente sono due e sono elettricamente identici. La tensione di riferimento viene creata sul nodo non invertente dell’amplificatore operazionale grazie a R2, R4, R5 e C1. Per via del principio del cortocircuito virtuale sul pin negativo e positivo dell’op-amp ci sarà la stessa tensione e questo è possibile grazie alla regolazione di corrente di Q1 e alla caduta su R1. Supponiamo che RB0 e RB1 siano a livello alto, sul pin non invertente ci saranno 5V e affinchè ci siano 0V sul pin invertente la caduta su R1 deve essere 0, quindi Q1 è spento.
Se RB0 è a livello basso e RB1 a livello alto allora sul pin non invertente ci saranno 3.6V e affinchè ci siano 3.6V sul pin invertente deve scorrere in R1 una corrente di 140mA che sarà la corrente di carica.
Se RB0 e RB1 sono a livello logico basso ci sarà una tensione di riferimento di 2.9V quindi una corrente di 210mA. Aggiustando i valori di R4, R5 e R2 si possono variare i valori di corrente di carica. Il circuito di sotto è uguale identico.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e il codice compilato con MIKROC al seguente LINK!!!