CARICABATTERIA NI-CD NI-MH INTELLIGENTE

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



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *