|
|
@@ -9,6 +9,7 @@
|
|
|
#include "app_can.h"
|
|
|
#include "low_power.h"
|
|
|
#include "app_end_ctr.h"
|
|
|
+#include "drv_io.h"
|
|
|
|
|
|
// CB_VAL cb_val_last;
|
|
|
uint8_t cb_operate_state = CB_BAT_NO;
|
|
|
@@ -42,6 +43,9 @@ const double nhb_default = 600;
|
|
|
SHENG_YU_LI_CHENG sheng_yu_li_cheng;
|
|
|
DELAY_COMMON save_param_delay;
|
|
|
|
|
|
+shark_bool shark_battery_series_disabled;
|
|
|
+u8 shark_battery_series_times;
|
|
|
+
|
|
|
shark_bool shark_battery_switch_busy;
|
|
|
shark_bool shark_printf_enabled;
|
|
|
|
|
|
@@ -102,26 +106,6 @@ uint8_t Check_Battery_2_On(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-shark_bool battery_wait_voltage_down(u32 voltage)
|
|
|
-{
|
|
|
- u8 success = 0;
|
|
|
- u16 times;
|
|
|
-
|
|
|
- for (times = 500; times > 0; times--) {
|
|
|
- if (Measure_Vol() < voltage) {
|
|
|
- if (++success > 20) {
|
|
|
- return shark_true;
|
|
|
- }
|
|
|
- } else {
|
|
|
- success = 0;
|
|
|
- }
|
|
|
-
|
|
|
- delay_1ms(10);
|
|
|
- }
|
|
|
-
|
|
|
- return shark_false;
|
|
|
-}
|
|
|
-
|
|
|
shark_bool battery_wait_voltage_parallel(void)
|
|
|
{
|
|
|
u64 time1 = shark_get_time() + 1000;
|
|
|
@@ -130,28 +114,26 @@ shark_bool battery_wait_voltage_parallel(void)
|
|
|
|
|
|
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;
|
|
|
+ if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
|
|
|
voltage_max = sub_bms_info_1.packet_common.m_total_vol;
|
|
|
+ } else {
|
|
|
+ voltage_max = sub_bms_info_2.packet_common.m_total_vol;
|
|
|
}
|
|
|
} else {
|
|
|
- voltage_min = voltage_max = sub_bms_info_1.packet_common.m_total_vol;
|
|
|
+ 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;
|
|
|
+ voltage_max = sub_bms_info_2.packet_common.m_total_vol;
|
|
|
} else {
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
- voltage_min -= 5000;
|
|
|
- voltage_max += 5000;
|
|
|
+ voltage_min = voltage_max - SHARK_BATT_VOLTAGE_FUZZ;
|
|
|
+ voltage_max += SHARK_BATT_VOLTAGE_FUZZ;
|
|
|
|
|
|
while (shark_true) {
|
|
|
- u32 voltage = Measure_Vol();
|
|
|
u32 time = shark_get_time_safe();
|
|
|
+ u32 voltage = Measure_Vol();
|
|
|
|
|
|
if (voltage < voltage_min) {
|
|
|
if (time > time1) {
|
|
|
@@ -173,8 +155,9 @@ shark_bool battery_wait_voltage_parallel(void)
|
|
|
|
|
|
shark_bool battery_wait_voltage_series(void)
|
|
|
{
|
|
|
- u64 time = shark_get_time() + 1000;
|
|
|
- u32 voltage, voltage_min;
|
|
|
+ u64 time1 = shark_get_time() + 200;
|
|
|
+ u64 time2 = time1 + 800;
|
|
|
+ u32 voltage_min;
|
|
|
|
|
|
if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
|
|
|
return shark_false;
|
|
|
@@ -184,15 +167,21 @@ shark_bool battery_wait_voltage_series(void)
|
|
|
return shark_false;
|
|
|
}
|
|
|
|
|
|
- voltage_min = sub_bms_info_1.packet_common.m_total_vol + sub_bms_info_2.packet_common.m_total_vol - 5000;
|
|
|
+ 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 + 20000;
|
|
|
+ } else {
|
|
|
+ voltage_min = sub_bms_info_2.packet_common.m_total_vol + 20000;
|
|
|
+ }
|
|
|
|
|
|
while (shark_true) {
|
|
|
- voltage = Measure_Vol();
|
|
|
- if (voltage > voltage_min) {
|
|
|
+ u64 time = shark_get_time_safe();
|
|
|
+ u32 voltage = Measure_Vol();
|
|
|
+
|
|
|
+ if (voltage > voltage_min && time > time1) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (shark_get_time_safe() > time) {
|
|
|
+ if (time > time2) {
|
|
|
println("series: %d < %d", voltage, voltage_min);
|
|
|
return shark_false;
|
|
|
}
|
|
|
@@ -201,10 +190,9 @@ shark_bool battery_wait_voltage_series(void)
|
|
|
return shark_true;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static u8 shark_battery_switch_series(void)
|
|
|
{
|
|
|
- Power_On_Normal(0, 2);
|
|
|
+ // Power_On_Normal(0, 2);
|
|
|
|
|
|
if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
|
|
|
if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, 3) != 3) {
|
|
|
@@ -235,8 +223,6 @@ static u8 shark_battery_switch_series(void)
|
|
|
return CB_BAT_NO;
|
|
|
}
|
|
|
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
|
|
|
shark_bms_set_mos_close();
|
|
|
return CB_BAT_NO;
|
|
|
@@ -244,10 +230,20 @@ static u8 shark_battery_switch_series(void)
|
|
|
|
|
|
sub_bms_info_1.state = SHARK_BATT_STATE_USED;
|
|
|
sub_bms_info_2.state = SHARK_BATT_STATE_USED;
|
|
|
+ shark_battery_series_disabled = shark_false;
|
|
|
|
|
|
return CB_BAT1_BAT2_SERIES;
|
|
|
}
|
|
|
|
|
|
+static u8 shark_battery_switch_parrallel(void)
|
|
|
+{
|
|
|
+ shark_bms_set_mos_parrallel();
|
|
|
+ sub_bms_info_1.state = SHARK_BATT_STATE_USED;
|
|
|
+ sub_bms_info_2.state = SHARK_BATT_STATE_USED;
|
|
|
+
|
|
|
+ return CB_BAT1_BAT2_PARRALLEL;
|
|
|
+}
|
|
|
+
|
|
|
static u8 shark_battery_switch_bat1(u8 mask)
|
|
|
{
|
|
|
if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, mask) != mask) {
|
|
|
@@ -274,7 +270,7 @@ static u8 shark_battery_switch_bat2(u8 mask)
|
|
|
return CB_BAT2;
|
|
|
}
|
|
|
|
|
|
-static u8 shark_battery_switch_bat1_or_bat2(void)
|
|
|
+static u8 shark_battery_switch_single(void)
|
|
|
{
|
|
|
u64 time = shark_get_time() + 500;
|
|
|
u32 open1 = 0;
|
|
|
@@ -290,6 +286,9 @@ static u8 shark_battery_switch_bat1_or_bat2(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ println("open: %d %d", open1, open2);
|
|
|
+ println("voltage: %d %d", sub_bms_info_1.packet_common.m_total_vol, sub_bms_info_2.packet_common.m_total_vol);
|
|
|
+
|
|
|
if (open1 > open2) {
|
|
|
return shark_battery_switch_bat1(3);
|
|
|
}
|
|
|
@@ -305,8 +304,61 @@ static u8 shark_battery_switch_bat1_or_bat2(void)
|
|
|
return shark_battery_switch_bat2(3);
|
|
|
}
|
|
|
|
|
|
-static u8 shark_battery_switch_auto(shark_bool series)
|
|
|
+static shark_bool shark_battery_series_enabled(void)
|
|
|
+{
|
|
|
+ if (QD_Dect()) {
|
|
|
+ if (end_ctr_self_ss_new.xl_sta) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_battery_series_disabled) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shark_battery_series_times > SHARK_SERIES_MAX_TIMES) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (IS_CHARGE_IN()) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return shark_true;
|
|
|
+}
|
|
|
+
|
|
|
+static shark_bool shark_battery_check_series(u8 operate)
|
|
|
+{
|
|
|
+ if (operate != CB_BAT1_BAT2_SERIES) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return shark_battery_series_enabled();
|
|
|
+}
|
|
|
+
|
|
|
+static shark_bool shark_battery_check_parrallel(u8 operate)
|
|
|
+{
|
|
|
+ if (operate != CB_BAT1_BAT2_PARRALLEL) {
|
|
|
+ return shark_false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return SHARK_BOOL(IS_CHARGE_IN());
|
|
|
+}
|
|
|
+
|
|
|
+static u8 shark_battery_switch_auto(u8 operate)
|
|
|
{
|
|
|
+ if (operate == cb_operate_state) {
|
|
|
+ return operate;
|
|
|
+ }
|
|
|
+
|
|
|
shark_bms_set_mos_close();
|
|
|
sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
|
|
|
sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
|
|
|
@@ -315,16 +367,29 @@ static u8 shark_battery_switch_auto(shark_bool series)
|
|
|
return CB_BAT_NO;
|
|
|
}
|
|
|
|
|
|
+ if (operate == CB_BAT_NO) {
|
|
|
+ return CB_BAT_NO;
|
|
|
+ }
|
|
|
+
|
|
|
if (!battery_wait_voltage_parallel()) {
|
|
|
return CB_BAT_NO;
|
|
|
}
|
|
|
|
|
|
if (shark_battery_is_normal_power_on(&sub_bms_info_1)) {
|
|
|
if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
|
|
|
- if (series) {
|
|
|
- return shark_battery_switch_series();
|
|
|
+ if (shark_battery_check_series(operate)) {
|
|
|
+ operate = shark_battery_switch_series();
|
|
|
+ if (operate == CB_BAT1_BAT2_SERIES) {
|
|
|
+ shark_battery_series_times = 0;
|
|
|
+ } else if (shark_battery_series_times < 0xFF) {
|
|
|
+ shark_battery_series_times++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return operate;
|
|
|
+ } else if (shark_battery_check_parrallel(operate)) {
|
|
|
+ return shark_battery_switch_parrallel();
|
|
|
} else {
|
|
|
- return shark_battery_switch_bat1_or_bat2();
|
|
|
+ return shark_battery_switch_single();
|
|
|
}
|
|
|
} else {
|
|
|
return shark_battery_switch_bat1(1);
|
|
|
@@ -338,16 +403,15 @@ static u8 shark_battery_switch_auto(shark_bool series)
|
|
|
|
|
|
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;
|
|
|
- }
|
|
|
-
|
|
|
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;
|
|
|
+ println("switch: %d", cb_operate_state);
|
|
|
+ return cb_operate_state;
|
|
|
+#else
|
|
|
#define COM_TIMEOUT (15)
|
|
|
|
|
|
switch(cb_operate)
|
|
|
@@ -830,7 +894,6 @@ 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;
|
|
|
|
|
|
@@ -838,11 +901,10 @@ 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
|
|
|
-
|
|
|
+#endif
|
|
|
}
|
|
|
void test_io(void)
|
|
|
{
|
|
|
@@ -1176,7 +1238,10 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
-
|
|
|
+ if (end_ctr_self_ss_new.xl_sta && QD_Dect()) {
|
|
|
+ shark_battery_series_disabled = shark_true;
|
|
|
+ }
|
|
|
+
|
|
|
#ifdef HAN_GUO_VERSION
|
|
|
temp_op = Select_One_BAT_Han_Guo();
|
|
|
#else
|
|
|
@@ -1217,14 +1282,14 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
|
|
|
serise_low_enable = 1;
|
|
|
return temp_op;
|
|
|
}
|
|
|
-
|
|
|
-/* if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
|
|
|
+
|
|
|
+ if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
|
|
|
|| sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
|
|
|
{
|
|
|
temp_op = Select_One_BAT();
|
|
|
return temp_op;
|
|
|
}
|
|
|
-*/
|
|
|
+
|
|
|
return temp_op;
|
|
|
}
|
|
|
|
|
|
@@ -1320,9 +1385,11 @@ void Check_CB_Operate_State(void)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+#if CONFIG_SOAK_ENABLE
|
|
|
if (Is_Soak()) {
|
|
|
temp_op = CB_BAT_NO;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
if(temp_op >= CB_MAX)
|
|
|
{
|
|
|
@@ -1527,6 +1594,10 @@ uint8_t Change_Mode_Sub_BMS_SERIES(void)
|
|
|
{
|
|
|
int32_t m_1_total_vol,m_2_total_vol;
|
|
|
|
|
|
+ if (!shark_battery_series_enabled()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
//
|
|
|
if(!(cb_operate_state == CB_BAT1 || cb_operate_state == CB_BAT2))
|
|
|
return 0;
|
|
|
@@ -1578,11 +1649,9 @@ uint8_t Change_Mode_Sub_BMS_SERIES(void)
|
|
|
||m_2_total_vol <= SERIES_PROTECT_VOL )
|
|
|
return 0;
|
|
|
|
|
|
-#if 0
|
|
|
if(sub_bms_info_1.packet_common.m_percent < SERIES_UNDER_XX_PERCENT\
|
|
|
|| sub_bms_info_2.packet_common.m_percent < SERIES_UNDER_XX_PERCENT)
|
|
|
return 0;
|
|
|
-#endif
|
|
|
#endif
|
|
|
return 1;
|
|
|
}
|
|
|
@@ -1648,9 +1717,10 @@ void Intelligent_Management_Battery(void)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if(cb_operate_state == CB_BAT1_BAT2_SERIES || end_ctr_self_ss_new.qd_sta)
|
|
|
- return;
|
|
|
- else if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
|
|
|
+ if(cb_operate_state == CB_BAT1_BAT2_SERIES)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
|
|
|
return;
|
|
|
}
|
|
|
|