sobota 6. srpna 2016

Analogový měnič 48/230V s plechovým transformátorem

Varování: Příspěvek není návodem ale inspirací pro možný návrh podobného zařízení kvalifikovanou osobou případně pod dozorem jako školní projekt. Obsahuje části pod napětím životu nebezpečným. Autor nenese odpovědnost za újmy na zdraví nebo majetku vzniklé v souvislosti s následujícím příspěvkem. Autor si vyhrazuje právo příspěvek kdykoli změnit. 

Byl jsem požádán o návrh měniče 48/230V s plechovým transformátorem, robustní řešení, pokud možno bez procesoru.
Po úvodních nezdarech a několika otestovaných řešení, pokusů o co nejúspornější řešení z pohledu počtu součástek a bohužel i několika proražených můstcích a driverů jsem dospěl k jednomu dostatečně bytelnému řešení.

Analogový generátor sinusovky
Byl nápad použít generátor XR2206, ovšem ten jsem zavrhl především kvůli vysoké ceně a potom také kvůli divnému chování a to ujíždění střední hodnoty při změně amplitudy. Nicméně do výsledného zapojení se bezproblému dá přivést signál z libovolného generátoru, pouze nutmo myslet na to, že jeho amplituda je referencí pro výstupní napětí.
Nakonec jsem zůstal opět u Wienova můstku. Na něm je stále co vylepšovat, ovšem cílem byla jednoduchost a jedním nekompromisním způsobem, jak získat kvalitní sinusovku z mála součástek se ukázalo použití germaniových diod jako stabilizátoru amplitudy. Germaniový přechod má mírně odlišnou charakteristiku od křemíkového.
Vzhledem k teplotní závislosti Ge přechodu je vhodnější použít Schottku např. BAT48. Napětí výstupu pak neujíždí při změnách teploty na desce a sinusovka je stejně dobrá. Jde o to, aby úbytek na nelineárním prvku byl malý vzhledem k amplitudě výstupního napětí, pak tento úbytek způsobuje jen malé zkreslení.
Přičinnou nestability nebyly jen Ge diody ale především mnohaotáčkový trimr. Doplněn o paralelní odpor potlačující vliv trimru a napětí drží.

Driver H mostu
Nejprve jsme hledal jeden IO pro celý H můstek. Byl tu velmi hezký nápad použít IRS2453, což je vlastně čtyřkanálová obdoba IR2153. Nápad spočíval v tom řídit ho v režimu sigma-delta modulace injektáží proudu do časovacího kondenzátoru. To sice funguje velmi pěkně, ale pokud se injektáž provádí napětím přes odpor, pak není výstupní střída lineární s přiváděným napětím. Prakticky to má za následek obtížné využití rozsahu modulace, můstek dává malý rozkmit napětí. Takové zapojení si nicméně vystačí pouze s IRS2453 a jedním OZ jako zdrojem sinusovky. Schemata pro zajímavost na konci.

Další volbou byl HIP4080. Obsahuje na rozdíl od HIP4081 komparátor, který opět ušetří počet součástek. Zjistil jsem ale, že dodaný je přeznačený HIP4081, takže jsem komparátory musel dát externí. Zapojení fungovalo, výhodou je interní generátor deadtimu. Nicméně jsem při zapnutí zdánlivě bezdůvodně několikrát přišel o můstek zřejmě absencí obvodu pomalého náběhu nebo proudového omezení. Obvod také docela topí při buzení výkonnějších tranzistorů.

Cílem bylo nakonec budit i páry IRFP4110 např. takže jsem zvolil výkonnější drivery a to IRS21864, což je 14 nohá verze IRS2186, větší pouzdro má povolenou větší výkonovou ztrátu, proud 4A. Zapojení se tedy rozšířilo o externí obvod deadtimu z CMOS 4093, Schmitt NAND.

