|
|
@@ -42,7 +42,8 @@ const double nhb_default = 600;
|
|
|
SHENG_YU_LI_CHENG sheng_yu_li_cheng;
|
|
|
DELAY_COMMON save_param_delay;
|
|
|
|
|
|
-uint8_t shark_printf_enable;
|
|
|
+shark_bool shark_battery_switch_busy;
|
|
|
+shark_bool shark_printf_enabled;
|
|
|
|
|
|
void Misc_Initial(void)
|
|
|
{
|
|
|
@@ -121,12 +122,78 @@ shark_bool battery_wait_voltage_down(u32 voltage)
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
-shark_bool battery_wait_voltage_up(u32 voltage)
|
|
|
+shark_bool battery_wait_voltage_parallel(void)
|
|
|
{
|
|
|
- u64 time = shark_get_time() + 500;
|
|
|
+ u64 time1 = shark_get_time() + 1000;
|
|
|
+ u64 time2 = shark_get_time() + 5000;
|
|
|
+ u32 voltage_min, voltage_max;
|
|
|
+
|
|
|
+ if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
+ if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
+ if (sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol) {
|
|
|
+ voltage_min = sub_bms_info_1.packet_common.m_total_vol;
|
|
|
+ voltage_max = sub_bms_info_2.packet_common.m_total_vol;
|
|
|
+ } else {
|
|
|
+ voltage_min = sub_bms_info_2.packet_common.m_total_vol;
|
|
|
+ voltage_max = sub_bms_info_1.packet_common.m_total_vol;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ voltage_min = voltage_max = sub_bms_info_1.packet_common.m_total_vol;
|
|
|
+ }
|
|
|
+ } else if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
+ voltage_min = voltage_max = sub_bms_info_2.packet_common.m_total_vol;
|
|
|
+ } else {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ voltage_min -= 5000;
|
|
|
+ voltage_max += 5000;
|
|
|
+
|
|
|
+ while (shark_true) {
|
|
|
+ u32 voltage = Measure_Vol();
|
|
|
+ u32 time = shark_get_time_safe();
|
|
|
+
|
|
|
+ if (voltage < voltage_min) {
|
|
|
+ if (time > time1) {
|
|
|
+ println("parallel: %d < %d", voltage, voltage_min);
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+ } else if (voltage > voltage_max) {
|
|
|
+ if (time > time2) {
|
|
|
+ println("parallel: %d > %d", voltage, voltage_max);
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return shark_true;
|
|
|
+}
|
|
|
+
|
|
|
+shark_bool battery_wait_voltage_series(void)
|
|
|
+{
|
|
|
+ u64 time = shark_get_time() + 1000;
|
|
|
+ u32 voltage, voltage_min;
|
|
|
+
|
|
|
+ if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sub_bms_info_2.conn_state != SUB_BMS_CONT_HV485) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
|
|
|
- while (Measure_Vol() < voltage) {
|
|
|
- if (time < shark_get_time_safe()) {
|
|
|
+ voltage_min = sub_bms_info_1.packet_common.m_total_vol + sub_bms_info_2.packet_common.m_total_vol - 5000;
|
|
|
+
|
|
|
+ while (shark_true) {
|
|
|
+ voltage = Measure_Vol();
|
|
|
+ if (voltage > voltage_min) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_get_time_safe() > time) {
|
|
|
+ println("series: %d < %d", voltage, voltage_min);
|
|
|
return shark_false;
|
|
|
}
|
|
|
}
|
|
|
@@ -134,6 +201,7 @@ shark_bool battery_wait_voltage_up(u32 voltage)
|
|
|
return shark_true;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
static u8 shark_battery_switch_series(void)
|
|
|
{
|
|
|
Power_On_Normal(0, 2);
|
|
|
@@ -161,7 +229,12 @@ static u8 shark_battery_switch_series(void)
|
|
|
}
|
|
|
|
|
|
shark_bms_set_mos_series();
|
|
|
- battery_wait_voltage_up(SERIES_VOLTAGE_MIN);
|
|
|
+
|
|
|
+ if (!battery_wait_voltage_series()) {
|
|
|
+ shark_bms_set_mos_close();
|
|
|
+ return CB_BAT_NO;
|
|
|
+ }
|
|
|
+
|
|
|
delay_1ms(200);
|
|
|
|
|
|
if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
|
|
|
@@ -234,32 +307,15 @@ static u8 shark_battery_switch_bat1_or_bat2(void)
|
|
|
|
|
|
static u8 shark_battery_switch_auto(shark_bool series)
|
|
|
{
|
|
|
- u8 mask;
|
|
|
-
|
|
|
shark_bms_set_mos_close();
|
|
|
sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
|
|
|
sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
|
|
|
|
|
|
- if (!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
|
|
|
- return CB_BAT_NO;
|
|
|
- }
|
|
|
-
|
|
|
- mask = shark_battery_detect();
|
|
|
- if (mask == 0) {
|
|
|
+ if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) == 0) {
|
|
|
return CB_BAT_NO;
|
|
|
}
|
|
|
|
|
|
- if (cb_operate_state == CB_BAT_NO) {
|
|
|
- mask = shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_SMALL, mask);
|
|
|
- if (mask == 0) {
|
|
|
- return CB_BAT_NO;
|
|
|
- }
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
- }
|
|
|
-
|
|
|
- mask = shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, mask);
|
|
|
- if (mask == 0) {
|
|
|
+ if (!battery_wait_voltage_parallel()) {
|
|
|
return CB_BAT_NO;
|
|
|
}
|
|
|
|
|
|
@@ -284,6 +340,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
{
|
|
|
uint16_t i = 0;
|
|
|
|
|
|
+ shark_battery_switch_busy = shark_true;
|
|
|
+
|
|
|
if (Is_Soak()) {
|
|
|
cb_operate = CB_BAT_NO;
|
|
|
}
|
|
|
@@ -296,7 +354,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
{
|
|
|
case CB_BAT1_BAT2_AUTO:
|
|
|
cb_operate = shark_battery_switch_auto(shark_false);
|
|
|
- println("switch auto: %d", cb_operate);
|
|
|
+ println("single auto: %d", cb_operate);
|
|
|
break;
|
|
|
|
|
|
case CB_BAT1:
|
|
|
@@ -583,7 +641,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
case CB_BAT1_BAT2_SERIES:
|
|
|
#if 1
|
|
|
cb_operate = shark_battery_switch_auto(shark_true);
|
|
|
- println("switch auto: %d", cb_operate);
|
|
|
+ println("series auto: %d", cb_operate);
|
|
|
#else
|
|
|
Power_On_Normal(0,2);
|
|
|
shark_bms_set_mos_close();
|
|
|
@@ -772,13 +830,15 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
// cb_val_last = cb_val_temp;
|
|
|
|
|
|
cb_operate_state = cb_operate;
|
|
|
-
|
|
|
+ shark_battery_switch_busy = shark_false;
|
|
|
+
|
|
|
return cb_operate;
|
|
|
|
|
|
SWITCH_ERROR:
|
|
|
println("switch err");
|
|
|
shark_bms_set_mos_close();
|
|
|
cb_operate_state = CB_BAT_NO;
|
|
|
+ shark_battery_switch_busy = shark_false;
|
|
|
return cb_operate_state;
|
|
|
|
|
|
#undef COM_TIMEOUT
|
|
|
@@ -1093,10 +1153,6 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
return temp_op;
|
|
|
}
|
|
|
|
|
|
- if (Measure_Vol() < SELECT_ONE_BATTERY_VOL) {
|
|
|
- return Select_One_BAT();
|
|
|
- }
|
|
|
-
|
|
|
if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
|
|
|
{
|
|
|
if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
|