1. 程式人生 > >MPPT演算法(恆定電壓、擾動觀察、電導增量)介紹與實現過程

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(藍色)。

工作溫度25℃,光照變化時的光伏特性曲線
(a) 電壓-電流特性曲線 (b) 電壓-功率特性曲線

下圖中,光照設定為1000W/m2,工作溫度分別是25℃(藍色)、45℃(紅色)、65℃(橙色)。

光照恆定,工作溫度變化時候的光伏特性曲線
(a) 電壓-電流特性曲線 (b) 電壓-功率特性曲線

上面曲線可知,就算開路電壓改變,最大功率點的電壓除以曲線的開路電壓,結果都是比較接近0.78的。

3、MPPT-P&O演算法

P&O中文名字是擾動-觀察法。

從P-V曲線可見,可通過控制電壓的方法讓光伏電池達到最大功率點。演算法的實現,依據了以下公式:

\left\{\begin{matrix} \frac{dP}{dU}>0:U=U + \bigtriangleup U \\ \frac{dP}{dU}=0:U=U_m \\ \frac{dP}{dU}<0:U=U - \bigtriangleup U \end{matrix}\right.

當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、電導增量演算法

電池輸出功率是P=UI,對U求導,可得到:

\frac{dP}{dU}=I+U\frac{dI}{dU}

將其帶入上面P&O的公式,經過變形可得:

\left\{\begin{matrix} \left ( \frac{dI}{dU}=-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI=0\right ) \right ):& U= U\\ \left ( \frac{dI}{dU}>-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI>0\right ) \right ):& U= U + \bigtriangleup U\\ \left ( \frac{dI}{dU}<-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI<0\right ) \right ):& U= U - \bigtriangleup U\\ \end{matrix}\right.

如此看來,也不必計算功率了。

而變步長演算法,可由下式表達:

\left\{\begin{matrix} \left ( \frac{dI}{dU}=-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI=0\right ) \right ):& U= U\\ \left ( \frac{dI}{dU}>-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI>0\right ) \right ):& U= U + 4\bigtriangleup U\\ \left ( \frac{dI}{dU}<-I/U \right )or \left ( \left ( dU=0\right ) and\left ( dI<0\right ) \right ):& U= U - \bigtriangleup U\\ \end{matrix}\right.

變步長方法,作用是:當工作點在最大功率點左邊,需要增加工作電壓,逼近最大功率點。由於斜率較低,可以多增加步長,加快“爬坡”速度。

在這裡貼上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