DC-offset
Plechové trafo, ale vlastně síť obecně, protože tam vždy nějaké jádro je, potřebuje nulovou stejnosměrnou složku. U procesorového řízení je to samozřejmost a nemusí se vůbec řešit, protože přesnost délky pulzů je daná pouze přesností driverů. U analogového řešení to vůbec samozřejmé není.
DC-servo je perfektní zapojení pro zesilovače, ale zde vzniká problém s velkou časovou konstantou RC článků nutných pro správnou funkci, někdy se musí nabít a musí se nabít signálem přímo z běžícího můstku pokud hrozí že deadtime nebude shodný na všech kanálech. Trafo se ale nedá s offsetem spustit, za můstkem by muselo být silové relé a čekat na ustálení DC serva.

Trimr na manuální ladění nemá smysl, vždy se nakonec začně přesycovat. To se nejlépe pozná podle zvuku z trafa a narůstajícího klidového proudu.

Řešením se ukázalo především nahradit LM324 vhodnějším a rychlejším LF347, který má symetrický koncový stupeň. Generátor trojúhelníku s ním tedy má střední hodnotu v polovině napájecího napětí, jako Wienův můstek. To u LM324 nenastane.

Nicméně na odstranění případného offsetu se zde podílí hlavně PI regulátor, výhoda oproti DC servu je rychlost správného nastavení.

Unipolární vs. Bipolární modulace
Jedná se o dva odlišné způsoby modulování PWM H můstku. Bipolární je prosté vzájemné invertování obou polomůstků. Pravý horní je buzen stejným signálem jako levý dolní atd..
Podle literatury je ale pro můstek se sinusovou modulací vhodnější unipolární řízení, kdy se invertuje nikoli PWM, ale vstupní analogový signál. Produkuje méně harmonických. Při kladné půlvlně např. se přepíná podle PWM pouze pravý můstek zatímco levý má sepnutý dolní trvale. Při záporné půlvlně je pravý horní sepnutý a PWM se pustí do levého polomůstku, ovšem inverzně.

Dalším vylepšením je myšlenka, že by se jeden polomůstek mohl spínat obdelníky 50Hz a sinusovku by dotvářel druhý můstek. Výsledkem je výrazné omezení spínacích ztrát, protože spínací frekvence PWM je obvykle minimálně o dva řády větší než síťová.

Zde je nutno si uvědomit, že při přepnutí můstku buzeného pouze 50Hz obdelníky je třeba na druhé straně ihned invertovat PWM, aby transformátor viděl příslušnou půlvlnu správného tvaru.
Jednoduchým řešením je prostě posouvat trojúhelníkový signál o výšku amplitudy tak, jak je na snímku osciloskopu dole.

Posun se zde ve schematu realizuje děličem R12, R13. Jejich poměr musí odpovídat poměru R5 a R9. Nicméně PI regulátor to dorovná i při odlišných hodnotách.

Proudové omezení je velmi primitivní a slouží především k bezpečnému startu měniče. Jinak nemá praktický význam protože jiný než odporový spotřebič by při snížení napětí vzal ještě větší proud.

Napětí 13,5V je jednoduše získáno lineárním stabilizátorem s proudovým omezením na 300mA, který zachrání drivery při průrazu můstku.

Tlumivky
Pokud se staví měnič z 12V, tak rozptylová indukčnost transformátoru obvykle stačí na dostatečné vyhlazení proudu. Pokud se stejné zapojení aplikuje na 48V zjistíme, že plechovým trafem prochází až příliš ochotně přímo PWM a přidání vyhlazovacího kondenzátoru na výstup způsobí překvapivé velmi rychlé přehřívání primáru 300VA trafa naprázdno prostě jalovým proudem vysoké frekvence.
Vyhlazovací tlumivky jsou nutnost, rozptylová indukčnost trafa nestačí. Jako jádra vyhoví železoprachové toroidy např z PC zdrojů.
Zde se uplatní výhoda unipolární modulace a to v tom, že zvlnění proudu na spínací frekvenci vyjde pro stejnou tlumivku poloviční než při bipolární, protože druhá polovina můstku drží, nepřipíná opačnou polaritu, tlumivka vidí poloviční VF napětí.

Schema

 Finální konstrukce v šasi

