Jste zde

Nabíjačka akumulátorových batérií

nabijecka-hostacky.jpg

Článok popisuje zostrojenie nabíjačky pre olovené akumulátory, na realizáciu ktorej bol použitý spínaný zdroj typu ATX používaný v počítačových zdrojoch. Navrhovaná nabíjačka umožňuje nabíjanie konštantným prúdom a po nabití batérie na napätie naprázdno nabíja konštantným napätím, pričom riadiaci obvod je tvorený mikropočítačom MC56F8006.

Úvod

Olovené akumulátory patria v dnešnej dobe k najrozšírenejším elektrochemickým zdrojom energie. Pre zabezpečenie ich správnej funkčnosti a predĺženie životnosti je dôležité klásť dôraz na ich správne nabíjanie, ale  i vybíjanie. Ako riešenie sa vyvrhuje využitie nabíjačky s možnosťou regulácie nabíjacieho prúdu.

Funkcie nabíjačky

  • nabíjačka umožňuje nabíjať konštantným prúdom nastaveným odporovým trimrom v rozsahu 0-10A
  • po dosiahnutí napätia U=14,4V automaticky prejde do režimu nabíjania konštantným napätím

Praktická realizácia

Pre konštrukciu nabíjačky som sa rozhodol využiť počítačový zdroj typu ATX, čím sa získa vyššia účinnosť premeny elektrickej energie ako i nižšia hmotnosť celého zariadenia ako keby bol využitý klasický sieťový transformátor. Bloková schéma PC zdroja je na obrázku 3.1.

 
obr. 3.1 Bloková schéma zapojenia PC zdroja
 

V nabíjačke je využítá výkonová časť zdroja teda vstupný filter s usmeňovačom, dvojčinný menič i výstupný filter s usmerňovačom. Riadiacu časť zdroja tvorenú obvodom TL494 som nahradil mikropočítačom MC56F8006, pričom som využil tú možnosť, že umožňuje vytvárať PWM signály pre spínanie budiacich tranzistorov a má v sebe zabudované AD prevodníky, ktorými možno merať napätie a takisto úbytkom napätia na meracom rezistore prúd.

 

Postup vytvorenia riadiacej časti

Program pre riadenie činnosti nabíjačky je napísaný v jazyku C v prostredí CodeWarrior, pričom hodnoty premenných možno meniť v programe Freemaster. Najskôr bolo potrebné vytvoriť PWM signály pre spínanie pomocných tranzistorov zabudovaných v zdroji. Zmenou striedy PWM impulzov dochádza k zmene výstupného napätia, preto bolo toto nutné stabilizovať. Vykonal som to tak, že cez AD prevodník sa meria výstupné napätie a toto sa porovnáva so žiadanou hodnotou pomocou naprogramovaného PI regulátora. V prípade poklesu napätia teda regulátor dokáže toto napätie upraviť na žiadanú hodnotu. Tento režim využíva nabíjačka pri nabíjaní konštantným napätím. V ďalšom kroku bolo potrebné vytvoriť meranie a reguláciu prúdu. Prúd sa meria tak, že úbytok napätia na meracom rezistore sa privádza na vstup operačného zosilňovača, kde sa zosilní a z výstupu ide na vstup AD prevodníka, pričom v programe sa veľkosť napätia predelí veľkosťou odporu, čím získame prúd. Hodnota žiadaného prúdu sa zadáva veľkosťou úbytku napätia na odporovom trimri a po prerátaní tohto úbytku na veľkosť prúdu sa porovnáva so skutočným prúdom a ďalší PI regulátor ho vyreguluje na požadovanú hodnotu. Tento režim využíva nabíjačka pri nabíjaní konštantným prúdom. Nabíjačka je umiestnená v pôvodnej krabici PC zdroja do ktorej je umiestnený aj plošný spoj s mikropočítačom.

 
obr. 3.2 Konštrukcia nabíjačky
 
 
 obr. 3.3 Schéma zapojenia pre návrh plošného spoja
 

Výpis programu pre riadenie nabíjačky:

#include "qs.h"
#include "freemaster.h"
#include "sys.h"
#include "cop.h"
#include "wintc.h"
#include "gpio.h"
#include "pwm.h"
#include "adc.h"
#include "mclib.h"
#include "occs.h"
#include "sci.h"

pwm_sComplementaryValues comp;  
int a=30500,control=0;
volatile UInt16 	adca_napatie=0, adca_prud=0;

MC_PiParams PIparams, PIparams2;
Frac16 desiredValue, PIoutput,aa=FRAC16(0.05);   
Frac16 ziadany_prud, PIoutput_I, Prud_trimer, nap=FRAC16(0.944);   
int zmena=0, prepnutie=2, prep2=1;
    
