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、电导增量算法
电池输出功率是,对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%。因此可通过控制输出电压,改变输出功率,也同时改变了输入功率,即改变了光伏电池的输出功率。