便携储能-PV/适配器自适应充电算法
简介应用于便携储能领域DC充电口目前主流采用5521接口DC充电口是光伏输入兼容适配器充电模式。如何区分PV/适配器光伏输入的特点是输入电压会随着电流变大电压变小当达到最大功率时电压、电流相对稳定在这个小范围内适配器输入的电压是恒定的电流随着功率的增加越来越大当电流达到最大值时如果继续抬高功率则输入电压就无法恒定会被强制拉低此时如果是开关电源则会提示过流报警。基于以上原理可以区分出来是PV还是适配器模式。区分出来输入源之后跳到对应的算法流程中执行对应算法。PV/适配器充电状态机如下/***************************************************************** 函数pri_boost_buck_algorithm() 描述状态机-先执行DC预充流程(DC算法)--确认输入信号是PV/DC--进入对应的充电状态 *****************************************************************/ void pri_boost_buck_algorithm(void) { switch(g_enPvDcChrgState) { case PS_DC_CHARGE_STATE_DC_PRECHRG: //Precharge processConfirm the input signal is DC or PV if((g_stuAdcCollect.m_u16RealPvInVol g_stuAdcCollect.m_u16RealBatVol) (g_stuAdcCollect.m_u16RealPvInVol - g_stuAdcCollect.m_u16RealBatVol 150)) { g_stuMpptDatHandle.State.Bit.b_u8PvChargeBuckChrgFlag 1; } if((g_stuMpptDatHandle.State.Bit.b_u8PvChargeBuckChrgFlag 1) (g_stuMpptDatHandle.State.Bit.b_u8DcPreChrgBuckToBoostFlag 0)) { pri_dc_buck_prechrg(); } else { pri_dc_boost_prechrg(); } break; case PS_DC_CHARGE_STATE_DC_BUCK: //DC buck charge process pri_dc_buck_chrg_alg(); break; case PS_DC_CHARGE_STATE_DC_BOOST: //DC boost charge process pri_dc_boost_chrg_alg(); break; case PS_DC_CHARGE_STATE_PV: //PV charge process if((g_stuAdcCollect.m_u16RealPvInVol g_stuAdcCollect.m_u16RealBatVol) (g_stuAdcCollect.m_u16RealPvInVol - g_stuAdcCollect.m_u16RealBatVol 150)) { g_stuMpptDatHandle.State.Bit.b_u8PvChargeBuckChrgFlag 1; } if((g_stuMpptDatHandle.State.Bit.b_u8PvChargeBuckChrgFlag 1) (g_stuMpptDatHandle.State.Bit.b_u8PvChargeBuckToBoostFlag 0)) { pri_mppt_buck_alg(); //BUCK降压充电 } else { pri_mppt_boost_alg(); //BOOST升压充电 } break; case PS_DC_CHARGE_STATE_CHRG_FULL: //charge full g_stuAdcCollect.m_u16BattSoc 100; g_stuAdcCollect.m_u16BattInitSoc 100; g_stuAdcCollect.m_u16LastPvP 0; g_stuAdcCollect.m_u16DisturbancePvP 0; g_stuSleepDataHandle.b_u8PvChrgFullFlag 1; __HAL_TIM_SET_COMPARE(htim1,TIM_CHANNEL_2,0); __HAL_TIM_SET_COMPARE(htim15,TIM_CHANNEL_2,0); g_enPvDcChrgState PS_DC_CHARGE_STATE_DC_PRECHRG; break; default:break; } }