|
|
@@ -28,14 +28,9 @@ uint8_t CB_OPERATE_PRECEDENCE_PARRALLEL = PRE_SERIES;
|
|
|
uint8_t CB_OPERATE_PRECEDENCE_Config = PRE_SERIES;
|
|
|
|
|
|
DELAY_COMMON Series_delay;
|
|
|
-DELAY_COMMON Next_Series_delay;
|
|
|
-uint8_t Next_Series_Not_Enable = 0;
|
|
|
-
|
|
|
-uint8_t one_bat_charge_status = OBCS_CHARGER_OUT;
|
|
|
|
|
|
uint8_t one_bat_initial = 1;
|
|
|
|
|
|
-uint8_t serise_low_enable = 0;
|
|
|
uint8_t serise_low_qd_status = 0;
|
|
|
|
|
|
const double nhb_default = 600;
|
|
|
@@ -67,7 +62,6 @@ void App_Initial(void)
|
|
|
{
|
|
|
CB_OPERATE_PRECEDENCE_PARRALLEL = CB_OPERATE_PRECEDENCE_Config;
|
|
|
memset(&Series_delay,0x00,sizeof(Series_delay));
|
|
|
- memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
|
|
|
Initial_Neng_Hao_Bi();
|
|
|
}
|
|
|
|
|
|
@@ -251,9 +245,27 @@ static u8 shark_battery_switch_bat2(shark_battery_mask_t mask)
|
|
|
|
|
|
static u8 shark_battery_switch_charge(void)
|
|
|
{
|
|
|
+ u8 capacity1 = shark_battery_get_capacity1();
|
|
|
+ u8 capacity2 = shark_battery_get_capacity2();
|
|
|
u32 voltage1 = shark_battery_get_voltage1();
|
|
|
u32 voltage2 = shark_battery_get_voltage2();
|
|
|
|
|
|
+ if (shark_battery_charge_complete1()) {
|
|
|
+ return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_battery_charge_complete2()) {
|
|
|
+ return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (capacity1 < capacity2) {
|
|
|
+ return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (capacity2 < capacity1) {
|
|
|
+ return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
if (voltage1 < voltage2) {
|
|
|
return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
|
|
|
} else {
|
|
|
@@ -269,6 +281,14 @@ static u8 shark_battery_switch_single(void)
|
|
|
u32 open1 = 0;
|
|
|
u32 open2 = 0;
|
|
|
|
|
|
+ if (sub_bms_info_1.exit_times < sub_bms_info_2.exit_times) {
|
|
|
+ return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sub_bms_info_2.exit_times < sub_bms_info_1.exit_times) {
|
|
|
+ return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
|
|
|
+ }
|
|
|
+
|
|
|
while (time > shark_get_time_safe()) {
|
|
|
if (BAT1_IS_OPEN()) {
|
|
|
open1++;
|
|
|
@@ -304,20 +324,30 @@ static shark_bool shark_battery_series_enabled(void)
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
+#ifndef HAN_GUO_VERSION
|
|
|
if (shark_battery_series_locked) {
|
|
|
return shark_false;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
if (shark_battery_series_times > SHARK_SERIES_MAX_TIMES) {
|
|
|
return shark_false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (sub_bms_info_1.packet_common.m_percent < SERIES_ENTER_PERCENT) {
|
|
|
+ if (shark_battery_get_capacity1() < SERIES_ENTER_PERCENT) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_battery_get_capacity2() < SERIES_ENTER_PERCENT) {
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
- if (sub_bms_info_2.packet_common.m_percent < SERIES_ENTER_PERCENT) {
|
|
|
+ if (shark_battery_get_voltage1() < SERIES_PROTECT_VOL) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_battery_get_voltage2() < SERIES_PROTECT_VOL) {
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
@@ -331,7 +361,13 @@ static shark_bool shark_battery_series_enabled(void)
|
|
|
static shark_bool shark_battery_check_series(u8 operate)
|
|
|
{
|
|
|
if (operate != CB_BAT1_BAT2_SERIES) {
|
|
|
- return shark_false;
|
|
|
+ if (is_intelligent == 0) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return shark_battery_series_enabled();
|
|
|
@@ -340,6 +376,14 @@ static shark_bool shark_battery_check_series(u8 operate)
|
|
|
static shark_bool shark_battery_check_parrallel(u8 operate)
|
|
|
{
|
|
|
if (operate != CB_BAT1_BAT2_PARRALLEL) {
|
|
|
+ if (is_intelligent == 0) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
@@ -407,6 +451,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
#if 1
|
|
|
shark_battery_switch_busy = shark_true;
|
|
|
cb_operate_state = shark_battery_switch_auto(cb_operate);
|
|
|
+ sub_bms_info_1.exit_times = 0;
|
|
|
+ sub_bms_info_2.exit_times = 0;
|
|
|
shark_battery_switch_busy = shark_false;
|
|
|
println("switch: %d", cb_operate_state);
|
|
|
return cb_operate_state;
|
|
|
@@ -978,7 +1024,7 @@ uint8_t Select_One_BAT(void)
|
|
|
return CB_BAT1_BAT2_AUTO;
|
|
|
}
|
|
|
|
|
|
- if (shark_battery_ping(5) != SHARK_BATT_MASK_NONE) {
|
|
|
+ if (shark_battery_ping(10) != SHARK_BATT_MASK_NONE) {
|
|
|
return CB_BAT1_BAT2_AUTO;
|
|
|
}
|
|
|
}
|
|
|
@@ -1111,22 +1157,6 @@ void Series_Delay_Timeout(void)
|
|
|
{
|
|
|
Series_delay.count++;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- if(Next_Series_delay.set)
|
|
|
- {
|
|
|
- Next_Series_delay.count++;
|
|
|
- if(Next_Series_delay.count <= NEXT_SERIES_TIME_OUT)
|
|
|
- Next_Series_Not_Enable = 1;
|
|
|
- else
|
|
|
- {
|
|
|
- memset(&Next_Series_delay,0x00,sizeof(Next_Series_delay));
|
|
|
- Next_Series_Not_Enable = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
#ifdef HAN_GUO_VERSION
|
|
|
@@ -1215,12 +1245,14 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
return temp_op;
|
|
|
}
|
|
|
|
|
|
- if(serise_low_enable)
|
|
|
+#ifndef HAN_GUO_VERSION
|
|
|
+ if (shark_battery_series_locked)
|
|
|
{
|
|
|
temp_op = Select_One_BAT();
|
|
|
return temp_op;
|
|
|
}
|
|
|
-
|
|
|
+#endif
|
|
|
+
|
|
|
if(IS_CHARGE_IN())
|
|
|
{
|
|
|
temp_op = Select_One_BAT();
|
|
|
@@ -1268,9 +1300,8 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
if(Series_delay.set&&Series_delay.count >= SERIES_UNDER_VOL_TIME_OUT)
|
|
|
{
|
|
|
memset(&Series_delay,0x00,sizeof(Series_delay));
|
|
|
- temp_op = Select_One_BAT();
|
|
|
- serise_low_enable = 1;
|
|
|
- return temp_op;
|
|
|
+ shark_battery_series_locked = shark_true;
|
|
|
+ return Select_One_BAT();
|
|
|
}
|
|
|
|
|
|
if(sub_bms_info_1.packet_common.m_percent < SERIES_EXIT_PERCENT || sub_bms_info_2.packet_common.m_percent < SERIES_EXIT_PERCENT)
|
|
|
@@ -1357,12 +1388,6 @@ void Check_CB_Operate_State(void)
|
|
|
break;
|
|
|
case CB_BAT1_BAT2_SERIES:
|
|
|
temp_op = Check_CB_BAT1_BAT2_SERIES();
|
|
|
- /*if(temp_op != CB_MAX)
|
|
|
- {
|
|
|
- Next_Series_delay.set = 1;
|
|
|
- Next_Series_delay.count = 0;
|
|
|
- Next_Series_Not_Enable = 1;
|
|
|
- }*/
|
|
|
break;
|
|
|
default:
|
|
|
return;
|
|
|
@@ -1421,7 +1446,6 @@ uint8_t Is_BAT2_Lock(void)
|
|
|
void Charger_Out(void)
|
|
|
{
|
|
|
Set_Charger_In(0);
|
|
|
- one_bat_charge_status = OBCS_CHARGER_OUT;
|
|
|
|
|
|
if(sub_bms_info_1.packet_common.m_percent >= 100 && sub_bms_info_2.packet_common.m_percent >= 100)
|
|
|
battery_charged_full = 1;
|
|
|
@@ -1451,11 +1475,6 @@ void Check_Charge_In(void)
|
|
|
else
|
|
|
{
|
|
|
CHARG_PROTECT_OPEN(1);
|
|
|
- if(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2)
|
|
|
- {
|
|
|
- if(one_bat_charge_status == OBCS_CHARGER_OUT)
|
|
|
- one_bat_charge_status = OBCS_CHARGER_IN;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -1563,21 +1582,20 @@ uint8_t Change_Mode_Sub_BMS_SERIES(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+#if 0
|
|
|
//
|
|
|
if(!(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2))
|
|
|
return 0;
|
|
|
-
|
|
|
+#endif
|
|
|
+
|
|
|
if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_SERIES)
|
|
|
return 0;
|
|
|
-#ifdef HAN_GUO_VERSION
|
|
|
-#else
|
|
|
- if(serise_low_enable)
|
|
|
- return 0;
|
|
|
-#endif
|
|
|
|
|
|
+#if 0
|
|
|
if(IS_CHARGE_IN())
|
|
|
return 0;
|
|
|
-
|
|
|
+#endif
|
|
|
+
|
|
|
if(!(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS))
|
|
|
return 0;
|
|
|
|
|
|
@@ -1602,9 +1620,6 @@ uint8_t Change_Mode_Sub_BMS_SERIES(void)
|
|
|
|| sub_bms_info_2.packet_common.m_percent < 2)
|
|
|
return 0;
|
|
|
#else
|
|
|
- if(Next_Series_Not_Enable)
|
|
|
- return 0;
|
|
|
-
|
|
|
if(shark_battery_get_voltage1() < SERIES_PROTECT_VOL || shark_battery_get_voltage2() < SERIES_PROTECT_VOL )
|
|
|
return 0;
|
|
|
|
|
|
@@ -1688,24 +1703,10 @@ void Intelligent_Management_Battery(void)
|
|
|
case CB_BAT1:
|
|
|
if(IS_CHARGER_ON())
|
|
|
{
|
|
|
- if((sub_bms_info_1.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
|
|
|
+ if (shark_battery_charge_complete1() || shark_battery_get_capacity2() + SHARK_CHARGE_CAPACITY_DELTA < shark_battery_get_capacity1())
|
|
|
{
|
|
|
Battery_Change_Mode(CFG_BAT2);
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- if(one_bat_charge_status == OBCS_CHARGER_IN)
|
|
|
- {
|
|
|
- if(shark_battery_get_voltage2() < shark_battery_get_voltage1())
|
|
|
- {
|
|
|
- Battery_Change_Mode(CFG_BAT2);
|
|
|
- }
|
|
|
-
|
|
|
- one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -1719,23 +1720,10 @@ void Intelligent_Management_Battery(void)
|
|
|
case CB_BAT2:
|
|
|
if(IS_CHARGER_ON())
|
|
|
{
|
|
|
- if((sub_bms_info_2.packet_common.bms_status & BMS_STA_C_FULL) == BMS_STA_C_FULL)
|
|
|
+ if (shark_battery_charge_complete2() || shark_battery_get_capacity1() + SHARK_CHARGE_CAPACITY_DELTA < shark_battery_get_capacity2())
|
|
|
{
|
|
|
Battery_Change_Mode(CFG_BAT1);
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- if(one_bat_charge_status == OBCS_CHARGER_IN)
|
|
|
- {
|
|
|
- if(shark_battery_get_voltage1() < shark_battery_get_voltage2())
|
|
|
- {
|
|
|
- Battery_Change_Mode(CFG_BAT1);
|
|
|
- }
|
|
|
-
|
|
|
- one_bat_charge_status = OBCS_CHARGER_CHECK_FINISH;
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
else
|
|
|
{
|