pondělí 25. července 2016
Měnič 48 / 230V verze 2
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
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.
S namontovaným chladičem
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:
I_alpha = I_a;
I_beta = (I_a + 2*I_b);
I_beta = I_beta*57735/100000;
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
Jedná se o prototypovou konstrukci měniče z akumulátorů 48V na síťové napětí 230V.
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.
MPPT pro 48V 500W systém
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;
}
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
}
úterý 10. února 2015
MPPT pro malý 12V systém
Vstupní napětí max 25V
Proud max 2A
Účinnost DC/DC měniče 96%
Vlastní spotřeba za tmy 8mW
za malého svitu 80mW
při běhu měniče 260mW
Zapojení má dále tu vtipnou vlastnost, že funguje i bez osazeného procesoru jako lineární nabíjecí regulátor pomocí TL431, který je zde jako pojistka proti selhání řízení.
https://drive.google.com/file/d/0B_f6QgG2BE_kREh5cXVtV2w4S0E/view?usp=sharing
13.5.2020
MPPT je stále v provozu, Pb akumulátory jsem nahradil leteckými NiCd, takže bylo třeba zvýšit nabíjecí napětí na 14V. Nové verze SW zde: https://drive.google.com/file/d/19UyP1mWQg_Mf9UkC1G4N9SrYQh02F5g6/view?usp=sharing
11.7.2021
Při přepojování společného rozvaděče mi spadl drát od 48V baterek do mínusu panelů 12V systému, přes bočník protekl proud co přepálil 10A pojistku, všechno zdánlivě fungovalo, ale po pár dnech jsem si všiml, že se z měniče se odpoledne ozývá pískání, po restartu v pořádku, a tak každý den. Pak mi došlo, že vlastně nesvítí zelená LED ráno, tedy měnič je plně otevřený a neprobudí MCU. Pískání způsoboval ochranný obvod s TL431 když stouplo napětí na baterkách. Nadproud zničil T3 a ráno se MCU vždy uspal a při nárůstu proudu znovu neprobudil. Po výměně T3 vše opět funguje.
Literatura:









