/* Includes -------------------------------------------------------------------------------------*/
#include "FU68xx_5.h"
#include <Myproject.h>

OTHER              xdata udc;

PFCValue  PFCSet;
uint16 PFC_UDCREF_GET = 0;
uint16  MduTempL = 0, MduTempH = 0, MduDIVL = 0;
/*KM选择每100W一个挡位，原有KM加此值*/
const int8 PFC_KM_vaule_add[25] =
{
    -15,   -13,    -8,     -1,     0,                                   //0-500
        10,    12,    14,     16,    20,                                   //600-1000
        30,    32,    34,     36,    38,                                   //1100-1500
        40,    42,    44,     46,    48,                                   //1600-2000
        50,    52,    54,     56,    58,                                   //2100-2500
    };


void PFC_init(void)
{
    UDC_REF      = 0x00;        // PFC_UDCREF;  // udc的参考值
    UDC__UK      = 0x00;        // 外环PI的输出
    UDC_KP       = PFC_UKP;     // 外环KP
    UDC_KI       = PFC_UKI;     // 外环KI
    UDC_UKMAX    = 0x00;        // 外环输出最大值
    IAC__REF     = 0x00;        // PFC模式时，不需要设置，由外环PI乘以Uac得到ref值
    IAC__UK      = 0x00;        // 内环PI的输出
    IAC_KP       = PFC_IKP;     // 内环KP
    IAC_KI       = PFC_IKI;     // 内环KI
    IAC_UKMAX    = 0x00;        // 最大7fff对应输出100%占空比，调试时别设太大，防止爆炸
    PFC_ARR      = PFCPWM_ARR;  // 周期值
    PFC_KM       = 3;           // Km的值
    /*  -------------------------------------------------------------------------------------------------
        UAC采样分频设置
        00: 不分频  01: 2分频  10: 4分频  11: 8分频
        -------------------------------------------------------------------------------------------------*/
    #if (SAMPLEFREQ==SAMPLEDIV0)
    ClrBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
    #elif (SAMPLEFREQ==SAMPLEDIV2)
    SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL0) ;
    #elif (SAMPLEFREQ==SAMPLEDIV4)
    SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL1);
    #elif (SAMPLEFREQ==SAMPLEDIV8)
    SetBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
    #endif
    /*  -------------------------------------------------------------------------------------------------
        UTHR  0: 1/16的UACMAX  1: 1/8的UACMAX
        -------------------------------------------------------------------------------------------------*/
    SetBit(PFC_CR1, UTHR);
    //    PFC_OUTARR   = 41;        // 电压环执行频率=PFC载波频率/OUTARR  200：执行频率=41k/200=205hz  40：执行频率=41k/40=1025hz
    PFC_ADCCH    = 0xC1;       // 高4位：iac的ADC12通道  低4位：uac的ADC11通道    //6815板子Uac为AD3
    PFC_CSO      = 0x0000;     // 电流基准
    //    PFC_TRGDLY  &= 0x0F;
    //    PFC_TRGDLY  |= 0x30;       // 采样delay设置，只写高4位，低4位默认写0，如0xX0,X的范围为:0-F
    
    if (UAC_N > 31)
    { PFC_CR1     |= 0x1F; }       // UAC采样次数0x1f
    else
    { PFC_CR1     |= UAC_N; }      // UAC采样次数
    
    //    SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止
    ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算
    #if (PFCOverCurrentProtectMode==PFCOVERCURRENT)
    {
        ClrBit(PFC_CR0, PFCOA);    // PFC过流
    }
    #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt)
    {
        SetBit(PFC_CR0, PFCOA);    // PFC逐波限流
    }
    #endif
    //    SetBit(PFC_CR0, PFCEN);    // PFC使能
    //    PFC_CR2     |=0<<6;         //00：1倍死区   01:1/2   10： 2倍  11：不使能   //灯泡负载不加死区，电机负载加死区
    ClrBit(PFC_CR2, PFC_BLK_MD1);
    ClrBit(PFC_CR2, PFC_BLK_MD0);
    PFC_CR2     |= 1 << 5;      //在大于50％的地方采样，0：使能 1：不使能
    ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样，1向上计数时采样
    #if (PFCOverCurrentProtectEnable)
    CMP5_Init();
    #endif
    //    SetBit(ADC_MASK, CH12EN);//使能IAC的采样
    /****参数初始化*******/
    PFCSet.UDCREFValue  = 0;
    PFCSet.IACOUTMax    = 0;
    PFCSet.OverVoltFlag = 0;
    //    PFCSet.UDCOUTMax    = PFC_UDCREF;
}
void PFC_start(void)
{
    ClrBit(PFC_CR0, PFCEN);    // PFC使能
    IAC_UKMIN   = 0;
    SetBit(PFC_CR0, PFCEN);    // PFC使能
    UDC_REF      = 0x00;        // PFC_UDCREF;    // udc的参考值
    UDC__UK      = 0x00;        // 外环PI的输出
    UDC_KP       = PFC_UKP;     // 外环KP
    UDC_KI       = PFC_UKI;     // 外环KI
    UDC_UKMAX    = 0x00;        // 外环输出最大值
    IAC__REF     = 0x00;        // PFC模式时，不需要设置，由外环PI乘以Uac得到ref值
    IAC__UK      = 0x00;        // 内环PI的输出
    IAC_KP       = PFC_IKP;     // 内环KP
    IAC_KI       = PFC_IKI;     // 内环KI
    IAC_UKMAX    = 0x00;        // 最大7fff对应输出100%占空比，调试时别设太大，防止爆炸
    PFC_ARR      = PFCPWM_ARR;  // 周期值
    PFC_KM       = 3;           // Km的值
    UDC_UKMIN   = 0; //UDC_UKMIN
    //      IAC_UKMIN   = 0;
    PFC_OUTARR   = 40;        // 电压环执行频率=PFC载波频率/OUTARR  200：执行频率=41k/200=205hz  40：执行频率=41k/40=1025hz
    PFC_TRGDLY  &= 0x0F;
    PFC_TRGDLY  |= 0x00;       // 采样delay设置，只写高4位，低4位默认写0，如0xX0,X的范围为:0-F
    SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止
    //    ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算
    #if (PFCOverCurrentProtectMode==PFCOVERCURRENT)
    {
        ClrBit(PFC_CR0, PFCOA);    // PFC过流
    }
    #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt)
    {
        SetBit(PFC_CR0, PFCOA);    // PFC逐波限流
    }
    #endif
    ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样，1向上计数时采样
    SetBit(ADC_MASK, CH12EN);//使能IAC的采样
    /****参数初始化*******/
    PFCSet.UDCREFValue  = 0;
    PFCSet.IACOUTMax    = 0;
    PFCSet.OverVoltFlag = 0;
    PFCSet.UDCOUTMax    = PFC_UDCREF_Max;//PFC_UDCREF_GET;
}


