AN 1384 – Libreria applicativa per caricabatterie Ni-MH

Nuovo appuntamento con la Rubrica Firmware Reload. Il controllo del processo di carica degli elementi Ni-MH è di fondamentale importanza per garantir loro una lunga durata e ritardarne il degrado. In questo articolo parliamo di una libreria che permette di aggiungere facilmente le funzionalità per il caricamento di queste batterie, soprattutto nei dispositivi portatili.

Introduzione

La libreria che ci accingiamo a descrivere, scritta dalla Microchip Technology Inc., consente di scrivere e produrre applicazioni per la gestione completa del processo di carica delle batterie. Le routine e le funzioni presenti sono molto leggere e possono essere implementate in sistemi alquanto ridotti. La loro occupazione minima, infatti, ammonta a meno di 2K di spazio di codice e a meno di 128 byte di memoria RAM. Le applicazioni create si possono adattare facilmente a piccoli dispositivi programmabili come, ad esempio, il PIC 16F616.

REQUISITI

Allo scopo di realizzare un prototipo minimale di applicazione, che prevede soli due slot per la carica di altrettante batterie, le librerie richiedono i seguenti requisiti hardware:

  • Spazio in memoria programma di 2K word
  • 128 byte di RAM
  • 1 modulo PWM avanzato
  • 1 timer a 16 bit
  • 1 comparatore
  • 1 riferimento ADC
  • 1 modulo DAC per la limitazione di corrente
  • 1 convertitore ADC ad almeno 10 bit, composto da due porte analogiche per la lettura della tensione delle batterie e altre due porte analogiche per la lettura opzionale della temperatura
  • 2 porte per il pilotaggio di transistor con funzione di switch
  • 2 porte per il pilotaggio di diodi LED per il monitoraggio stati
  • 1 porta UART per effettuare il debug (dal PC) delle operazioni. Questa funzionalità è opzionale

Ottimi risultati si ottengono con i microcontrollori PIC16F616 e PIC18F14K50. Benché il cuore del caricatore sia formato da una sola cella di carica, più batterie possono essere caricate attraverso uno scambio ad “altalena”, per mezzo di una erogazione commutata di corrente, ora verso una batteria, ora verso l’altra. Tale avvicendamento di carica viene effettuato ogni secondo.

PARAMETRI PROGRAMMABILI DELLA LIBRERIA

La corretta ricarica delle batterie deve avvenire seguendo passaggi ben precisi, al fine di rispettare le caratteristiche chimiche dei generatori e non danneggiare gli elementi interni degli stessi. Tali scrupolosità vanno rispettate soprattutto nei processi di carica veloce, per la quale la criticità delle operazioni aumenta esponenzialmente. La rilevazione delle condizioni delle batterie è una fase molto importante. Non si può, infatti, attivare un processo di carica veloce, se la tensione iniziale è alquanto bassa. La libreria è completamente personalizzabile e l’utente può configurarne molte funzionalità e numerosi parametri operativi. Tali impostazioni avvengono esclusivamente via software e firmware, cosicché l’hardware del sistema non ha la necessità di essere modificato. I limiti hardware ed elettrici devono comunque essere rispettati da un punto di vista prettamente circuitale. I parametri configurabili della libreria prevedono la configurazione delle seguenti voci:

Funzionalità del caricabatterie:

  • Parametri per la ricarica lenta (ormai obsoleta)
  • Parametri per la ricarica veloce

Tensione della batteria:

  • Rilevamento della connessione e della rimozione della batteria
  • Impostazione dei valori minimi e massimi della tensione iniziale di ricarica
  • Impostazione della massima tensione durante la ricarica

Temperatura della batteria:

  • Temperatura minima e massima per inizio carica
  • Temperatura massima durante la ricarica

Durata carica:

  • Durata del processo di carica lenta
  • Durata della pre-ricarica
  • Durata del processo di carica veloce
  • Durata del processo di mantenimento

Corrente:

  • Corrente in carica lenta
  • Corrente in pre-ricarica
  • Corrente in carica veloce
  • Corrente di mantenimento

Segnalazione dei LED:

  • Vari tipi di segnalazione
Figura 1: Struttura di una batteria NI-MH

Figura 1: Struttura di una batteria Ni-MH

STRUTTURA DELLA LIBRERIA

La libreria è organizzata in una struttura ad albero, come si evince dalla Figura 2. Il modo più affidabile di utilizzo è quello di includere il file principale nei propri programmi ed aggiungere la specifica funzione di chiamata nel listato. Il file da includere è “Battery- Charger.h” e la funzione da invocare inizialmente è “DoCharger()”, da inserire nel main del sorgente. Il file di inclusione “Hardware.h” prevede le specifiche per diverse tipologie di piattaforme hardware ed ogni variazione può essere definita proprio in questo file. Il file di inclusione “NiMH.h” contiene le specifiche di ricarica delle batterie Ni-MH più diffuse sul mercato. Da un punto di vista operativo, la funzione di ricarica deve essere richiamata nel programma al massimo ogni 125 ms. Tale misurazione temporale può essere effettuata attraverso il timer a 16 bit con prescaler oppure con il timer PWM.

