Jelajahi Sumber

support series disable

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 tahun lalu
induk
melakukan
4078c85a18
6 mengubah file dengan 151 tambahan dan 69 penghapusan
  1. 1 1
      Project/version.txt
  2. 135 65
      Source/app.c
  3. 10 1
      Source/app.h
  4. 2 1
      Source/app_end_ctr.c
  5. 2 0
      Source/common.h
  6. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V10_11072107
+PS100XX_V10_11081512

+ 135 - 65
Source/app.c

@@ -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;
 		}
 

+ 10 - 1
Source/app.h

@@ -21,6 +21,9 @@
 
 #define ONE_BATTERY_DELTA_VOL    (500)
 
+#define SHARK_BATT_VOLTAGE_FUZZ		5000
+#define SHARK_SERIES_MAX_TIMES		10
+
 enum
 {
 	PRE_PARRALLEL,
@@ -85,6 +88,12 @@ extern DELAY_COMMON Check_CB_oper_sta_delay;
 extern uint8_t is_intelligent;
 extern uint8_t CB_OPERATE_PRECEDENCE_Config;
 
+extern shark_bool shark_battery_series_disabled;
+extern u8 shark_battery_series_times;
+
+extern shark_bool shark_battery_switch_busy;
+extern shark_bool shark_printf_enabled;
+
 __inline void Check_CB_Oper_Sta_Delay(void)
 {
 	if(Check_CB_oper_sta_delay.set)
@@ -112,7 +121,7 @@ __inline void Check_CB_Oper_Sta_Delay(void)
 #define SELECT_ONE_BATTERY_VOL  (60000)
 #define SINGLE_VOLTAGE_MIN  (30000)
 #define SERIES_VOLTAGE_MIN  (80000)
-#define SERIES_UNDER_XX_PERCENT  (20)
+#define SERIES_UNDER_XX_PERCENT  (2)
 
 enum
 {

+ 2 - 1
Source/app_end_ctr.c

@@ -196,6 +196,7 @@ int8_t Handle_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 						//ACC2_Enable(0);
 						QD_Enable_From(0,2);
 						serise_low_enable = 0;
+						shark_battery_series_disabled = shark_false;
 						break;
 					case 1:
 						//QD_Enable(1);
@@ -595,7 +596,7 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					buf[len++] = 0;
 					break;
 				case 3:
-					shark_printf_enabled = buf[len];
+					shark_printf_enabled = SHARK_BOOL(buf[len]);
 					if (shark_printf_enabled) {
 						println("log enabled");
 					}

+ 2 - 0
Source/common.h

@@ -11,6 +11,8 @@
 #include "gd32f10x_libopt.h"
 #include "delay.h"
 
+#define CONFIG_SOAK_ENABLE		0
+
 #define DEBUG_MODE    (0)
  
 #define CONFIG_CAN_IAP

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V10_11072107"
+#define CONFIG_VERSION "PS100XX_V10_11081512"