====== 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: - Pod-vybitie akumulátora - Prebíjanie akumulátora - Prekročenie max nabíjacieho prúdu - Prekročenie max. vybíjacieho prúdu pripojenou záťažou - Zabezpečenie vhodných pracovných podmienok pre solárny panel - 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]] ) {{ :2016:lion_charge.jpg?direct&500 |}} 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 16x02. K napaľovaniu softvéru je využívaný modul FTDI232 zobrazený na obrázku nižšie. {{ :2016:arduino_stm32f103c8t6.jpg?direct&300 |}} 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% {{ :2016:step.jpg?direct&300 |}} 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 {{ :2016:p2160289.jpg?direct&300 |}} 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. {{ :2016:bateriamini.png?direct&400 |}} 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. {{ :2016:bateriabig.png?direct&400 |}} 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). {{ :2016:mpoa_schema.png?direct |}} 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 ==== 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 && Ubat=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. {{youtube>FL2WGumVBf0?medium}} ---- ===== 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 {{ :2016:mpoa.rar |}}