Porovnání s měničem s feritovými trafy

 Běh s 300VA 220/24V transformátorem na tenkých M plechách

 Posuv trojúhelníkového signálu na komparátoru

 Výstupní sinusovka měřená přímo na sekundáru trafa.

 Ladění s malým toroidem 230/30V

Provizorní chladič, testování v zátěži 300W
Video v zátěži

Závěr
První vývojové verze díky deformovanému průběhu, nebo přesycování trafa způsobovaly poměrně něpříjemný hluk z trafa to, že měnič funguje správně se pozná tak, že trafo ztichne takřka úplně. V sestaveném prototypu vznikají zatím největší ztráty na železoprachových tlumivkách. Ztráty na polovodičích jsou menší než u měniče s feritovými trafy, který jsem stavěl předtím hlavně díky absenci vysokonapěťového střídače.
Řešení zpětné vazby z primáru trafa přináší kompaktní provedení, deska má pouze 4 dráty, vstup a výstup, ale nutností je tvrdé trafo. Je počítáno s toroidem.
Stabilizace amplitudy Wienova článku se dá řešit jinak a lépe, ale zde nabízí hezké uplatnění předností germaniových polovodičů.
Literatura:

Pro zajímavost nebo inspiraci přikládám i schemata z předchozích nepříliš úspěšných vývojových variant.




pondělí 25. července 2016

Měnič 48 / 230V verze 2

Varování: Příspěvek není návodem ale inspirací pro možný návrh podobného zařízení kvalifikovanou osobou případně pod dozorem jako školní projekt. Obsahuje části pod napětím životu nebezpečným. Autor nenese odpovědnost za újmy na zdraví nebo majetku vzniklé v souvislosti s následujícím příspěvkem. Autor si vyhrazuje právo příspěvek kdykoli změnit. 

Jedná se o druhou, finální verzi tohoto: http://arambajk.blogspot.cz/2016/02/menic-48v-230v.html
Na stejnou desku jsem osadil odlišné výkonové součástky. Mosfety IRFP4568 a do střídače IGBT IRGP4068, pro přesnější měření Rail to rail OZ AD8656.

Dále jsem navinul tlumivku o trojnásobné indukčnosti, což umožnilo provoz střídače na 32kHz a výrazně snížilo ztráty na IGBT i úbytek napětí vlivem deadtimu.

Měnič se chová lépe, a tak jsem dokončil šasi a z pototypu udělal hotové zařízení.

Aktuálním problémem je fakt, že se jedná o zdroj velmi tvrdé sítě hlavně díky dvojité tlumivce na jediném jádru, takže připojení spotřebičů se spínaným zdrojem bez softstartu, které se bohužel občas vyskytují není možné. Je třeba udělat tlumivky oddělené, protože je počítáno s tím, že síť vždy nějakou minimální indukčnost má.

Do následující verze také plánuji galavanické oddělení vstupu od řízení a řízení od výstupu, což omezí možný vznik zemních smyček.








Závěr:
Dalším zlepšením bude galvanické oddělení řídící části od silové a také oddělení baterek od výstupního napětí. Vyhlazovací kondenzátory výstupního napětí bude možno připojit až za bočník, tedy bude lépe fungovat měření proudu výstupním můstkem, tam je také vhodné dodat zesilovač.

3kW verze s galvanickým oddělením je ve stádiu návrhu.

čtvrtek 18. února 2016

DTC - Přímé řízení momentu asynchronního motoru

Varování: Příspěvek není návodem ale inspirací pro možný návrh podobného zařízení kvalifikovanou osobou případně pod dozorem jako školní projekt. Obsahuje části pod napětím životu nebezpečným. Autor nenese odpovědnost za újmy na zdraví nebo majetku vzniklé v souvislosti s následujícím příspěvkem. Autor si vyhrazuje právo příspěvek kdykoli změnit. 

DTC – Direct Torque Control, přímé řízení momentu. Jedná se o hysterezní metodu řízení toku a momentu určenou především pro asynchronní motory s kotvou nakrátko. Verze popsaná zde vychází z U1 – I modelu.
Schema
 Obr. 1: Blokové schema

1) Měření proudu

Prostorový vektor:



