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后,路径是ticontrolSUITElibsapp_libssolarv1.2float):

 
//*********** 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 Ufrac{dI}{dU}

将其带入上面P&O的公式,经过变形可得:

left{begin{matrix} left ( frac{dI}{dU}=-I/U right )or left ( left ( dU=0right ) andleft ( dI=0right ) right ):& U= U left ( frac{dI}{dU}>-I/U right )or left ( left ( dU=0right ) andleft ( dI>0right ) right ):& U= U   bigtriangleup U left ( frac{dI}{dU}<-I/U right )or left ( left ( dU=0right ) andleft ( dI<0right ) 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%。因此可通过控制输出电压,改变输出功率,也同时改变了输入功率,即改变了光伏电池的输出功率。

发表评论