📄 charge.c
字号:
{
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 + -