Platí:







Složky proudu získáme měřením ve dvou fázích pomocí transformace Clarkové:



 , kde K volíme 2/3, dále pro vinutí bez vyvedeného středu platí




Výsledné výpočty obsažené v bloku transformace potom:





2) Měření napětí

Složky napětí získáme podle aktuální kombinace sepnutí obdobným způsobem jako složky proudu z napětí meziobvodu UM:





3) Výpočet toků:

Bloky realizují integraci napětí v čase.





Velikost toku je potom:



4) Výpočet momentu:

Bloky násobiček a sčítačka dají výsledný moment, který je třeba korigovat konstantou inverzní k té, co byla zanesena v bloku výpočtu složek proudů.
 
, kde pp je počet pólpárů.


5) Přepínací tabulka

Její výstupy přímo řídí konfiguraci sepnutí tranzistorů v třífázovém můstku. Na vstupech má hysterezní regulátory toku a momentu.
 
Obr. 2: Přepínací tabulka

Hysterezní regulátor toku rozhoduje o tom, kdy se má přepnout na následující prostorový vektor.
 



Pro menší žádaný tok se přepíná dříve a prostorový vektor se tedy pohybuje po menším šeštiúhelníku. Pro větší naopak. Cyklickým přepínáním pracovních oblastí je dosaženo točivého magnetického pole. Tokové vektory působí kolmo k cívkám statoru.

Hysterezní regulátor momentu potom rozhoduje o tom, jestli budou tranzistory sepnuté do aktivního stavu 1 až 6 nebo do konfigurace nulového fázového napětí, tedy stavu 0 nebo 7 podle toho, který je dosažen jediným přepnutím. Tímto řízením je v rámci hystereze dosažen konstantní, kruhový průběh momentu.

Výstupem přepínací tabulky jsou potom tři logické signály každý pro jednu fázi rozhodující o tom, jestli je sepnutý horní nebo dolní tranzistor v dané fázi.

6) Třífázový můstek

Tranzistory, nejčastěji IGBT, zajišťují rozstřídání stejnosměrného napětí meziobvodu podle signálů z přepínací tabulky na jednotlivé fáze asynchronního motoru. Uvedené schema je velmi zjednodušené, pouze pro definování polarity řídících signálů, chybí např. generování deadtimu.

Obr. 3: zjednodušené schema třífázového můstku
Závěr:
Z principu je patrné, že tranzistory nejsou řízeny PWM s fixní spínací frekvencí. Jak často dochází k přepínání je dáno především nastavením hystereze regulátoru momentu, který opakovaně spíná a vypíná aktivní a pasivní stav v oblasti, kde se dle přepínací tabulky zrovna nachází prostorový vektor a tím se snaží udržet žádaný moment motoru.

Šestiúhelník je možno zvětšovat až do maximálního omezeného napětím meziobvodu. Dále pak motor při vyšších otáčkách samovolně přechází do režimu odbuzování, tedy klesá moment.

Realizace v MCU
Chtěl jsem ze zvědavosti zkusit realizovat výpočet uvedený výše, který je vlastně přepisem odevzdávaného protokolu, v MCU na prototypové desce s 3f můstkem, který jsem do té doby používal se skalární regulací. Zde je schema, pár fotek a videa, jak to zatím vypadá. V příloze pak kousek upraveného kódu.




S namontovaným chladičem

Úvodní video ze začátků ladění, aneb když to konečně začalo nějak fungovat



Příloha:
Z průbehu vypočteného toku je vidět, že algoritmus nefungoval úplně koretně ještě a vnášel tam jistý offset. (vykresleno přímo z dat přenesených z MCU)

Příloha:
/* Transformace */
        I_alpha = I_a;
        I_beta = (I_a + 2*I_b);
        I_beta = I_beta*57735/100000;