Figura 2: Struttura della libreria

Figura 2: Struttura della libreria

Figura 3: Funzionamento principale del processo di ricarica

Figura 3: Funzionamento principale del processo di ricarica

Figura 4: Schema elettrico e connessione della batteria

Figura 4: Schema elettrico e connessione della batteria

FILE DELLA LIBRERIA

Come si è detto in precedenza, la libreria è organizzata in una struttura gerarchica ad albero e si impernia sull’esistenza di alcuni file. In dettaglio, esaminiamo i vari file di inclusione, spiegandone i contenuti ed il funzionamento.

BatteryCharger.h: il file di inclusione in questione costituisce la radice del sistema e deve essere incluso nel proprio progetto, al fine di poter utilizzare la libreria. Contiene i prototipi di alcune funzioni da richiamare:

void InitializeCharger(void): deve essere richiamata prima del loop principale per assicurarsi che l’intero hardware sia stato correttamente inizializzato. Non ritorna alcun valore;

unsigned char Get_Charger_State(void): ritorna, alla funzione chiamante, lo stato del carica batterie, secondo le seguenti pseudo-costanti:

  • CHARGER_IDLE: non è stata inserita alcuna batteria;
  • CHARGER_WORKING: il carica batteria sta ricaricando correttamente almeno una batteria;
  • CHARGER_DONE: tutte le batterie inserite sono state ricaricate e possono essere rimosse dai rispettivi alloggiamenti;
  • CHARGER_FAULT: c’è almeno una batteria difettosa che deve essere controllata;

void Do_Charger(void): questa funzione deve essere invocata almeno ogni 125 ms ed attiva il processo di carica, con i controlli di tutti i parametri.

Esempio di codice minimale, in linguaggio C:

#include “BatteryCharger.h”
void main(void) {
// Inizializzazioni
InitializeCharger();
while(1) {
Do_Charger();
// Codice
}
}

LED_Driver.h: questo file di inclusione contiene le funzioni predisposte alla segnalazione dello stato delle batterie e della ricarica:

void LED_Blink(void): la funzione, personalizzabile, attiva e disattiva i diodi LED, secondo alcuni criteri. La funzionalità del diodo LED è stabilita, per default, nella seguente modalità:

  • LED spento: nessuna batteria rilevata;
  • LED lampeggiante alla frequenza 0,5 Hz: batteria in carica;
  • LED acceso: carica completata o batteria in mantenimento;
  • LED lampeggiante alla frequenza di 2 Hz: batteria difettosa.

Debug.h: il file contiene il prototipo di una funzione che, se utilizzata, invia ad un personal computer i dati delle batterie, allo scopo di monitoraggio e debug. La trasmissione avviene con modalità UART ed utilizza funzioni di tipo software, implementabili quindi a molti tipi di MCU.

void SendStatus(void): la funzione non ritorna dati ed invia informazioni al PC ogni secondo, in relazione ad un ben definito tracciato record, visionabile nel foglio specifiche della libreria stessa.

Uart.h: il file contiene i prototipi di funzione per la gestione della comunicazione UART. Esse sono scritte interamente in Assembler, al fine di ottenere la maggiore velocità di esecuzione possibile ed un minor ingombro di codice in memoria. Per configurare i parametri operativi, come la velocità di trasmissione, occorre definirne le caratteristiche mediante comando del preprocessore “#define”.

void UartTx(unsigned char): la funzione invia un carattere sulla UART utilizzando le predisposizioni programmate (velocità, porta, etc.).

StateMachine.h: è un insieme di funzioni che riguardano gli stati delle batterie in carica. Le funzioni implementate sono le seguenti:

void Battery_Fault_Check(void): esegue un controllo della batteria e del suo stato di salute e della sua tipologia. La funzione esegue tre tipi di test:

  • errore di tensione: termina immediatamente il caricamento della batteria se la tensione supera 1,7V;
  • errore di temperatura: termina il caricamento della batteria se la temperatura supera 50° C;
  • errore di impedenza: termina il caricamento della batteria se la differenza tra la tensione di carica e quella fluttuante eccede una determinata soglia;
  • void Battery_Slow_Charge(void): la funzione, disponibile solo in modalità di carica lenta, carica la batteria in tale modalità;
  • void Battery_Precharge(void): questa funzione eroga una debole corrente (C/10) sino a quando la tensione arriva a circa 1 V. E’ usata come primo passaggio per intraprendere una carica veloce;
  • void Battery_Fast_Charge(void): la batteria viene caricata con una corrente alquanto elevata, sino a quando la tensione arriva ad una determinata soglia;
  • void Battery_Finish_Charge(void): termina lo stato di carica. Ha lo scopo di interrompere la carica ma anche quello di prelevare i parametri operativi in una sovraccarica veloce;
  • void Battery_Topoff(void): pone la batteria in stato di “Topoff”;
  • void Battery_Maintenance(void): fa fluire all’interno della batteria una debolissima corrente;
  • void Battery_State(void): controlla lo stato della batteria;
  • void CleanUp_Vars(void): azzera il timer e i valori di corrente e tensione quando si verifica uno stato di non carica.