// udc最大值最小值获取
void UdcMax_Min(void)
{
    //    SetBit(ADC_CR, ADCBSY);           // 使能ADC的DCBUS采样
    udc.L1           = ADC13_DR;
    udc.L2           = ADC10_DR;
    udc.L3           = ADC12_DR;
    
    if (udc.L1 >= udc.L2 && udc.L1 >= udc.L3)
    {
        udc.LMAX = udc.L1;
    }
    
    if (udc.L2 >= udc.L1 && udc.L2 >= udc.L3)
    {
        udc.LMAX = udc.L2;
    }
    
    if (udc.L3 >= udc.L2 && udc.L3 >= udc.L1)
    {
        udc.LMAX = udc.L3;
    }
    
    mcFocCtrl.mcDcbus           = ADC2_DR;
    mcFocCtrl.mcAcbus           = udc.LMAX;
    
    if (mcFocCtrl.mcDcbus >= mcFocCtrl.mcDcbus_max_temp)
    {
        mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus;
    }
    
    if (mcFocCtrl.mcAcbus >= mcFocCtrl.mcAcbus_max_temp)
    {
        mcFocCtrl.mcAcbus_max_temp = mcFocCtrl.mcAcbus;
    }
    
    if (mcFocCtrl.mcDcbus <= mcFocCtrl.mcDcbus_min_temp)
    {
        mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus;
    }
    
    mcFocCtrl.mcDcbus_count++;
    
    if (mcFocCtrl.mcDcbus_count >= Udcmax_ms)
    {
        mcFocCtrl.mcAcbus_max      = mcFocCtrl.mcAcbus_max_temp;
        mcFocCtrl.mcDcbus_max      = mcFocCtrl.mcDcbus_max_temp;
        mcFocCtrl.mcDcbus_min      = mcFocCtrl.mcDcbus_min_temp;
        mcFocCtrl.mcDcbus_chazhi   = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus_min;
        mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus;
        mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus;
        mcFocCtrl.mcAcbus_max_temp = 0;
        mcFocCtrl.mcDcbus_count    = 0;
    }
    
    udc.mcDcbusRef      = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus;
    
    if (udc.mcDcbusRef <= 1)
    {
        udc.mcDcbusRef = 1;
    }
    
    //      udc.WeakenUsRef  =(uint32)(udc.mcDcbusRef/540) * HW_BOARD_VOLT_MAX;
    MUL0_MA = HW_BOARD_VOLT_MAX;
    MUL0_MB = udc.mcDcbusRef;
    SMDU_RunBlock(0, SMUL);
    MduTempH    = MUL0_MCH;
    MduTempL = MUL0_MCL;
    DIV0_DAH    =   MduTempH;
    DIV0_DAL    =   MduTempL;
    DIV0_DB     =   540;
    SMDU_RunBlock(0, DIV);
    MduDIVL = DIV0_DQL;
    udc.WeakenUsRef = DcbusK - MduDIVL;      //弱磁深度
    
    if (udc.WeakenUsRef >= _Q15(1.0))
    {
        udc.WeakenUsRef = _Q15(1.0);
    }
}