/* Stanoveni fazovych napeti */
        switch(vektor)
        {
            case 0:
            {
                U_alpha = 0;
                U_beta = 0;
            }
            break;
            case 1:
            {
                U_alpha = U_m;
                U_beta = 0;
            }
            break;
            case 2:
            {
                U_alpha = U_m/2;
                U_beta = U_m*86603/100000;
            }
            break;
            case 3:
            {
                U_alpha = -U_m/2;
                U_beta = U_m*86603/100000;                
            }
            break;
            case 4:
            {
                U_alpha = -U_m;
                U_beta = 0;
            }
            break;
            case 5:
            {
                U_alpha = -U_m/2;
                U_beta = -U_m*86603/100000;
            }
            break;
            case 6:
            {
                U_alpha = U_m/2;
                U_beta = -U_m*86603/100000;
            }
            break;
            case 7:
            {
                U_alpha = 0;
                U_beta = 0;
            }
            break;
        }
        
    /* Vypocet slozek toku    */    
    psi_alpha = psi_alpha + U_alpha - I_alpha/Gs;
    psi_beta = psi_beta + U_beta - I_beta/Gs;     
    
    /* Vypocet toku    */
    psi_druha = psi_alpha*psi_alpha + psi_beta*psi_beta; //druha mocnina psi
    
    /* Vypocet druhe odmocniny */
    psi_b = 1 << (32-2);
  psi = 0;
  while (psi_b != 0)
    {
    if (psi_druha >= psi + psi_b)
        {
      psi_druha -= psi + psi_b;
      psi += psi_b << 1;
    }
    psi >>= 1;
        psi_b >>= 2;
  }
    
    /* Vypocet momentu */
    moment = (psi_alpha*I_beta/154 - psi_beta*I_alpha/154)*3/2; //130*154=20kHz => mNm
    
    /* Vyber sektoru */
    switch(sektor)
    {
        case 0:
        {
            if(psi_beta*1732 > psi_alpha*1000)
            {
                sektor = 1;
                otacky++;
            }
            if(-psi_beta*1732 > psi_alpha*1000)
            {
                sektor = 5;
                otacky--;
            }
        }
        break;
        case 1:
        {
            if(psi_alpha < 0)
            {
                sektor = 2;
                otacky++;
            }
            if(psi_beta*1732 < psi_alpha*1000)
            {
                sektor = 0;
                otacky--;
            }
        }
        break;
        case 2:
        {
            if(psi_beta*1732 < -psi_alpha*1000)
            {
                sektor = 3;
                otacky++;
            }
            if(psi_alpha > 0)
            {
                sektor = 1;
                otacky--;
            }
        }
        break;
        case 3:
        {
            if(psi_beta*1732 < psi_alpha*1000)
            {
                sektor = 4;
                otacky++;
            }
            if(psi_beta*1732 > -psi_alpha*1000)
            {
                sektor = 2;
                otacky--;
            }
        }
        break;
        case 4:
        {
            if(psi_alpha > 0)
            {
                sektor = 5;
                otacky++;
            }
            if(psi_beta*1732 > psi_alpha*1000)
            {
                sektor = 3;
                otacky--;
            }
        }
        break;
        case 5:
        {
            if(-psi_beta*1732 < psi_alpha*1000)
            {
                sektor = 0;
                otacky++;
            }
            if(psi_alpha < 0)
            {
                sektor = 4;
                otacky--;
            }
        }
        break;
    }
    
    /* Regulator toku */
    psi_delta = psi_zadane - psi;
    if(psi_delta > psi_epsilon)
    {
        psi_hystereze = 1; //tok nahoru
    }
    if(psi_delta < -psi_epsilon)
    {    
        psi_hystereze = 0; //tok dolu
    }
    
    /* Regulator momentu */
    moment_delta = moment_zadany - moment;
    switch(psi_stav)
    {
        case 0:
        {
            if(moment_delta > moment_epsilon)
            {
                psi_stav = 1;
            }
            if(moment_delta < -moment_epsilon)
            {
                psi_stav = 2;
            }
            moment_hystereze = 0;
        }
        break;
        case 1:
        {
            if(moment_delta <= 0)
            {
                psi_stav = 0;
            }
            moment_hystereze = 1; //moment nahoru
        }
        break;
        case 2:
        {
            if(moment_delta >= 0)
            {
                psi_stav = 0;
            }
            moment_hystereze = -1; //moment dolu, nemame kam rekuperovat
        }
        break;
    }
    
    /* Prepinaci tabulka */
    if(psi_hystereze) //tok nahoru
    {
        if(moment_hystereze == 0)
        {
            vektor = 0; //lichy do nul, sudy do jednicek
        }
        if(moment_hystereze == 1)
        {
            vektor = 1 + (6 + sektor + 1)%6; //dopredu ven
        }
        if(moment_hystereze == -1)
        {
            vektor = 1 + (6 + sektor - 1)%6; //zpet ven
        }
    }
    else
    {
        if(moment_hystereze == 0)
        {
            vektor = 0;
        }
        if(moment_hystereze == 1)
        {
            vektor = 1 + (6 + sektor + 2)%6; //dopredu dovnitr
        }
        if(moment_hystereze == -1)
        {
            vektor = 1 + (6 + sektor - 2)%6; //zpet dovnitr
        }
    }
    
    /* Zapis do komparacnich jednotek 3f mustku */
        switch(vektor)
        {
            case 0:
            {
                TIM1->CCR1 = 0;
                TIM1->CCR2 = 0;
                TIM1->CCR3 = 0;
            }
            break;
            case 1:
            {
                TIM1->CCR1 = 4200;
                TIM1->CCR2 = 0;
                TIM1->CCR3 = 0;
            }
            break;
            case 2:
            {
                TIM1->CCR1 = 4200;
                TIM1->CCR2 = 4200;
                TIM1->CCR3 = 0;
            }
            break;
            case 3:
            {
                TIM1->CCR1 = 0;
                TIM1->CCR2 = 4200;
                TIM1->CCR3 = 0;
            }
            break;
            case 4:
            {
                TIM1->CCR1 = 0;
                TIM1->CCR2 = 4200;
                TIM1->CCR3 = 4200;
            }
            break;
            case 5:
            {
                TIM1->CCR1 = 0;
                TIM1->CCR2 = 0;
                TIM1->CCR3 = 4200;
            }
            break;
            case 6:
            {
                TIM1->CCR1 = 4200;
                TIM1->CCR2 = 0;
                TIM1->CCR3 = 4200;
            }
            break;
            case 7:
            {
                TIM1->CCR1 = 4200;
                TIM1->CCR2 = 4200;
                TIM1->CCR3 = 4200;
            }
            break;
        }
    }


neděle 7. února 2016

Měnič 48V / 230V

Varování: Příspěvek není návodem ale inspirací pro možný návrh podobného zařízení kvalifikovanou osobou případně pod dozorem jako školní projekt. Obsahuje části pod napětím životu nebezpečným. Autor nenese odpovědnost za újmy na zdraví nebo majetku vzniklé v souvislosti s následujícím příspěvkem. Autor si vyhrazuje právo příspěvek kdykoli změnit. 

Jedná se o prototypovou konstrukci měniče z akumulátorů 48V na síťové napětí 230V.
Cílem bylo postavit tichý měnič s pasivním chlazením o výkonu 500W až 1kW.
Základní topologie na následujím schematu:

Vyhlazovací tlumivku v napěťovém meziobvodu jsem zatím vypustil kvůli překmitům na diodách. Výstupní tlumivka je pro jednoduchost konstrukce vinutá na jediném jádru. V tom případě je třeba dát pozor na nutnost invertovaného PWM řízení jednoho z koncových polomůstků při takovéto oriantaci vinutí.
Řízení obou můstků obstarává procesor ARM Cortex M3 - STM32F103C8T6
Jako zpětná vazba je bráno napětí z meziobvodu, což se ukázalo jako nedostatečné vzhledem k úbytkům vznikajícím na výstupním můstku a tlumivce. Bylo by lépe měřit přímo výstupní střídavé napětí.
Dále jsou měřeny proudy obou můstků bočníky v sourcech dolních mosfetů a IGBT.
Napájení driverů a procesoru obstarává pomocný zdroj se starým obvodem 5H0365R, dává 5V a 15V.
Schema řízení:

Pár fotek:
 Desky z DirtyPCB's přišly na Vánoce a vypadají velmi nadějně
 První prototyp osazen
Montáž na provizorní šasi

 Pohled na transformátor a tlumivku. Diody se na desku rozměru 10x10cm také nevešly, takže jsou vpravo nahoře pospojovány dráty.
Ladění
Výstupní sinusovka na zátěži 100W.

Závěr:
Osazená deska úspěšně funguje na první pokus bez úprav až na drobné změny hodnot součástek. Ovšem s laděním SW to bylo úplně naopak. Velmi nemile mě překvapily mosfety IRFP2907. Oproti IRFP4568 se kterými jsem pracoval předtím a šlapaly naprosto parádně i na 40kHz s minimálním deadtimem 30ns prakticky studené a příčný proud v řádu mA. Tak IRFP2907 ačkoli, to z datasheetu při porovnání s předchozími přímo neplyne, tak jsou velmi, velmi pomalé. Nakonec jsem se musel spokojit s frekvencí 32kHz a deadtimem šílených 300ns a přesto tam teče příčný proud a můstek trochu hřeje i při malé zátěži. Do příští verze už mám opět připraveny IRFP4568.
Obdobný problém byl s výstupními IGBT. Na použitou tlumivku se už prostě nevešlo víc závitů, indukčnost kvůli pevné mezeře nebylo možno ani experimentálně zvětšit, a tak jsem musel zvýšit frekvenci až na 80kHz. IGBT potřebují cca 300ns deadtime, aby byly ztráty naprázdno při tomto napětí rozumné, což je ovšem už 10% periody. Příliš mnoho. Díky tomu jsem musel zvednout napětí meziobvodu na 350V abych dostal aspoň 220V střídavých v zátěži na výstupu. Frekvence je ale příliš vysoká a výstupní můstek docela topí. Celkové ztráty měniče naprázdno jsou 15W. Ale už mám také připraveny lepší polovodiče a navinu větší tlumivku.

MPPT pro 48V 500W systém

V rámci školní zakázky se mi podařilo nechat vyrobit desku pro navržený MPPT pro 48V 500W systém.
Jedná se o synchronní buck - boost topologii s jednou tlumivkou. Měnič tedy umožňuje jak snižování, tak zvyšování napětí z panelů.
Řízení obstarává procesor ARM Cortex M3 - STM32F103C8T6
Byl navržen pro nabíjení akumulátorů, základními vstupy jsou napětí akumulátorů a jejich nabíjecí proud. Obsahuje dva regulátory, regulátor žádaného napětí na panelech a jemu nadřazený regulátor napětí akumulátorů. Pokud napětí akumulátorů dosáhne žádané hodnoty 55,7V, regulátor zvyšuje žádané napětí panelů, které tak díky VA charakteristice dávají menší proud. Regulátor tak udržuje dané napětí akumulátorů.
Pokud akumulátory nejsou nabité, regulátor dosazuje jako žádanou hodnotu napětí na panelech napětí vycházející z MPPT algoritmu.
MPPT algoritmus je klasický typ, který hledá bod maximálního výkonu, zde prostě maximální nabíjecí proud tak, že zkouší zvyšovat nebo snižovat žádané napětí panelů a podle změny nabíjecího proudu pokračuje ve snižování resp. zvyšování, nebo obrátí směr, pokud je naměřený proud již menší, než předchozí.
Klíčová je zde především frekvence výpočtu. Při snižování napětí se vybíjí vstupní kapacity měniče a ten tak vždy naměří větší proud, při zvyšování naopak. Je tedy třeba výpočet zpomalit, aby měřil skutečnou změnu danou VA char. panelů. Naopak příliš pomalý výpočet není schopen reagovat na reálné změny jasno/mrak a ustalování by trvalo například až několik minut.
Zvolil jsem synchronní topologii kvůli minimalizaci ztrát. Ovšem její nevýhodou se ukázala absence výstupní diody, která by přirozeně zabránila toku energie z akumulátorů do panelů. Správná funkce je tak závislá právě na SW. Měnič je symetrický z obou stran posazený mezi dva relativně výkonné zdroje resp. spotřebiče a při nevhodném řízení je schopen např. posílat energii z akumulátorů do panelů místo opačně a nebo zkratovat natvrdo jeden nebo druhý vstup.
Zapojení obsahuje jedinou HW ochranu a to proti přebíjení. Při vzrůstu napětí akumulátorů přes 59V se klopným obvodem vypnou oba drivery a měnič bez zásahu procesoru vypne všechny výkonové tranzistory v můstku. Opětovný start je možný jedině restartem napájení z panelů. Buď vypínačem ručmo, nebo automaticky "druhý den ráno".
Napájení driverů a procesoru je řešeno pomocným spínaným zdrojem se starým obvodem 5H0365R, jehož předností je velká úspora součástek, velký vstupní rozsah napětí a velmi malá klidová spotřeba. Přestože se jedná o síťový zdroj, bezproblému pracuje od 15V. Pomocný zdroj dává 5V a 15V.

Schema:

Pár fotek:
 Osazená deska

 Zimní den. Při malém proudu přepne a drží nulový rozdíl napětí, protože algoritmus by již kvůli nedostatečnému rozlišení při malých proudech nemohl fungovat. Při nulovém rozdílu jsou navíc nejmenší ztráty.

 Start s částečně zasněženými panely, které dávaly jen poloviční napětí přes bypass diody, algoritmus naskočil úspěšně za 15 vteřin.

 Pokud hodinu měří nulový proud, vypne můstek a tím i napájení procesoru. Nastartuje znovu další den ráno. (A nebo bohužel hned za pár vteřin pokud ještě není dostatečná tma)

Závěr:
Uvedl jsem zde jedno z mnoha možných řešení MPPT nabíjecího měniče. Článek slouží spíš pro inspiraci nemá být návodem. Můstek je možno řídit mnoha typy procesorů, stejnětak jako SW v něm je čistě na fantazii každého.

Příloha:
/* MPPT algoritmus */
        if(mppt)
//flag
        {
            if(I_aku_avg < I_aku_predchozi)
            {
                add = ~add + 1;
            }
            I_aku_predchozi = I_aku_avg;
            panely_mppt = panely_mppt + add*200;
//0,4V za vterinu
            if(panely_mppt < 32000)
            {
                panely_mppt = 32000;
//dolni limit 32V
                add = ~add + 1;
            }
            if(panely_mppt > 65000)
            {
                panely_mppt = 65000;
//horni limit 65V
                add = ~add + 1;
            }
            mppt = 0;
        }

/* Regulator napeti na akumulatorech */
            Err_aku = U_aku - 55650;
//Max napeti akumulatoru pri nabijeni
            Out_aku = Sum_aku + Err_aku/10;
      
          
 /* Omezovac zadaneho napeti na panelech */
            if(Out_aku > 80000)
            {
                panely_ref = 80000;
            }
            else
            {
                if(Out_aku < panely_min)
                {
                    panely_ref = panely_min;
                }
                else
                {
                    panely_ref = Out_aku;
                }
            }
            Exc_aku = panely_ref - Out_aku;
            Sum_aku = Sum_aku + Err_aku/20 + Exc_aku/20;
      
          
 /* Regulator napeti na panelech */
            Err = U_panely - panely_ref;
            Out = Sum + Err/5;
      
            /* Omezovac stridy */
            if(Out > 30000)
//abychom netopili zelezoprachem tlumivky
            {
                strida = 30000;
//boost
            }
            else
            {
                if(Out < -30000)
                {
                    strida = -30000;
//buck
                }
                else
                {
                    strida = Out;
                }
            }
            Exc = strida - Out;
            Sum = Sum + Err/10 + Exc/10;
          
            
/* Vlozeni stridy do komparacnich jednotek */
            if(strida >= 0)
            {
                TIM1->CCR1 = 775 - strida/100;
//boost menic
                TIM1->CCR2 = 775;
//97,4%
            }
            else
            {
                TIM1->CCR1 = 775;
                TIM1->CCR2 = 775 - ~(strida/100) + 1;
//buck menic
            }