Quellcode durchsuchen

update charge logic

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao vor 5 Jahren
Ursprung
Commit
4305e3bdbd
8 geänderte Dateien mit 120 neuen und 104 gelöschten Zeilen
  1. 1 1
      Project/version.txt
  2. 70 82
      Source/app.c
  3. 5 5
      Source/app.h
  4. 6 10
      Source/app_end_ctr.c
  5. 6 3
      Source/app_rs485_1.c
  6. 31 1
      Source/app_rs485_1.h
  7. 0 1
      Source/drv_usart.c
  8. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V10_11131816
+PS100XX_V11_11151644

+ 70 - 82
Source/app.c

@@ -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
 				{

+ 5 - 5
Source/app.h

@@ -19,11 +19,12 @@
 
 #define CHARGE_DELAY_TIME_OUT_COUNT   (10000)
 
-#define ONE_BATTERY_DELTA_VOL    (500)
+#define ONE_BATTERY_DELTA_VOL    		(500)
 
-#define SHARK_CHARGER_VOLTAGE_MAX	60000
-#define SHARK_BATT_VOLTAGE_FUZZ		10000
-#define SHARK_SERIES_MAX_TIMES		10
+#define SHARK_CHARGE_CAPACITY_DELTA		2
+#define SHARK_CHARGER_VOLTAGE_MAX		60000
+#define SHARK_BATT_VOLTAGE_FUZZ			10000
+#define SHARK_SERIES_MAX_TIMES			10
 
 enum
 {
@@ -145,7 +146,6 @@ enum
 	OBCS_CHARGER_MAX
 };
 extern uint8_t one_bat_charge_status;
-extern uint8_t serise_low_enable;
 extern uint8_t serise_low_qd_status;
 
 #define NENG_HAO_BI_MIN   (300)

+ 6 - 10
Source/app_end_ctr.c

@@ -185,7 +185,6 @@ int8_t Handle_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 						//QD_Enable(0);
 						//ACC2_Enable(0);
 						QD_Enable_From(0,2);
-						serise_low_enable = 0;
 						shark_battery_series_locked = shark_false;
 						break;
 					case 1:
@@ -526,18 +525,15 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					break;
 				case 6:
 					buf[len++] = cb_operate_state;
-					buf[len++] = sub_bms_info_1.err_times;
-					buf[len++] = sub_bms_info_2.err_times;
-					buf[len++] = sub_bms_info_1.connected;
-					buf[len++] = sub_bms_info_2.connected;
-					buf[len++] = sub_bms_info_1.exit_code;
-					buf[len++] = sub_bms_info_2.exit_code;
-					sub_bms_info_1.err_times = sub_bms_info_2.err_times = 0;
+					buf[len++] = sub_bms_info_1.connected << 4 | sub_bms_info_2.connected;
+					buf[len++] = sub_bms_info_1.exit_code << 4 | sub_bms_info_2.exit_code;
 					sub_bms_info_1.exit_code = sub_bms_info_2.exit_code = SHARK_BATT_EXIT_SUCCESS;
 					break;
 				case 7:
-					buf[len++] = end_ctr_self_ss_new.acc12_sta << 1 | ACC2_Dect();
-					buf[len++] = end_ctr_self_ss_new.qd_sta << 1 | QD_Dect();
+					buf[len++] = end_ctr_self_ss_new.acc12_sta << 4 | ACC2_Dect();
+					buf[len++] = end_ctr_self_ss_new.qd_sta << 4 | QD_Dect();
+					buf[len++] = IS_CHARGE_IN() << 4 | IS_CHARGER_ON();
+					buf[len++] = sub_bms_info_1.packet_common.charge_flag << 4 | sub_bms_info_2.packet_common.charge_flag;
 					break;
 				case 8:
 					memcpy(buf + len, &shark_bms_acc2_oc_times, sizeof(shark_bms_acc2_oc_times));

+ 6 - 3
Source/app_rs485_1.c

@@ -399,6 +399,7 @@ shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info, shark_battery_p
 
 	if (code != SHARK_BATT_EXIT_SUCCESS) {
 		info->exit_code = code;
+		info->exit_times++;
 	}
 
 	return code;
@@ -706,9 +707,11 @@ void shark_bms_set_vgs(shark_bms_vgs_t mask, uint8_t enable)
 {
 	static uint8_t shark_bms_vgs_mask;
 
-	println("fl: %d %d", mask, enable);
-
 	if (enable) {
+		if (shark_bms_vgs_mask == 0) {
+			println("FL Enable");
+		}
+
 		shark_bms_vgs_mask |= mask;
 		gpio_bit_reset(GPIO_PORT_FL, GPIO_PIN_FL);
 	} else {
@@ -716,7 +719,7 @@ void shark_bms_set_vgs(shark_bms_vgs_t mask, uint8_t enable)
 
 		if (shark_bms_vgs_mask == 0) {
 			gpio_bit_set(GPIO_PORT_FL, GPIO_PIN_FL);
-			println("fl disabled");
+			println("FL Disable");
 		}
 	}
 }

+ 31 - 1
Source/app_rs485_1.h

@@ -201,7 +201,7 @@ typedef struct
 	u32 uart;
 	u8 address;
 	u8 connected;
-	u8 err_times;
+	u8 exit_times;
 	shark_bool used;
 	shark_send_state_t send_state;
 	shark_battery_exit_t exit_code;
@@ -396,6 +396,36 @@ static inline u32 shark_battery_get_voltage2(void)
 	return shark_battery_get_voltage(&sub_bms_info_2);
 }
 
+static inline u8 shark_battery_get_capacity(SUB_BMS_INFO *info)
+{
+	return info->packet_common.m_percent;
+}
+
+static inline u8 shark_battery_get_capacity1(void)
+{
+	return shark_battery_get_capacity(&sub_bms_info_1);
+}
+
+static inline u8 shark_battery_get_capacity2(void)
+{
+	return shark_battery_get_capacity(&sub_bms_info_2);
+}
+
+static inline shark_bool shark_battery_charge_complete(SUB_BMS_INFO *info)
+{
+	return (info->packet_common.bms_status & BMS_STA_C_FULL) != 0;
+}
+
+static inline shark_bool shark_battery_charge_complete1(void)
+{
+	return shark_battery_charge_complete(&sub_bms_info_1);
+}
+
+static inline shark_bool shark_battery_charge_complete2(void)
+{
+	return shark_battery_charge_complete(&sub_bms_info_2);
+}
+
 static inline shark_bool shark_battery_send_pending(SUB_BMS_INFO *info)
 {
 	return info->send_state == SHARK_SEND_PENDING;

+ 0 - 1
Source/drv_usart.c

@@ -143,7 +143,6 @@ static void shark_uart_tick_raw(SUB_BMS_INFO *info)
 			info->tx_busy--;
 		} else {
 			info->send_state = SHARK_SEND_TIMEOUT;
-			info->err_times++;
 
 			if (info->connected > 0) {
 				if (info->connected > 1) {

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V10_11131816"
+#define CONFIG_VERSION "PS100XX_V11_11151644"