int main(void)
{
 
    ioctl(SYS, SYS_INIT, NULL);
    ioctl(COP, COP_INIT, NULL);    
    ioctl(GPIO_A, GPIO_INIT_ALL, NULL);
    ioctl(GPIO_B, GPIO_INIT_ALL, NULL);
    ioctl(GPIO_C, GPIO_INIT_ALL, NULL);
    ioctl(GPIO_E, GPIO_INIT_ALL, NULL);
    ioctl(SCI, SCI_INIT, NULL);
    FMSTR_Init();

    
    ioctl(ADC0, ADC_INIT, NULL);    
    ioctl(ADC1, ADC_INIT, NULL);    
    ioctl(PWM, PWM_INIT, NULL);
    ioctl(PWM, PWM_DEVICE, PWM_ENABLE);
    ioctl( PWM, PWM_OUTPUT_PAD, PWM_ENABLE );  
    ioctl(WINTC, WINTC_INIT, NULL);
    archEnableInt();
    
	PIparams.propGain = FRAC16(0.5); 
	PIparams.propGainSc = 0;
	PIparams.integGainSc = 10;
	PIparams.integGain = FRAC16(0.5);
	PIparams.negPiLimit = FRAC16(0.005);
	PIparams.posPiLimit = FRAC16(0.2);
	PIparams.integPartK_1= 0;
	desiredValue = FRAC16(0.8964);   
    
	PIparams2.propGain = FRAC16(0.5); 
	PIparams2.propGainSc = -2;
	PIparams2.integGainSc = 5;
	PIparams2.integGain = FRAC16(0.5);
	PIparams2.negPiLimit = FRAC16(0.005);
	PIparams2.posPiLimit = FRAC16(0.28);
	PIparams2.integPartK_1= 0;
	ziadany_prud = FRAC16(0.2);   
	    
    while(1)
    {
        ioctl(COP, COP_CLEAR_COUNTER, NULL);   
    }       
}

/********************************************************************/


#pragma interrupt on
void pwm_reload_isr(void)
{  
	ioctl(ADC0, ADC_SET_INPUT_CHANNEL_A, ADC_AD7);  
	ioctl(ADC1, ADC_SET_INPUT_CHANNEL_A, ADC_AD4);  
	ioctl(ADC1, ADC_SET_INPUT_CHANNEL_B, ADC_AD8);  

    comp.pwmChannel_0_Value = a;
    comp.pwmChannel_2_Value = 32767-a;
    comp.pwmChannel_4_Value = 0x4000;
    ioctl(PWM, PWM_UPDATE_VALUE_REGS_COMPL, &comp); 
    ioctl(PWM, PWM_CLEAR_RELOAD_FLAG, NULL);
}

#pragma interrupt off

/********************************************************************/

#pragma interrupt on
void adc_isr(void)
{  
	ioctl( GPIO_A, GPIO_TOGGLE_PIN, BIT_4);	
	if (ioctl(ADC0, ADC_TEST_CONVERSION_COMPLETE_A, NULL))	
	{
		adca_napatie=ioctl(ADC0, ADC_READ_SAMPLE_A, NULL);
	}		
    if (control==2)
    {
         PIoutput = MCLIB_ControllerPI (desiredValue,adca_napatie, &PIparams);
    }

if (control==0)	
    {
		PIoutput=aa;
	}
	a=sub(FRAC16(1.0),PIoutput);	
       FMSTR_Poll();
       FMSTR_Recorder();
	ioctl( GPIO_A, GPIO_TOGGLE_PIN, BIT_4);	
}

#pragma interrupt off

/********************************************************************/

#pragma interrupt on
void adc2_isr(void)
{  
	ioctl( GPIO_A, GPIO_TOGGLE_PIN, BIT_5);
if (ioctl(ADC1, ADC_TEST_CONVERSION_COMPLETE_A, NULL))	
	   {			
        if	(zmena==0)
        {
        	adca_prud=ioctl(ADC1, ADC_READ_SAMPLE_A, NULL);
        	zmena=1;
        	ioctl(ADC1, ADC_SET_INPUT_CHANNEL_A, ADC_AD8);  
        }
        else 
            {
        	Prud_trimer=ioctl(ADC1, ADC_READ_SAMPLE_A, NULL);
        	zmena=0;

            }		
    	}
    	
	
if (ioctl(ADC1, ADC_TEST_CONVERSION_COMPLETE_B, NULL))	
	{
		Prud_trimer=ioctl(ADC1, ADC_READ_SAMPLE_B, NULL);
	}
	
if (control==1)
    {	
     PIoutput = MCLIB_ControllerPI (Prud_trimer,adca_prud, &PIparams2);
    } 
if  (adca_napatie>=nap)
    {
	control=prepnutie;
    }
    
	else
	{
		control=prep2;
	}
}

#pragma interrupt off

Záver

Článok opisuje postup skonštruovania nabíjačky olovených akumulátorov s možnosťou nabíjania konštantným prúdom a napätím. Na takto vytvorenej nabíjačke boli vykonané merania na overenie jej správnej činnosti, čiže po pripojení akumulátoru k nabíjačke sa tento nabíja požadovaným prúdom a po dosiahnutí napätia U=14,4V sa nabíja konštantným napätím, na ktoré môže byť batéria pripojená neobmedzene dlho.

Poďakovanie

Tento príspevok vznikol za podpory spoločnosti Freescale Semiconductor, Inc.Žilinskej univerzity v Žiline, ktorým ďakujem za podporu pri realizácii projektu v rámci Freescale Technology Day 2010.

Odkazy

Hodnocení článku: