|
|
@@ -115,6 +115,10 @@ shark_bool battery_wait_voltage_parallel(void)
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
+ if (shark_charger_state != SHARK_CHG_REMOVE && QD_Dect() == 0) {
|
|
|
+ return shark_true;
|
|
|
+ }
|
|
|
+
|
|
|
voltage_min = voltage_max - SHARK_BATT_VOLTAGE_FUZZ;
|
|
|
|
|
|
if (shark_charger_enabled) {
|
|
|
@@ -403,7 +407,7 @@ static u8 shark_battery_switch_auto(u8 operate)
|
|
|
return operate;
|
|
|
} else if (shark_battery_check_parrallel(operate)) {
|
|
|
return shark_battery_switch_parrallel();
|
|
|
- } else if (shark_charger_state == SHARK_CHG_INSERT) {
|
|
|
+ } else if (shark_charger_state != SHARK_CHG_REMOVE) {
|
|
|
return shark_battery_switch_charge();
|
|
|
} else {
|
|
|
return shark_battery_switch_single();
|
|
|
@@ -422,514 +426,17 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
|
|
|
{
|
|
|
println("switch: %d -> %d", cb_operate_state, cb_operate);
|
|
|
|
|
|
-#if 1
|
|
|
shark_battery_switch_busy = shark_true;
|
|
|
cb_operate_state = shark_battery_switch_auto(cb_operate);
|
|
|
+ shark_battery_switch_busy = shark_false;
|
|
|
+
|
|
|
sub_bms_info_1.exit_times = 0;
|
|
|
sub_bms_info_2.exit_times = 0;
|
|
|
- shark_battery_switch_busy = shark_false;
|
|
|
+ shark_charger_set_enable(shark_true);
|
|
|
|
|
|
println("switch: %d", cb_operate_state);
|
|
|
|
|
|
- if (shark_charger_state == SHARK_CHG_INSERT) {
|
|
|
- shark_charger_set_enable(shark_true);
|
|
|
- }
|
|
|
-
|
|
|
- return cb_operate_state;
|
|
|
-#else
|
|
|
-#define COM_TIMEOUT (15)
|
|
|
-
|
|
|
- switch(cb_operate)
|
|
|
- {
|
|
|
- case CB_BAT1_BAT2_AUTO:
|
|
|
- cb_operate = shark_battery_switch_auto(shark_false);
|
|
|
- println("single auto: %d", cb_operate);
|
|
|
- break;
|
|
|
-
|
|
|
- case CB_BAT1:
|
|
|
- shark_bms_set_mos_close();
|
|
|
-
|
|
|
- if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- switch(cb_operate_state)
|
|
|
- {
|
|
|
- case CB_BAT_NO:
|
|
|
- //
|
|
|
- if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- else if(sub_bms_info_2.conn_state == SUB_BMS_DISC_NO485)
|
|
|
- {
|
|
|
- if(Check_Battery_2_On())
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(one_bat_initial == 0)
|
|
|
- {
|
|
|
- if(Operate_Sub_BMS_1_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT1:
|
|
|
- break;
|
|
|
- case CB_BAT2:
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_PARRALLEL:
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_SERIES:
|
|
|
- //
|
|
|
- if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- //if(RS485_busy_2)
|
|
|
- // goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(0) == 0)
|
|
|
- {
|
|
|
- // goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- Operate_Sub_BMS_2_CD(0);
|
|
|
-
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- shark_bms_set_mos_bat1();
|
|
|
- sub_bms_info_1.state = SHARK_BATT_STATE_USED;
|
|
|
- sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
|
|
|
- break;
|
|
|
- case CB_BAT2:
|
|
|
- shark_bms_set_mos_close();
|
|
|
-
|
|
|
- if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- switch(cb_operate_state)
|
|
|
- {
|
|
|
- case CB_BAT_NO:
|
|
|
- //
|
|
|
- if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_1_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- else if(sub_bms_info_1.conn_state == SUB_BMS_DISC_NO485)
|
|
|
- {
|
|
|
- if(Check_Battery_1_On())
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(one_bat_initial == 0)
|
|
|
- {
|
|
|
- if(Operate_Sub_BMS_2_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
- }
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT1:
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT2:
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_PARRALLEL:
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_SERIES:
|
|
|
- //
|
|
|
- if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- //if(RS485_busy_1)
|
|
|
- // goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(0) == 0)
|
|
|
- {
|
|
|
- //goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- Operate_Sub_BMS_1_CD(0);
|
|
|
-
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- shark_bms_set_mos_bat2();
|
|
|
- sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
|
|
|
- sub_bms_info_2.state = SHARK_BATT_STATE_USED;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_PARRALLEL:
|
|
|
- shark_bms_set_mos_close();
|
|
|
-
|
|
|
- if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- switch(cb_operate_state)
|
|
|
- {
|
|
|
- case CB_BAT_NO:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- case CB_BAT1:
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- if(Operate_Sub_BMS_2_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT2:
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_PARRALLEL:
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_SERIES:
|
|
|
- delay_1ms(10);
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
-
|
|
|
- shark_bms_set_mos_parrallel();
|
|
|
- sub_bms_info_1.state = SHARK_BATT_STATE_USED;
|
|
|
- sub_bms_info_2.state = SHARK_BATT_STATE_USED;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_SERIES:
|
|
|
-#if 1
|
|
|
- cb_operate = shark_battery_switch_auto(shark_true);
|
|
|
- println("series auto: %d", cb_operate);
|
|
|
-#else
|
|
|
- Power_On_Normal(0,2);
|
|
|
- shark_bms_set_mos_close();
|
|
|
-
|
|
|
- //delay_1ms(2000);
|
|
|
-
|
|
|
- //serise_low_qd_status = QD_Dect();
|
|
|
- //Power_On_Normal(0,2);
|
|
|
-
|
|
|
- switch(cb_operate_state)
|
|
|
- {
|
|
|
- case CB_BAT_NO:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- case CB_BAT1:
|
|
|
- delay_1ms(10);
|
|
|
- shark_bms_set_mos_series();
|
|
|
-
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- /*for(uint16_t i = 0;i < 20;i++)
|
|
|
- {
|
|
|
-
|
|
|
- if(Handle_Can_Data() == 1)
|
|
|
- {
|
|
|
- // output fail
|
|
|
-
|
|
|
- ;
|
|
|
- }
|
|
|
- delay_1ms(10);
|
|
|
- }*/
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- break;
|
|
|
- case CB_BAT2:
|
|
|
- delay_1ms(10);
|
|
|
- shark_bms_set_mos_series();
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- /*for(uint16_t i = 0;i < 20;i++)
|
|
|
- {
|
|
|
-
|
|
|
- if(Handle_Can_Data() == 1)
|
|
|
- {
|
|
|
- // output fail
|
|
|
-
|
|
|
- ;
|
|
|
- }
|
|
|
- delay_1ms(10);
|
|
|
- }*/
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_PARRALLEL:
|
|
|
-
|
|
|
- if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
|
|
|
- {
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_1)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_1)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- delay_1ms(50);
|
|
|
-
|
|
|
- delay_1ms(10);
|
|
|
- shark_bms_set_mos_series();
|
|
|
-
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- /*for(uint16_t i = 0;i < 20;i++)
|
|
|
- {
|
|
|
-
|
|
|
- if(Handle_Can_Data() == 1)
|
|
|
- {
|
|
|
- // output fail
|
|
|
-
|
|
|
- ;
|
|
|
- }
|
|
|
- delay_1ms(10);
|
|
|
- }*/
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_1_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //
|
|
|
- i = 0;
|
|
|
- while(i++ < COM_TIMEOUT && RS485_busy_2)
|
|
|
- delay_1ms(10);
|
|
|
-
|
|
|
- if(RS485_busy_2)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(0) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- delay_1ms(50);
|
|
|
-
|
|
|
- delay_1ms(10);
|
|
|
- shark_bms_set_mos_series();
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(2) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
-
|
|
|
- /*for(uint16_t i = 0;i < 20;i++)
|
|
|
- {
|
|
|
-
|
|
|
- if(Handle_Can_Data() == 1)
|
|
|
- {
|
|
|
- // output fail
|
|
|
-
|
|
|
- ;
|
|
|
- }
|
|
|
- delay_1ms(10);
|
|
|
- }*/
|
|
|
-
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
- if(Operate_Sub_BMS_2_CD(1) == 0)
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- break;
|
|
|
- case CB_BAT1_BAT2_SERIES:
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto SWITCH_ERROR;
|
|
|
- }
|
|
|
- delay_1ms(10);
|
|
|
- shark_bms_set_mos_series();
|
|
|
- sub_bms_info_1.state = SHARK_BATT_STATE_USED;
|
|
|
- sub_bms_info_2.state = SHARK_BATT_STATE_USED;
|
|
|
-#endif
|
|
|
- break;
|
|
|
- case CB_BAT_NO:
|
|
|
- default:
|
|
|
- ACC2_Enable(0);
|
|
|
- shark_bms_set_mos_close();
|
|
|
- sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
|
|
|
- sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
|
|
|
- cb_operate = CB_BAT_NO;
|
|
|
- if(Is_Soak())
|
|
|
- {
|
|
|
- sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
|
|
|
- sub_bms_info_1.sub_bms_cmd.param = 0x00;
|
|
|
- sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
|
|
|
- sub_bms_info_2.sub_bms_cmd.param = 0x00;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // cb_val_last = cb_val_temp;
|
|
|
-
|
|
|
- cb_operate_state = cb_operate;
|
|
|
-
|
|
|
- return cb_operate;
|
|
|
-
|
|
|
-SWITCH_ERROR:
|
|
|
- println("switch err");
|
|
|
- shark_bms_set_mos_close();
|
|
|
- cb_operate_state = CB_BAT_NO;
|
|
|
return cb_operate_state;
|
|
|
-
|
|
|
-#undef COM_TIMEOUT
|
|
|
-#endif
|
|
|
}
|
|
|
void test_io(void)
|
|
|
{
|
|
|
@@ -1179,7 +686,7 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- if (shark_charger_state != SHARK_CHG_REMOVE)
|
|
|
+ if (shark_charger_state == SHARK_CHG_INSERT)
|
|
|
{
|
|
|
temp_op = Select_One_BAT();
|
|
|
return temp_op;
|
|
|
@@ -1515,7 +1022,7 @@ void Intelligent_Management_Battery(void)
|
|
|
switch(cb_operate_state)
|
|
|
{
|
|
|
case CB_BAT1:
|
|
|
- if (shark_charger_enabled)
|
|
|
+ if (shark_charger_state != SHARK_CHG_REMOVE)
|
|
|
{
|
|
|
if (shark_battery_charge_complete1() || shark_battery_get_voltage2() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage1())
|
|
|
{
|
|
|
@@ -1528,7 +1035,7 @@ void Intelligent_Management_Battery(void)
|
|
|
}
|
|
|
break;
|
|
|
case CB_BAT2:
|
|
|
- if (shark_charger_enabled)
|
|
|
+ if (shark_charger_state != SHARK_CHG_REMOVE)
|
|
|
{
|
|
|
if (shark_battery_charge_complete2() || shark_battery_get_voltage1() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage2())
|
|
|
{
|