功率优化器MPPT算法

 

    功率优化器原理效果和应用,前边的文章已经介绍完了,这回把我做的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;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值