Battery.h: contiene tutte le funzioni, variabili e strutture riguardanti le batterie. Di seguito le funzioni in esso prototipate:

unsigned char Get_Battery_State(unsigned char n): restituisce lo stato della batteria specificata come argomento (n);

unsigned long Get_Battery_Time(unsigned char n): restituisce il tempo di ricarica totale (in secondi) della batteria specificata come argomento;

unsigned int Get_Battery_Volts(unsigned char n): ritorna la tensione fluttuante (in mV) della batteria specificata;

void Measure_Current(void): la funzione restituisce la misura della corrente presente all’ingresso del comparatore;

void Measure_Charge(void): misura la tensione di ricarica sulla batteria attiva;

void Measure_Float(void): misura la tensione fluttuante della batteria correntemente in uso;

void Measure_Temp(void): misura la tensione sul sensore di temperatura collegato alla batteria correntemente in uso;

void Switch_Battery(void): commuta il controllo sull’alloggiamento che ospita la batteria successiva e ne controlla lo stato. Decide altresì se erogare o meno corrente per la ricarica.

Hardware.h: tutte le inizializzazioni dipendono da questo file di inclusione. In caso di utilizzo di diversi hardware, occorre modificare di conseguenza alcuni parametri, attraverso costanti nello statement “#define”.

unsigned int Measure_ADC(unsigned char channel, unsigned char samples): la funzione acquisisce un certo numero di campioni dalla porta ADC e ne ritorna la somma. Per un ADC con risoluzione a 10 bit il numero massimo di campioni è 64;

void InitializeHardware(void): inizializza le periferiche utilizzando i valori specificati nel relativo file di inclusione;

void Set_Current(unsigned int current): la funzione specifica la corrente massima da erogare;

void Bat_Switches_Off(void): la funzione scollega le batterie, permettendo una corretta misurazione della tensione;

NiMH.h: questo file di intestazione contiene i parametri di ricarica relativi agli elementi chimici delle batterie Ni-MH.

TEMPERATURA

Al fine di monitorare la temperatura delle batterie possono essere utilizzati sia NTC che PTC. Occorre specificare tale aspetto negli opportuni file di configurazione. La ricarica non avviene se la temperatura è al di fuori dell’intervallo 0°C - 40°C. Se si utilizza un buon accoppiamento termico tra i termistori e la batteria, si può rilevare la ripida pendenza presente nell’ultima parte del ciclo di ricarica e sfruttare tale aspetto per terminare il processo prima del verificarsi di una sovraccarica. In questo caso deve essere implementata una funzione di calcolo della temperatura con una risoluzione di 0,1°C. Esempi di configurazioni termiche:

#define THERMISTOR_NTC
#define MIN_START_CHARGE_TEMP
TEMP_0C
#define MIN_CHARGE_TEMP TEMP_0C
#define MAX_START_CHARGE_TEMP
TEMP_40C
#define MAX_CHARGE_TEMP
TEMP_50C

PRODOTTI

La Microchip, sulla base della libreria illustrata in queste pagine, ha prodotto un caricabatterie basato sul microcontrollore PIC18F14K50. Si tratta di un dispositivo semplice, dalle prestazioni molto avanzate, collegabile alla porta USB del PC. È in grado di ricaricare le celle mini stilo ricaricabili (AAA) e inoltre avverte l’utente di un eventuale erroneo inserimento di pile alcaline. Il prodotto dispone, se lo si desidera, anche di un’interfaccia GUI al PC, in grado di mostrare lo stato di avanzamento della carica. Quest’ultima è disponibile per Windows, Mac e Linux.

Figura 5: Celle NI-MH

Figura 5: Celle Ni-MH

Figura 6: Il caricabatterie della Microchip basato sulle librerie

Figura 6: Il caricabatterie della Microchip basato sulle librerie

CONCLUSIONI

La Microchip consente agli utenti di utilizzare la libreria per aggiungere rapidamente funzionalità di ricarica per le proprie applicazioni. L’hardware è molto semplice e il fatto che si possano caricare più celle contemporaneamente con una sola sorgente di corrente, rende conveniente e vantaggiosa l’adozione di tale sistema. La libreria è completamente personalizzabile e costituisce un prezioso strumento con cui realizzare, in maniera relativamente semplice, sistema di ricarica per applicazioni portatili.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend