#include <stdbool.h>
#include "PFC_VoltageLoop.h"
TYPEDEF_DC_DATA DC_Data;
TYPEDEF_ACIN_DATA ACIN_Data;
TYPEDEF_PFC PFC_Data;
void PFC_VoltageLooP_Fun(void)
{
//----------------------------------------------------------------------------------------
//U(k)+KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)]
//----------------------------------------------------------------------------------------
if( ( DC_Data.U16_SetChgDc_OutVoltage.All > 1 ) //设定的充电电压不为0
&& (DC_Data.U16_Dc_InVoltage.All < MAX_DCV_OUT )//输出电压<MAX_DCV_OUT :用户自己定义
&&!ACIN_Data.AcInFlagData.AcInChgStart_F //允许充电:充电开
&& !ACIN_Data.AcInFlagData.BatLowChgProtct_F //电池充电时电压过低充不起来
)
{
//----------------------------------------------------------------
if( ++PFC_Data.S_OutVoltage.PfcDelayUpTimes > 400 )
{//10HZ-20HZ计调节一次 50MS-100MS:现在是在250US中断定时运行一次:400次就是10HZ。
PFC_Data.S_OutVoltage.PfcDelayUpTimes = 0;
PFC_Data.S_OutVoltage.NowadayOutValue = DC_Data.U16_Dc_InVoltage.All;
PFC_Data.S_OutVoltage.SetOutValue = DC_Data.U16_SetChgDc_OutVoltage.All;
//----------------------------------------------------------------
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.ErrorOne = PFC_Data.S_OutVoltage.SetOutValue - PFC_Data.S_OutVoltage.NowadayOutValue; //得到本次误差
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.Up = (__builtin_mulss( PFC_Data.S_OutVoltage.Kp,( PFC_Data.S_OutVoltage.ErrorOne - PFC_Data.S_OutVoltage.ErrorTwo )));
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.Ui = (__builtin_mulss( PFC_Data.S_OutVoltage.Ki,PFC_Data.S_OutVoltage.ErrorOne)); //得到积分项 滞后 稳态性能
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.UdTempOne = (__builtin_mulss(PFC_Data.S_OutVoltage.ErrorTwo,2));
PFC_Data.S_OutVoltage.UdTempTwo = PFC_Data.S_OutVoltage.ErrorOne - PFC_Data.S_OutVoltage.UdTempOne;
PFC_Data.S_OutVoltage.UdTempOne = PFC_Data.S_OutVoltage.ErrorThree + PFC_Data.S_OutVoltage.UdTempTwo;
PFC_Data.S_OutVoltage.Ud = (__builtin_mulss(PFC_Data.S_OutVoltage.Kd,PFC_Data.S_OutVoltage.UdTempOne)); //得到微分项 超前 动态性能
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.ErrorThree = PFC_Data.S_OutVoltage.ErrorTwo; //历史存储
PFC_Data.S_OutVoltage.ErrorTwo = PFC_Data.S_OutVoltage.ErrorOne;
//----------------------------------------------------------------
PFC_Data.S_OutVoltage.dU_k = PFC_Data.S_OutVoltage.Up + PFC_Data.S_OutVoltage.Ud + PFC_Data.S_OutVoltage.Ui; //计算增量和
PFC_Data.S_OutVoltage.dU_k = (__builtin_divsd(PFC_Data.S_OutVoltage.dU_k,10 ) );
PFC_Data.S_OutVoltage.U_k = PFC_Data.S_OutVoltage.U_Old + PFC_Data.S_OutVoltage.dU_k;
//----------------------------------------------------------------
if( PFC_Data.S_OutVoltage.U_k >= PFC_Data.S_OutVoltage.MaxPwmValue )
{
PFC_Data.S_OutVoltage.U_k = PFC_Data.S_OutVoltage.MaxPwmValue;
}
else if( PFC_Data.S_OutVoltage.U_k <= PFC_Data.S_OutVoltage.MinPwmValue )
{
PFC_Data.S_OutVoltage.U_k = PFC_Data.S_OutVoltage.MinPwmValue;
}
PFC_Data.S_OutVoltage.PwmOutValue = PFC_Data.S_OutVoltage.U_k;
PFC_Data.S_OutVoltage.U_Old = PFC_Data.S_OutVoltage.U_k;
//===================================================
}
//----------------------------------------------------------
}
else
{
PFC_Data.S_OutVoltage.ErrorOne = 0;
PFC_Data.S_OutVoltage.ErrorTwo = 0;
PFC_Data.S_OutVoltage.ErrorThree = 0;
PFC_Data.S_OutVoltage.U_Old = 0;
PFC_Data.S_OutVoltage.U_k = 0;
PFC_Data.S_OutVoltage.PwmOutValue = 0;
}
//---------------------------------------------------------------------------------------------------------
//计算PFC电流的给定值
if(ACIN_Data.U16_AcInVoltageSquares.All > 4800 )//输入电压要大于70V
{ //100US 计算一次
/*
* Iref = Km * A * B * C :Iref 为最大511时 看作为 1;
* Km:Muitiplier gain
* A:Voltage loop output :PWM 输出,最大PWM时 看作为 1 ;
* B:1/(Vin_rms * Vin_rms)
* C:Sensed input voltage Kvin * Vin : 就是ADC 的实际电压值,也是电压的正弦基准。电流要以电压的正弦基准走,电流才是正弦的。也就是相位跟踪
* Iref = Km * (Uv) * (Kvin * Vin) / (Vin_rms * Vin_rms)
*/
//-----Km * (Uv)-------
//----- * Uv Max == 1 :MAXDT
//PFC_Data.S_OutCurrent.Pfc_Km 可根据输入电压做一点修改,做限充电最大功率输出,
if(ACIN_Data.U16_AcInVoltage.All > 10500)//市电压大于105.00V ,用户可自己定义范围 70V - 150V ,电压低KM要改小
{
PFC_Data.S_OutCurrent.Pfc_Km = 9631;
}
else if( ACIN_Data.U16_AcInVoltage.All < 10200 )
{
PFC_Data.S_OutCurrent.Pfc_Km = 9000;
}
PFC_Data.S_OutCurrent.Pfc_LongBuffer = (__builtin_muluu(PFC_Data.S_OutCurrent.Pfc_Km ,PFC_Data.S_OutVoltage.PwmOutValue ));
PFC_Data.S_OutCurrent.Pfc_Buffer = (__builtin_divud(PFC_Data.S_OutCurrent.Pfc_LongBuffer,MAXDT)); //MAXDT:最大占空比-死区时间
//Vin * Kvin :
PFC_Data.S_OutCurrent.Pfc_LongBuffer = ACIN_Data.U16_AdcAcInVoltagePFC.All; //Max :512
PFC_Data.S_OutCurrent.Pfc_LongBuffer <<= 10;//相当于Adc_Vac_InVoltagePFC * 1024 = 524288
PFC_Data.S_OutCurrentAdjust.Pfc_Buffer = (__builtin_divud(PFC_Data.S_OutCurrent.Pfc_LongBuffer, 310 ));//Max: 524288 / 310 = 1691.25
PFC_Data.S_OutCurrent.Pfc_LongBuffer = (__builtin_muluu( PFC_Data.S_OutCurrent.Pfc_Buffer ,PFC_Data.S_OutCurrentAdjust.Pfc_Buffer)); //max: 9631 * 1692 = 16295652 : 0xF8A6E4
//---- / (V_ac *V_ac)-----
PFC_Data.S_Out