⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charge.c

📁 Keil单片机软件开发平台下的一个51系列单片机工程
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
        Cha.i_ezero = 2;
    }
    if (Cha.v_ezero <= 2)
    {
        Cha.v_ezero = 2;
    }
    Cha.i_rating = RatingCurrent();         //1=100mA 额定输出电流
    // 电池容量大 防整数溢出先除后乘; 电池容量小,提高精度先乘后除
    if (Jkmk.mk_cfg[10] > 200)
    {
        Cha.i_limit = (Jkmk.mk_cfg[10]/10) * Jkmk.mk_cfg[30];    //1=100mA 充电限流值 根据电池容量和充电限流计算
    }
    else
    {
        Cha.i_limit = Jkmk.mk_cfg[10] * Jkmk.mk_cfg[30]/10;    //1=100mA 充电限流值 根据电池容量和充电限流计算
    }
    Cha.v_e = Cha.v_out - Cha.v_set;
    Cha.i_e = Cha.i_batt - Cha.i_limit;

//设置电压安全调节范围
    Cha.v_low  = Cha.v_set - 4*Cha.v_lowtohigh;
    Cha.v_high = Cha.v_set + Cha.v_lowtohigh;
//判断电流变化速度
    Cha.i_buf[2] = Cha.i_buf[1];
    Cha.i_buf[1] = Cha.i_buf[0] - Cha.i_e;
    Cha.i_buf[0] = Cha.i_e;
    if (Cha.i_buf[2] * Cha.i_buf[1] > 0)
    {
        Cha.i_ec = Cha.i_buf[1];
    }
    else
    {
        Cha.i_ec = 0;
    }
    Jkmk.mk_cfg[70] = Cha.v_batt;
    Jkmk.mk_cfg[71] = Cha.i_batt;
}

/****************************************************************************/
void X_Voltaget(void)
{
    //计算输出电压
    int value;

//    X_Updata();
    Cha.v_ctloffset = 0;

    if(Cha.v_e > Cha.v_ezero+1)
    {//电压大于设定值
        if (Cha.v_e > 2*Cha.v_ezero+4)
        {
            if (Cha.v_e > 2*Cha.v_ezero+8)
            {
                Cha.v_ctloffset = -Cha.v_e/2;
            }
            else
            {
                Cha.v_ctloffset = -4;//大偏差 快调
            }
        }
        else
        {
            Cha.v_ctloffset = -1;//小偏差 微调
        }
    }
    else if (Cha.v_e < (-Cha.v_ezero-2))
    {//电压小于设定值
        if (Cha.i_da > (Cha.i_limit- Cha.i_limit/4))
        {//电流
            if(Cha.v_e < -(2*Cha.v_ezero+6))
            {// 需要调电压
                Cha.v_ctloffset = 2;
            }
            else
            {//电流偏大
                Cha.v_ctloffset = 1;
            }
        }
    }
    Cha.v_da += Cha.v_ctloffset;

    if (Cha.v_da > Cha.v_high)
    {
         Cha.v_da = Cha.v_high;
    }
        /*
        if (Cha.v_da < Cha.v_low)
        {
             Cha.v_da = Cha.v_low;
        }
        */
    Jkmk.mk_cfg[75] = Cha.v_ctloffset;
    DaOutU(Cha.v_da);
}

