功率优化器原理效果和应用,前边的文章已经介绍完了,这回把我做的MPPT算法展示下,这个算法经过多年实验,成大规模实验并在现场一直良好运行,这里给个算法架构。
这是main函数中的主循环,Adc12Detect()为优化器故障检测函数。MPPTInfo.mCnt是mppt循环周期计数,sDefaut[14][g_flashRun.uInfo.Tmmpt]就是flash中存的mppt周期循环总数,PST(MPPTInfo.mCurrent)为当前电流的正值,这条if就是隔段时间调整一次mppt的追踪电压。
/******************************************************************************
* MPPT调节
******************************************************************************/
if(MPPTInfo.mCnt > sDefaut[14][g_flashRun.uInfo.Tmmpt] - (PST(MPPTInfo.mCurrent) >> 10)) //电流小时调的慢
{
MPPTInfo.mCnt = 0; //MPPT稳定次数
Adc12Detect();
if(!(SYSTEM_FLAG & SETUP_MODE))
DesDelta();
}
进一步判断功率波动范围,是否需要进行MPPT调节
UCHAR DesDelta()
{
short sPDelta;
UCHAR ucRng;
if((PWM_FLAG & 0x0F) > 5) //每次mppt调节完,再刷新20ms变稳定
{
PWM_FLAG++;
//if((SYSTEM_FLAG & LOWER_VOLTAGE) && ((g_CurStst.uAvr.Vin - g_CurStat.uAvr.Vout) < (g_CurStst.uAvr.Vin >> 5) + (g_CurStst.uAvr.Vin >> 6)))
// ucRng = 12;
if((PWM_FLAG & 0x0F) > sDefaut[15][g_flashRun.uInfo.Tcyc])
PWM_FLAG = 0;
UPDATE_STATUS();
return OK;
}/**/
/*-------------------------Calculate Delta-----------------------------*/
sPDelta = MPPTInfo.mPower - g_PreStat.pPwr;
/*----------------------------Delta Level-----------------------------*/
ucRng = (MPPTInfo.mPower >> 7) + 9; // 灵敏调节
if(PWM_FLAG & MPPT_ENABLE) //每次调节都调完,到稳定状态
{
VrefTrim(&sPDelta);
}
else if(ucRng < ABS(sPDelta)) //功率变化大于3W就调节
{
PWM_FLAG = MPPT_ENABLE + DECREASING;
MPPTInfo.Vref = g_CurStat.uAvr.Vin;
VrefTrim(&sPDelta);
}
return OK;
}
UCHAR VrefTrim(short *p_sPDelta)
{
//mppt步伐计数,超过则调整方向
s_ucMPPT++;
//如果功率降低,说明调节方向错误,方向调节次数加一
if((*p_sPDelta <= 0) || (s_ucMPPT > 15))
{
s_ucMPPT = 0;
PWM_FLAG ^= DECREASING; //取反方向调节
PWM_FLAG++;
}
VrefCalculate(p_sPDelta);
UPDATE_STATUS();
return OK;
}
UCHAR VrefCalculate(short *p_sPowerDlt)
{
short sVadd = 0;
short sVsub = 0;
USHORT usStep = (MPPTInfo.mVoltage >> 7) + 32; //32 25V:0.55V 50V:0.75V 60V:0.85V
//42 25V:0.6V 50V:0.8V 60V:0.9V
//增加控制PV电压在50~60V的趋势因子
sVadd = ABS(*p_sPowerDlt) >> 4;
if(sVadd > 16)
sVadd = 16;
if(MPPTInfo.mVoltage < 5600)//单块发电时,多降压,逼近56V
{
;
}
else//正常时,降压易短路其它电池板
{
sVsub = sVadd;
sVadd = 0;
}
//电流小时增大幅度
if(MPPTInfo.mCurrent < 800)
usStep += 13 - (PST(MPPTInfo.mCurrent) >> 6);
//掉头4次换小步伐
if(((PWM_FLAG & 0x0F) > 3) && (usStep > MIN_STEP))
usStep -= MIN_STEP;
//Vref调节
if(PWM_FLAG & DECREASING) //减方向,Vref自减
MPPTInfo.Vref += sVadd + usStep;
else
MPPTInfo.Vref -= (sVsub + usStep);
//MPPT Vref限压
BAND_PASS(MPPTInfo.Vref, MIN_MPPTVOL, sDefaut[1][g_flashRun.uInfo.Vomax]);
return OK;
}