MPPT演算法(恆定電壓、擾動觀察、電導增量)介紹與實現過程
1、太陽能板的特性曲線
太陽能板也叫光伏電池。是通過光電效應,把光能轉換為電能的裝置。
先介紹太陽能板的特性。太陽能的額定引數是在地面光伏元件標準測試條件(STC)條件下測量得到的。
STC有三個條件:第一、光線通過大氣的實際距離為大氣垂直厚度的1.5倍。第二、指標準測試太陽電池的光線的輻照度為1000W/m2。第三、在25ºC的溫度下工作。
STC條件會影響光伏電池的開路電壓和短路電流。有補償公式。以下是用Matlab或者Octave繪製光伏電池特性曲線的程式碼。其中額定值可以通過規格書查詢得到,這裡影響曲線的可以修改的引數有:1、到達太陽能板表面的太陽輻射為Sref;2、太陽能板工作溫度為25攝氏度。開路電壓Uoc,短路電流Isc,最大功率時電壓Um,最大功率時電流Im。a、b、c都是經驗值,經過補償後就可得到修正後的開路電壓Uoc_comp和短路電流Isc_comp。
clear clc %----------------------------------------------- %----------------------------------------------- %pannel in series %first pannel S_1=1000; Tair_1=25; Sref=1000; %1000W/m^2 Tref=25; %25degree celcius Uoc=44.2; Um=35.4; Isc=5.29; Im=4.95; a=0.00255; b=0.55; c=0.00285; T_1 = Tair_1 + 0.028*S_1; T_delta_1 = T_1 - Tref; S_delta_1 = S_1/Sref - 1; Isc_comp_1 = Isc*S_1/Sref*(1+a*T_delta_1); Uoc_comp_1 = Uoc*(1-c*T_delta_1)*log(e+b*S_delta_1); Im_comp_1 = Im*S_1/Sref*(1+a*T_delta_1); Um_comp_1 = Um*(1-c*T_delta_1)*log(e+b*S_delta_1); C2_1=(Um_comp_1/Uoc_comp_1-1)*(log(1-Im_comp_1/Isc_comp_1))^(-1); C1_1=(1-Im_comp_1/Isc_comp_1)*exp(-Um_comp_1/(C2_1*Uoc_comp_1)); U_1=0:0.01:Uoc_comp_1; Iph_1=Isc_comp_1*(1-C1_1*(exp(U_1/(C2_1*Uoc_comp_1))-1)); figure(1) plot(U_1,Iph_1,'r') xlabel('U/V') ylabel('I/A') title('U-I') figure(2) P_ss = U_1 .* Iph_1; plot(U_1,P_ss) xlabel('U/V') ylabel('P/W') title('U-W')
(a) 電壓-電流特性曲線 | (b) 電壓-功率特性曲線 |
曲線上,每一個點都是光伏電池的工作點。即,光伏電池在正常工作時,假如不是外部因素的改變,得到光伏電池的工作電壓,即可在曲線中獲得光伏電池的電流、功率。
從電壓-功率特性曲線可看出,在當前的環境條件下,太陽能板的最大輸出功率為曲線的峰值。這是太陽能板達到最大的能量轉換效率。由於能量守恆,太陽能板獲得的光能為其輸出的電能加上發熱量。因此需要通過控制太陽能板的工作電壓或者工作電流,讓太陽能板工作在最大功率點。這種演算法叫最大功率點跟蹤(Maximum Power Point Tracking)
2、固定電壓法
根據經驗,單節太陽能板的最大功率點,都在開路電壓Uoc的0.78倍附近。在模擬程式碼中,先是固定溫度為25℃,更改光照,得到了一組曲線。而後,固定光照,更改工作溫度得到了另一組曲線。
下圖中,光伏電池工作在25℃,光照分別是1000W/m2(橙色)、800W/m2(紅色)、600W/m2(藍色)。
(a) 電壓-電流特性曲線 | (b) 電壓-功率特性曲線 |
下圖中,光照設定為1000W/m2,工作溫度分別是25℃(藍色)、45℃(紅色)、65℃(橙色)。
(a) 電壓-電流特性曲線 | (b) 電壓-功率特性曲線 |
上面曲線可知,就算開路電壓改變,最大功率點的電壓除以曲線的開路電壓,結果都是比較接近0.78的。
3、MPPT-P&O演算法
P&O中文名字是擾動-觀察法。
從P-V曲線可見,可通過控制電壓的方法讓光伏電池達到最大功率點。演算法的實現,依據了以下公式:
當dP>dU時,工作點在最大功率點左邊,需要增加工作電壓。
當dP<dU時,工作點在最大功率點右邊,需要減少工作電壓。
當dP=dU時,達到最大功率點。
以下兩個流程圖摘自《獨立式光伏發電系統最大功率點跟蹤演算法研究_張淼》。
從P-V曲線可知,在最大功率點左邊,斜率較小。改變固定的電壓,功率改變較小。而最大功率點右邊,斜率較大。因此可以演算法上,在最大功率點左邊,選擇一個較大的電壓步長;而在最大功率點右邊,選擇一個較小的電壓步長。可加快跟蹤效果。
實現方法程式碼全摘自TI的ControlSuite之中的Solar Lib(安裝好controlSuite後,路徑是ti\controlSUITE\libs\app_libs\solar\v1.2\float\):
//*********** Structure Definition ********//
typedef struct {
float32 Ipv;
float32 Vpv;
float32 DeltaPmin;
float32 MaxVolt;
float32 MinVolt;
float32 Stepsize;
float32 VmppOut;
float32 DeltaP;
float32 PanelPower;
float32 PanelPower_Prev;
int16 mppt_enable;
int16 mppt_first;
} MPPT_PNO_F;
//*********** Structure Init Function ****//
void MPPT_PNO_F_init(MPPT_PNO_F *v)
{
v->Ipv=0;
v->Vpv=0;
v->DeltaPmin=(0.00001);
v->MaxVolt=(0.9);
v->MinVolt=0;
v->Stepsize=(0.002);
v->VmppOut=0;
v->DeltaP=0;
v->PanelPower=0;
v->PanelPower_Prev=0;
v->mppt_enable=1;
v->mppt_first=1;
}
//*********** Function Definition ********//
void MPPT_PNO_F_FUNC(MPPT_PNO_F *v)
{
if (v->mppt_enable==1)
{
if (v->mppt_first == 1)
{
v->VmppOut= v->Vpv - (0.02);
v->mppt_first=0;
v->PanelPower_Prev=v->PanelPower;
}
else
{
v->PanelPower=(v->Vpv*v->Ipv);
v->DeltaP=v->PanelPower-v->PanelPower_Prev;
if (v->DeltaP > v->DeltaPmin)
{
v->VmppOut=v->Vpv+v->Stepsize;
}
else
{
if (v->DeltaP < -v->DeltaPmin)
{
v->Stepsize=-v->Stepsize;
v->VmppOut=v->Vpv+v->Stepsize;
}
}
v->PanelPower_Prev = v->PanelPower;
}
if(v->VmppOut < v->MinVolt) v->VmppOut = v->MinVolt;
if(v->VmppOut > v->MaxVolt) v->VmppOut = v->MaxVolt;
}
}
4、電導增量演算法
電池輸出功率是,對U求導,可得到:
將其帶入上面P&O的公式,經過變形可得:
如此看來,也不必計算功率了。
而變步長演算法,可由下式表達:
變步長方法,作用是:當工作點在最大功率點左邊,需要增加工作電壓,逼近最大功率點。由於斜率較低,可以多增加步長,加快“爬坡”速度。
在這裡貼上TI的工程師編的演算法:
//*********** Structure Definition ********//
typedef struct {
float32 Ipv;
float32 Vpv;
float32 IpvH;
float32 IpvL;
float32 VpvH;
float32 VpvL;
float32 MaxVolt;
float32 MinVolt;
float32 Stepsize;
float32 VmppOut;
// internal variables
float32 Cond;
float32 IncCond;
float32 DeltaV;
float32 DeltaI;
float32 VpvOld;
float32 IpvOld;
float32 StepFirst;
int16 mppt_enable;
int16 mppt_first;
} MPPT_INCC_F;
typedef MPPT_INCC_F *mppt_incc_handle;
//*********** Structure Init Function ****//
void MPPT_INCC_F_init(MPPT_INCC_F *v)
{
v->Ipv=0;
v->Vpv=0;
v->IpvH=(1.65);
v->IpvL=0;
v->VpvH=0;
v->VpvL=0;
v->MaxVolt=0;
v->MinVolt=0;
v->Stepsize=0;
v->VmppOut=0;
v->Cond=0;
v->IncCond=0;
v->DeltaV=0;
v->DeltaI=0;
v->VpvOld=0;
v->IpvOld=0;
v->StepFirst=(0.02);
v->mppt_enable=1;
v->mppt_first=1;
}
//*********** Function Definition ********//
void MPPT_INCC_F_FUNC(MPPT_INCC_F *v)
{
if (v->mppt_enable==1)
{ /*MPPT mode enable*/
if (v->mppt_first == 1)
{
v->VmppOut= v->Vpv - v->StepFirst;
v->VpvOld=v->Vpv;
v->IpvOld=v->Ipv;
v->mppt_first=0;
}
else
{
v->DeltaV = v->Vpv-v->VpvOld ; /* PV voltage change */
v->DeltaI = v->Ipv-v->IpvOld ; /* PV current change */
// if(v->DeltaV <v->VpvH && v->DeltaV >-v->VpvL ) /* Tolerence limits PV Voaltge Variation */
// v->DeltaV= 0;
// if(v->DeltaI <v->IpvH && v->DeltaI >-v->IpvL ) /* Tolerence limits PV current Variation */
// v->DeltaI = 0;
if(v->DeltaV == 0) /* DeltaV=0 */
{
if(v->DeltaI !=0 ) /* dI=0 operating at MPP */
{
if ( v->DeltaI > 0 ) /* climbing towards MPP */
{v->VmppOut=v->Vpv+v->Stepsize;} /* Increment Vref */
else
{v->VmppOut=v->Vpv-v->Stepsize;} /* Decrement Vref */
}
}
else
{
v->Cond = v->Ipv*__einvf32(v->Vpv); /*Cond =-(v->Ipv<<10)/v->Vpv;*/
v->IncCond = v->DeltaI*__einvf32(v->DeltaV); /*IncCond =(DeltaI<<10)/DeltaV;*/
if (v->IncCond != v->Cond) /* Operating at MPP */
{
if (v->IncCond > (-v->Cond)) /* left of MPP */
{
v->VmppOut=v->Vpv+v->Stepsize; /* change Vref */
}
else /* Right of MPP */
{
v->VmppOut=v->Vpv-v->Stepsize; /* change Vref */
}
}
}
v->VpvOld = v->Vpv;
v->IpvOld = v->Ipv;
}
}
}
程式碼比我自己編的容易看懂,而且在呼叫時,讓程式碼更加整潔了。
5、具體實現例子
下圖是實現最大功率點跟蹤MPPT(Maximum Power Point Tracking)演算法的一個例子。
光伏電池通過降壓DCDC主電路為負載供電。DCDC的作用是可以精確控制輸出電壓。直流系統的負載一般都是阻性負載。有時候可能是電阻串電池的形式。那麼負載電流是和負載電壓密切相關的,即電壓越大、電流越大。而開關電源DCDC的轉換效率較高,一般大於70%。因此可通過控制輸出電壓,改變輸出功率,也同時改變了輸入功率,即改變了光伏電池的輸出功率。
參考文件:獨立式光伏發電系統最大功率點跟蹤演算法研究_張淼.pdf
參考軟體:TI的controlSuite裡面的Solar Lib