void X_Current(void)
{
    //计算输出电流
    //根据充电 逆变状态设置
    long ltemp;
    int qe, qec;
//    X_Updata();
//调节电压
//    X_Voltaget();


//计算负载电流
    Cha.i_load = Cha.i_out - Cha.i_batt;
//计算电流输出上限和下限
    if (2 == X_GetChargeState())
    {
        Cha.i_load = 0;
        Cha.i_out = 0;
    }
    if (Cha.i_load < 0)
    {
        Cha.i_load = 0;
    }

     Cha.i_low  = 0;
//电流最大调节范围
//    Cha.i_high = Cha.i_limit + Cha.i_load + Jkmk.mk_cfg[72];
    Cha.i_high = Cha.i_limit + Cha.i_load + 100;    //Jkmk.mk_cfg[72];
    if (Cha.i_high > Cha.i_max)
    {
        Cha.i_high = Cha.i_max;
    }
    switch (X_GetChargeState())
    {
    case 0://停止状态 有电流下降过程和关断脉冲两个阶段
        Cha.i_low = 0;
        Cha.i_da = Cha.i_sigzero;
        Cha.i_ctltimer = CHARGE_SOFTSTART_TIME;
    //DA输出没达到最小值,要延时
        if (Cha.i_sigzero != I_Contrl.da_v)
        {
            Cha.i_timer = CHARGE_SOFTSTOP_TIME;
        }
        if (Cha.i_timer > 0)
        {
            Cha.i_timer--;
        }
        else
        {
            //先封锁脉冲,再切断DA
            SetModuleData(MODULE_JKMK|DATA_DO, 5, 0, 1);
            SetModuleData(MODULE_JKMK|DATA_DO, 4, 0, 0);
        }
        break;
    case 1://充电调节
    case 2://逆变时慢启动
        //电压高 电压优先调, 电压合适 电流优先
        Cha.i_ctloffset = 0;

        if (Cha.i_ctltimer > 0)
        {
            Cha.i_ctltimer--;
            Cha.i_ctloffset = Cha.i_limit/128;           //启动阶段,慢启动
            if (Cha.v_e > -(2*Cha.v_ezero+6))
            {//限压阶段 不调节电流
                Cha.i_ctloffset = 0;
            }
        }
        else
        {
            if (Cha.v_e > (2*Cha.v_ezero+6))
            {//电压偏高
                Cha.i_ctloffset = -1;
            }
            else if (Cha.v_e > -(2*Cha.v_ezero+6))
            {//限压阶段 不调节电流
                Cha.i_ctloffset = 0;
            }
            else if (Cha.i_da > (Cha.i_batt + Cha.i_load + 80) )
            {//电流调节过大 电流调节不起作用了 停止调节
                Cha.i_ctloffset = -1;
            }
            else
            {//电压偏低
                if (Cha.i_batt < (Cha.i_limit - Cha.i_ezero))
                {//电流偏低
                    if (Cha.i_batt < (Cha.i_limit/4))
                    {//快速调整
                        Cha.i_ctloffset = Cha.i_limit/8;
                    }
                    else if (Cha.i_batt < (Cha.i_limit/2))
                    {//快速调整
                        Cha.i_ctloffset = Cha.i_limit/16;
                    }
                    else if (Cha.i_batt < (3*Cha.i_limit/4))
                    {//慢速调整
                        Cha.i_ctloffset = Cha.i_limit/32;
                    }
                    else if (Cha.i_batt < (7*Cha.i_limit/8))
                    {//很慢速调整
                        Cha.i_ctloffset = Cha.i_limit/64;
                    }
                    else
                    {
                        Cha.i_ctloffset = 1;
                    }
                }
                else if (Cha.i_batt > (Cha.i_limit + Cha.i_ezero+4))
                {//电流偏高
                    if (Cha.i_batt > (Cha.i_limit + Cha.i_limit/8))
                    {//大幅度超调
                        Cha.i_ctloffset = -(Cha.i_limit/64);
                    }
                    else if (Cha.i_batt > (Cha.i_limit + 4*Cha.i_ezero+10))
                    {//小幅度超调
                        Cha.i_ctloffset = -10;
                    }
                    else
                    {
                        Cha.i_ctloffset = -1;
                    }
                }
                else
                {
                    Cha.i_ctloffset = 0;
                }
            }//if (Cha.v_e > (-Cha.v_ezero-4)) else
        }//if (Cha.i_ctltimer > 0) else
        Cha.i_da += Cha.i_ctloffset;
        break;
    }//switch(X)

    if (Cha.i_da < Cha.i_low)
    {
        Cha.i_da = Cha.i_low;
    }
    if (Cha.i_da > Cha.i_high)
    {
        Cha.i_da = Cha.i_high;
    }
            Jkmk.mk_cfg[73] = Cha.i_ctloffset;
            Jkmk.mk_cfg[74] = Cha.i_limit;
    //硬件DA输出
    X_IDaSet(Cha.i_da);
}
/****************************************************************************/
void X_SetChargeState(int value)
{
    Jkmk.temp[16] = value;
//停止
}
/****************************************************************************/
int X_GetChargeState(void)
{
    return Jkmk.temp[16];

}
/****************************************************************************/
//相控逆变控制充电
void X_ChargeProc(void)
{
    //DA1   电压控制  XX:控制 0:停止
    //DA2   电流控制  XX:控制 0:停止
    //JK1   脉冲封锁  1:封锁  0:打开
    //JK2   DA开关    1:通    0:断
    int step;
    step = X_GetChargeState();
    switch (step)
    {
    case 0: //停机
        //DA1=0 DA2=0
        //JK1=1 JK2=0
        break;
    case 1: //充电
        //DA1=X DA2=X
        //JK1=0 JK2=0
        break;
    case 2: //逆变
        //DA1=X DA2=X
        //JK1=0 JK2=0
        break;
    }

}
/****************************************************************************/
void ChargeProc(void)
{
    int step;
    /*
    Jkmk.ai_v[17]   1路电池电流
    Jkmk.ai_v[19]   2路电池电流

    Jkmk.temp[35]   转均充电流
    Jkmk.temp[36]   转浮充电流

    Jkmk.mk_cfg[33] 转浮充容量比
    Jkmk.mk_cfg[34] 转均充容量比
    tm_cfg
    0系统延时 fen
    1屏幕保护 fen
    2均充周期时间 hour
    3均充保护时间 fen
    4稳流均充时间 fen
    5转均充延时   fen
    6电池测试时间 fen
    */
#ifdef HARD_GP
    if (Jkmk.temp[24] == 1)
    {//手动
        return;
    }
#endif
#ifdef HARD_XK
    
    if (1 == GetModuleData(MODULE_JKMK|DATA_DI, 13, 0))
    {//在停止档 立即封锁脉冲 切断DA
         SetChargeStep(6);
         Cha.i_timer = CHARGE_SOFTSTOP_TIME;
        SetModuleData(MODULE_JKMK|DATA_DO, 5, 0, 1);
        SetModuleData(MODULE_JKMK|DATA_DO, 4, 0, 0);
    }
#endif
    step = GetChargeStep();
    switch (step)
    {
    case 0://floating charge
        if (Cha.i_batt > Jkmk.temp[35])//current
        {
            SetChargeStep(1);
        }
        if (Jkmk.mk_cfg[11] < Jkmk.mk_cfg[34])   //capacity
        {
            SetChargeStep(1);
        }
        break;
    case 1://floating charge to equipoise charge
        if (ChargeTimerCount(5) == 0)//time
        {
            if (Jkmk.mk_cfg[8])
            {
                SetChargeStep(2);
            }
        }
        if (Cha.i_batt < Jkmk.temp[35])//current
        {
            SetChargeStep(0);
        }
        break;
    case 2://equipoise charge
        if (ChargeTimerCount(3) == 0)//time
        {
            SetChargeStep(3);
        }
        if (Cha.i_batt < Jkmk.temp[36])//current
        {
            SetChargeStep(3);
        }
        /*
        if (Jkmk.mk_cfg[11] > Jkmk.mk_cfg[33])//capacity
        {
            SetChargeStep(3);
        }
        */
        break;
    case 3://equipoise charge to floating charge
        if (ChargeTimerCount(4) == 0)//time
        {
            SetChargeStep(0);
        }
        if (ChargeTimerCount(3) == 0)//time
        {
            SetChargeStep(0);
        }
        if (Cha.i_batt > Jkmk.temp[36])//current
        {
            SetChargeStep(2);
        }
        break;
    case 4://power cut discharge
        break;
    case 5://batt test
#ifdef HARD_GP
        if (Cha.v_batt < Jkmk.mk_cfg[35])//voltage 
        {
            SetChargeStep(0);
        }
        if (ChargeTimerCount(6) == 0)//time
        {
            SetChargeStep(0);
        }
#endif

#ifdef HARD_XK
        if (Cha.v_batt < Jkmk.mk_cfg[35])//voltage 
        {
            SetChargeStep(6);
        }
        if (ChargeTimerCount(6) == 0)//time
        {
            SetChargeStep(6);
        }
#endif
        break;
    case 6:// IS STOP  batt or mx alarm
        break;
    }
}
/****************************************************************************/
int GetChargeStep(void)
{
    return Jkmk.temp[25];
}
/****************************************************************************/
void SetChargeStep(int step)
{
    /*
    0系统延时 fen
    1屏幕保护 fen
    2均充周期时间 hour
    3均充保护时间 fen
    4稳流均充时间 fen
    5转均充延时   fen
    6电池测试时间 fen
    */
    //允许均充
#ifdef HARD_GP
    if ((Jkmk.mk_cfg[8] == 0) && (step == 2 || step == 3))
    {
        Charge_Step = 0;
        Jkmk.temp[25] = 0;
    }
    else
    {
        Charge_Step = step;
        Jkmk.temp[25] = step;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -