Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2016:solar-reg

PWM Regulátor pre solárnu elektráreň

Zadanie

Navrhněte PWM regulátor výkonu spolu s měřící a vyhodnocovací stanicí s displejem pro solární elektrárnu na nabíjení akumulátorů. Využijte mikrokontrolér ARM, např. Atmel SAM3X/A. Realizujte potřebné ochranné prvky proti přebíjení a podbíjení akumulátoru.

Úvod


Cieľom projektu je vytvoriť funkčný PWM regulátor výkonu pre solárnu elektráreň s maximálnym dodávaným výkonom solárnych článkov - 100W. Regulátor bude schopný regulovať dodávaný výkon do Lithium-iontového (Li-ion) akumulátoru spolu s dodržiavaním doporučených módov nabíjania za účelom predĺžiť životnosť batérie (Počet nabíjacích/vybíjacích cyklov). Súčasťou takéhoto regulátora je aj LCD displej, ktorý zobrazuje aktuálne parametre systému. Súčasťou sú aj ochranné prvky ktoré sprostredkúvajú ochranu:

  1. Pod-vybitie akumulátora
  2. Prebíjanie akumulátora
  3. Prekročenie max nabíjacieho prúdu
  4. Prekročenie max. vybíjacieho prúdu pripojenou záťažou
  5. Zabezpečenie vhodných pracovných podmienok pre solárny panel
  6. Vyhodnotenie nevhodnej pripojenej batérie

Nabíjací algoritmus by mal dodržiavať požadovaný proces nabíjania zobrazený na obrátku nižšie (ZDROJ: [http://batteryuniversity.com/learn/article/charging_lithium_ion_batteries|Externí odkaz]] )

  Obr.1 Fázy nabíjania konštantným prúdom a napätím LI-ion akumulátoru

Hardware


Vývojová doska s STM32F103C8

Jedná sa o mikroprocesor s architektúrou Cortex ARM M3 s pracovnou frekvenciou 72MHz. Mikroprocesor obsahuje multiplexovatelný 12bitový ADC a DAC prevodník, viaceré časovače využívane hlavne na realizáciu funkcie wait() a PWM. V rámci realizácie boli aj využité Hallovej sondy na meranie pretekajúceho prúdu a taktiež displej 16×02. K napaľovaniu softvéru je využívaný modul FTDI232 zobrazený na obrázku nižšie.

  Obr.2 STM32F103C8 a FTDI232

Buck Converter (Step Down) modul

Buck converter je využívaný k vytvoreniu konštantného napätia využívaného na nabíjanie akumulátora. Parametre:

  • Výstupné napatie 0.8V-30V
  • Vstupné napatie 5V-32V
  • Spínacia frekvencia 300kHz
  • Maximálný prúd 4A
  • Zvlnenie 50mV
  • Maximálna efektivita 95%

  Obr.2 Buck Converter

Solarný modul 100W

Zdrojom energie je polykrištalický solárny panel s maximálnym príkonom 100W. Výkon panelu je zámerne predimenzovaný najmä kvôli faktu, že často-krát svetelné podmienky počas jednotlivých dní v roku nedosahujú takej intenzity, aby bol dosiahnutý maximálny výkon solárneho panelu. Parametre solárneho panelu:

  • Napätie v bode maximálneho výkonu 17,9V
  • Prúd v bode maximálneho príkonu 6,01A
  • Tolerancia výkonu +-3%
  • Maximálne sériové istenie 11A
  • Technológia Poly-si
  • Rozmery 1060*670*35mm
  • Váha 9kg

  Obr.3 Solárny panel s výkonom 100W

Li-ion Akumulátor

Prototypový akumulátor je zložený z troch trojíc LI-ion akumulátorov zapojených do série tvoriacich približne 10,8V až 12,6V batériu pre 12V aplikácie. Na obrázku nižšie je uvedený prototyp takejto batérie. Akumulátor disponuje kapacitou 2300mAh resp. 27Wh. Takto navrhnutý akumulátor slúži len na overenie funkcie zariadenia. Pri finálnej realizácii je nutné sledovať a vyhodnocovať aktuálny stav každého jedného bloku batérie tak, aby nedochádzalo k postupnej degradácii celého akumulátoru na základe pod/prebíjania niektorého z blokov.

  Obr.4 Li-ion batéria s výkonom 27Wh

Na obrázku nižšie je uvedená batéria zložená s viacerých blokov s výstupným svorkovým napätím (25,2V až 29,4V) pre 24V aplikácie. Táto batéria disponuje kapacitou 22 000mAh resp. 600Wh. Je uvedená len pre ilustráciu a pre fakt, že navrhovaný regulátor bude v budúcnosti upravený a podrobený aj výkonovým skúškam na tomto akumulátore.

  Obr.5 Li-ion batéria určená na ďalšie testovanie s výkonom 600Wh

Zapojenie

Schéma zapojenia spočíva vo využiti Buck Converteru pre tvorbu konštantného napätia, ktoré je nasledovne spínanie PMOS výkonovým tranzistorom Q1 (IRF9640 nie je pre túto aplikáciu najvhodnejší kvôli vysokému Rds ON). Druhý tranzistor Q2 je využívaný len ako spínač záťaže. Dióda D1 slúži na oddelenie a zabráneniu prenikaniu napätia z batérie na sondu Usol v prípade ak Usol < Ubat. Tranzistor Q1 je spínaný pomocou PWM vďaka čomu dochádza k regulovaniu prenášaného výkonu do batérie. Podmienka pre použitie solárneho panelu Usol > 15V. Pri využití panelu, ktorý podmienku nespĺňa je možné využiť Buck/Boost Converter s dodatočnou úpravcov softvéru. S nastavením softvéru je možné regulátor nastaviť na nabíjanie ľubovolnej batérie s Ubat> 1.5V s použitím ľubovolného panelu s Usol > 5V (Pri využití Buck/Boost Converteru). Na schéme uvedenej nižšie niesu uvedené použité deliče a RC články použité pre snímanie napätí a prúdov. (Snímanie strednej hodnoty PWM signálu).

  Obr.6 Schéma zapojenia

Software


Softvér bol prvotne vyvíjaný na platforme MBED pomocou online kompilátoru na doske FRDM-K64F, ktorá bohužiaľ počas testovania odišla do kremíkového neba. Autor bol nútený celú aplikáciu realizovať v prostredí Arduino a však kód bol dokončený pre obe platformy. Prvý kód je pre MBED platformu, kód pre ARDUINO je uvedený v prílohe. Princíp fungovania softvéru spočíva v stavovom automate, ktorý mení šírku PWM (Duty) signálu s určitým krokom tak, aby boli docielené stanovené podmienky (fázy nabíjania). Zvyšovanie a znižovanie prenášaného výkonu je realizované funkciami pwm_up a pwm_down. Pre správnu funkciu regulátora je nutné dodržať viaceré podmienky (uvedené v úvode). Program je realizovaný parametricky, čiže jednotlivé medze, limity alebo parametre je možné meniť pomocou statických hodnôt v úvode programu.

Definícia premenných a nastavenie vstupno-výstupných periférií

#include "mbed.h"
#include "TextLCD.h"
 
static int perioda_pwm         =  30;    //perioda PWM v us
static int pwm_step            =  1;     //hodnota kroku zvysovania/znizovania pwm
static int max_pwm_width_us    =  30;
static int min_pwm_width_us    =  0;
static int backlight           =  10;     //podsvietenie displeja max 30
static int samples             =  100;    //pocet priemerovanych vzoriek pre ADC
 
int pwm                        =  0;      //akutalna hodnota sirky pulzu PWM
int mode                       =  0;      //mod nabijania
double Ubat                    =  0.0;    //napatie baterie
double Usol                    =  0.0;    //napatie solarneho panelu
double Ibat                    =  0.0;    //prud z alebo do baterie (zaporny alebo kaldny)
double Istep                   =  0.0;    //prud tecuci z buck converteru
double Iload                   =  0.0;    //prud tecuci do zataze 
 
static float I_StepMax         =  3.0;    //Maximalny prud dosiahnutelny pomocou buck converteru
static float I_1C              =  1.0;    //Maximalny nabijaci prud vzjadreny v kapacite 1C 2300mah je 2.3A
static float I_batMaxDischarge = -6.0;    //Maximalny povoleny vybijaci prud
 
static float U_bat_limit       =  9.5;    //nad hodnotu U_bat_limit je pripojena vhodna neposkodena bateria
static float U_bulk_limit      =12.15;    //limitna hodnota nabijania konstantnym prudom
static float U_abso_limit      = 12.3;    //limitna hodnota nabijania konstantnym napatim
static float U_sol_limit       = 15.0;    //limitna hodnota napatia na solarnom panely tak aby pracoval efektivne podla vykon. char.
static float U_charged_limit   = 12.0;    //nabita pokial hodnota po nabiti neklesne pod U_chearged_limit
 
 
//-------------------DIGITAL OUT----------------------------
TextLCD     lcd(D2, D3, D4, D5, D6, D7, TextLCD::LCD16x2);
PwmOut      lcd_backlight(D9);
PwmOut      Pwm_Mos(D10);
DigitalOut  Switch_Load(D11);
//--------------------ANALOG IN-----------------------------
AnalogIn BatVol (A0);
AnalogIn BatCur (A1);
AnalogIn SolVol (A2);
AnalogIn StepCur(A3);
//----------------------------------------------------------

Funkcia Measurement

void measurement()  // Pre spravnu funkciu treba naciachovat a nakalibrovat
{
    wait_ms(50); // pockat kym sa ustali napatie na RC-clanku
 
    for (int i=0; i<samples; i++ ) { // pocet vzoriek 
 
    Ubat  = Ubat  + BatVol.read();
    Ibat  = Ibat  + BatCur.read();
    Usol  = Usol  + SolVol.read();
    Istep = Istep + StepCur.read();                        
 
    }
 
    Ubat  = ((Ubat/samples)*3.3*5.0)/0.77;
    Ibat  = (Ibat/samples)*3.3*4.0;
    Usol  = (Usol/samples)/0.0465;
 
    Istep = (((Istep/samples)*3.3*2.0)/1.071);
    Istep = (Istep - 2.41)/0.18;
 
    Iload = Istep+Ibat; // Vypocitaj podla I. KZ
}

Funkcia PWM_Down a PWM_up

int pwm_down(int step, int min_pulse_width)
{
 
    pwm = pwm-step;
 
    if(pwm <=min_pulse_width) {
        pwm = min_pulse_width;
    }
 
    return pwm;
}
 
int pwm_up(int step, int max_pulse_width)
{
 
    pwm = pwm+step;
 
    if(pwm >=max_pulse_width) {
        pwm = max_pulse_width;
    }
 
    return pwm;
}

Funkcia Display

int display(float data1_f , float data2_f , float data3_f , float data4_f,
             int  data5_i , int   data6_i){
 
    lcd.cls();
 
    wait_ms(1);             //Po premazani displeja pcokat 1ms
 
    lcd.locate(0,0);
    lcd.printf("%4.2f", data1_f);
 
    lcd.locate(0,1);
    lcd.printf("%2.2f", data2_f);
 
    lcd.locate(7,0);
    lcd.printf("%4.2f", data3_f);    
 
    lcd.locate(7,1);
    lcd.printf("%4.2f", data4_f);
 
    lcd.locate(13,0);
    lcd.printf("%d", data5_i);
 
    lcd.locate(15,1);
    lcd.printf("%d", data6_i);
 
    return 0;    
}   

Funkcia main

Princíp funkcie programu spočíva v stavovom automate, ktorý hľadá optimálnu hodnotu PWM spísaného tranzistora Q1 podľa zadaných kritérií v jednotlivých módoch nabíjania. Módy regulátoru:

  • 0 - Nevhodná batéria alebo prekročenie limitného prúdu na záťaži
  • 1 - Nabíjanie konštantným prúdom I_1C
  • 2 - Nabíjanie konštantným napätím
  • 3 - Batéria nabitá (Z módu 3 dochádza k prepnutiu do iného iba vtedy ak napätie na nabitom akumulátore klesne pod hodnotu U_bat_charged)

Rýchlosť hľadania optimálnej hodnoty PWM je závislá najmä od zvolenej hodnoty wait_ms() na koniec programu a zvoleného kroku PWM pwm_step. Vypisovanie na displej je možné vykonávať iba n-tý krát počas behu programu, čím sa zvýši rýchlosť stavového automatu.

int main()
{
 
    lcd_backlight.period_us(perioda_pwm);
    Pwm_Mos.period_us(perioda_pwm);
    lcd_backlight.pulsewidth_us(backlight);
 
    lcd.locate(0,0);      
    lcd.printf("-PWM  REGULATOR-");
    lcd.locate(0,1);
    lcd.printf("I. Sieklik v1.0");
    wait(2);
 
 
 
    while(1) {
 
        measurement();
 
        //----------------------------------------------------------------------
        if (Ubat<U_bat_limit || Ibat<=I_batMaxDischarge) { // load skrat  alebo nevhodna bateria 
 
            mode=0;
            pwm=0;
            Pwm_Mos.pulsewidth_us(pwm);               
            Switch_Load = 0;
 
        } else {
            Switch_Load = 1;
        }
        //----------------------------------------------------------------------
        if (Ubat>=U_bat_limit && Ubat<U_bulk_limit && mode!=3) {             // nabijanie konstantym prudom
 
          mode=1;
 
            if (Usol>=U_sol_limit && Ibat <= I_1C && Istep<= I_StepMax) {   // Panel pracuje v pasme efektivity nad 15V a zaroven nebol prekroceny Max nabijaci prud a MAX prud step-downu
                                                                            // Udrzuje sa konstaný prúd 1C
 
                Pwm_Mos.pulsewidth_us(pwm_up(pwm_step,max_pwm_width_us));
 
            } else {
                Pwm_Mos.pulsewidth_us(pwm_down(pwm_step,min_pwm_width_us));
            }
        }
        //----------------------------------------------------------------------
        else if (Ubat>=U_bulk_limit && mode!=3 ){  // nabijanie konstantym napatim
                                       // napatie vystupa nad hodnotu U_bulk_limit
 
            mode=2;
 
            if (Usol>=U_sol_limit && Ubat<=U_abso_limit && Istep<= I_StepMax && Ibat<=2*I_1C) {   // Panel pracuje v pasme efektivity nad 15V a zaroven nebol prekroceny Max nabijaci prud a MAX prud step-downu
 
                Pwm_Mos.pulsewidth_us(pwm_up(pwm_step,max_pwm_width_us));
 
            } else {
 
                Pwm_Mos.pulsewidth_us(pwm_down(pwm_step,min_pwm_width_us));
            }           
         }
 
        if (Ibat<=0.1*I_1C && pwm >= (max_pwm_width_us - min_pwm_width_us)/2 && mode==2) { // nabita bateria je vtedy ak je napatie udrziavane na konstantej hodnote  a prud klesne pod 10% z I_1C a pritom ho neobmedzeuje prikon z solar panelu
 
            mode=3;                    
            pwm=0;   
            Pwm_Mos.pulsewidth_us(pwm);
 
             //---------vypis nabita---------
             lcd.cls();
             lcd.locate(0,0);
             lcd.printf("--Battery FULL--");
             lcd.locate(0,1);
             lcd.printf("%4.2f", Ubat);
             wait(3); 
             //------------------------------
         }        
 
         if (Ubat<=U_charged_limit && mode==3) {mode=0;}
 
 
 
        //----------------------------------------------------------------------                 
        if (mode!=3){    // ak nieje nabita vypis aktualne hodnoty  
 
          display(Ubat,Usol,Ibat,Istep,pwm,mode);        
        }
 
        wait_ms(400);
    }
}

Ukázkové video


Súčasťou vide je demonštrácia módu 2 - nabíjanie konštantným napätím. Krok PWM (pwm_step=5) a rýchlosť jeho zmeny je zámerne spomalená s obnovovacou periódou približne 400ms z dôvodu zreteľnosti zmeny parametrov na LCD displeji. Na videu je možné sledovať snahu regulátora udržať konštantné napätie Ubat na hodnote 12,30V so zmenou hodnoty PWM. Jemnosť kroku PWM je možné zvoliť (1 až 255 alebo 1 až 65535 podľa vlastností časovačov použitého mikroprocesora). Na videu je demonštrovaný proces nabíjania bez pripojenej záťaže Iload=0, nakoľko počas nahrávania videa boli nepostačujúce svetelné podmienky. Solárny panel nieje na videu uvedený ale bol využitý panel uvedený na obr.3.


Záver

Výsledkom semestrálneho projektu do predmetu MPOA je funkčný PWM regulátor, ktorý vyhovuje všetkým uvedeným požiadavkám v zadaní. Pre správnu funkciu je však kľúčové presne merať všetky parametre systému (napätie, prúd). Využitie halovej sondy prináša výhodu merania oboch polarít pretekajúceho prúdu, ale značnou nevýhodou je meranie malých prúdov v okolí nulovej hodnoty (značná hysterézia). PWM regulátor by molo možné doplniť o viaceré nadstavbové funkcie ako napríklad meranie teploty akumulátoru alebo taktiež o hľadanie bodu maximálneho výkonu solárneho panelu (MPPT), čím by vznikol plnohodnotný MPPT regulátor. Ďalším návrhom na vylepšenie by mohla byť tvorba užívateľského prostredia, kde by si užívateľ mohol zvoliť parametre a regulátor autonómne nastaví potrebné parametre nabíjania. Spomenuté úpravy sú v procese vývoja ale žiaľ spadajú mimo časový limit riešenia semestrálneho projektu.

DOWNLOAD mpoa.rar

2016/solar-reg.txt · Poslední úprava: 2017/01/14 16:25 autor: Ivan Sieklik