Kaynağa Gözat

add battery mask enum

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 yıl önce
ebeveyn
işleme
249fa5b00b

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V10_11081512
+PS100XX_V10_11081642

+ 25 - 28
Source/app.c

@@ -153,11 +153,9 @@ shark_bool battery_wait_voltage_parallel(void)
 	return shark_true;
 }
 
-shark_bool battery_wait_voltage_series(void)
+shark_bool battery_wait_voltage_series(u32 voltage_min)
 {
-	u64 time1 = shark_get_time() + 200;
-	u64 time2 = time1 + 800;
-	u32 voltage_min;
+	u64 time = shark_get_time() + 1000;
 
 	if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
 		return shark_false;
@@ -167,21 +165,14 @@ shark_bool battery_wait_voltage_series(void)
 		return shark_false;
 	}
 
-	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) {
-		u64 time = shark_get_time_safe();
 		u32 voltage = Measure_Vol();
 
-		if (voltage > voltage_min && time > time1) {
+		if (voltage > voltage_min) {
 			break;
 		}
 
-		if (time > time2) {
+		if (time < shark_get_time_safe()) {
 			println("series: %d < %d", voltage, voltage_min);
 			return shark_false;
 		}
@@ -192,38 +183,44 @@ shark_bool battery_wait_voltage_series(void)
 
 static u8 shark_battery_switch_series(void)
 {
+	u32 voltage;
+
 	// 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) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
 			return CB_BAT_NO;
 		}
 
 		delay_1ms(100);
 
-		if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL, 3) != 3) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
 			return CB_BAT_NO;
 		}
+
+		voltage = sub_bms_info_1.packet_common.m_total_vol;
 	} else {
-		if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, 3) != 3) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
 			return CB_BAT_NO;
 		}
 
 		delay_1ms(100);
 
-		if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_FULL, 3) != 3) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
 			return CB_BAT_NO;
 		}
+
+		voltage = sub_bms_info_2.packet_common.m_total_vol;
 	}
 
 	shark_bms_set_mos_series();
 
-	if (!battery_wait_voltage_series()) {
+	if (!battery_wait_voltage_series(voltage + 20000)) {
 		shark_bms_set_mos_close();
 		return CB_BAT_NO;
 	}
 
-	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
+	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) != SHARK_BATT_MASK_BOTH) {
 		shark_bms_set_mos_close();
 		return CB_BAT_NO;
 	}
@@ -244,7 +241,7 @@ static u8 shark_battery_switch_parrallel(void)
 	return CB_BAT1_BAT2_PARRALLEL;
 }
 
-static u8 shark_battery_switch_bat1(u8 mask)
+static u8 shark_battery_switch_bat1(shark_battery_mask_t mask)
 {
 	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF, mask) != mask) {
 		return CB_BAT_NO;
@@ -257,7 +254,7 @@ static u8 shark_battery_switch_bat1(u8 mask)
 	return CB_BAT1;
 }
 
-static u8 shark_battery_switch_bat2(u8 mask)
+static u8 shark_battery_switch_bat2(shark_battery_mask_t mask)
 {
 	if (shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL, mask) != mask) {
 		return CB_BAT_NO;
@@ -290,18 +287,18 @@ static u8 shark_battery_switch_single(void)
 	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);
+		return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
 	}
 
 	if (open1 < open2) {
-		return shark_battery_switch_bat2(3);
+		return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
 	}
 
 	if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
-		return shark_battery_switch_bat1(3);
+		return shark_battery_switch_bat1(SHARK_BATT_MASK_BOTH);
 	}
 
-	return shark_battery_switch_bat2(3);
+	return shark_battery_switch_bat2(SHARK_BATT_MASK_BOTH);
 }
 
 static shark_bool shark_battery_series_enabled(void)
@@ -363,7 +360,7 @@ static u8 shark_battery_switch_auto(u8 operate)
 	sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
 	sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 
-	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) == 0) {
+	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) == SHARK_BATT_MASK_NONE) {
 		return CB_BAT_NO;
 	}
 
@@ -392,10 +389,10 @@ static u8 shark_battery_switch_auto(u8 operate)
 				return shark_battery_switch_single();
 			}
 		} else {
-			return shark_battery_switch_bat1(1);
+			return shark_battery_switch_bat1(SHARK_BATT_MASK_BAT1);
 		}
 	} else if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
-		return shark_battery_switch_bat2(2);
+		return shark_battery_switch_bat2(SHARK_BATT_MASK_BAT2);
 	} else {
 		return CB_BAT_NO;
 	}

+ 5 - 0
Source/app_end_ctr.c

@@ -616,6 +616,11 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					buf[len++] = end_ctr_self_ss_new.acc12_sta << 1 | ACC2_Dect();
 					buf[len++] = end_ctr_self_ss_new.qd_sta << 1 | QD_Dect();
 					break;
+				case 8:
+					memcpy(buf + len, &shark_bms_acc2_oc_times, sizeof(shark_bms_acc2_oc_times));
+					len += sizeof(shark_bms_acc2_oc_times);
+					shark_bms_acc2_oc_times = 0;
+					break;
 				default:
 					buf[len++] = 0;
 					break;

+ 34 - 43
Source/app_rs485_1.c

@@ -661,28 +661,27 @@ shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t p
 	}
 }
 
-u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, u8 mask)
+static void shark_battery_serial_wait_ready(void)
 {
 	u64 time = shark_get_time() + 200;
-	u8 success = 0;
-	u8 times;
 
-	while (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_1) {
-		if (time < shark_get_time_safe()) {
-			break;
-		}
-	}
-
-	while (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_2) {
-		if (time < shark_get_time_safe()) {
-			break;
-		}
-	}
+	while (RS485_busy_1 && time > shark_get_time_safe());
+	while (RS485_busy_2 && time > shark_get_time_safe());
 
 	sub_bms_info_1.conn_state = SUB_BMS_DISC_HV485;
 	sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
+}
+
+shark_battery_mask_t shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, shark_battery_mask_t mask)
+{
+	shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
+	u8 times;
+
+	shark_battery_serial_wait_ready();
 
 	for (times = 0; times < 3; times++) {
+		u64 time = shark_get_time() + 200;
+
 		shark_battery_set_power_param(&sub_bms_info_1, power1);
 		g_event &= ~RS485_RECEIVE_END_EVENT;
 
@@ -692,15 +691,13 @@ u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t p
 		Send_Sub_BMS_CMD_1();
 		Send_Sub_BMS_CMD_2();
 
-		time = shark_get_time() + 200;
-
-		while (time > shark_get_time_safe()) {
+		while (shark_true) {
 			if(g_event & RS485_RECEIVE_END_EVENT) {
 				g_event &= ~RS485_RECEIVE_END_EVENT;
 				Handle_RS485_1_Data();
 
 				if (shark_battery_check_power(&sub_bms_info_1, power1)) {
-					success |= 1;
+					success |= SHARK_BATT_MASK_BAT1;
 				}
 			}
 
@@ -709,41 +706,33 @@ u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t p
 				Handle_RS485_2_Data();
 
 				if (shark_battery_check_power(&sub_bms_info_2, power2)) {
-					success |= 2;
+					success |= SHARK_BATT_MASK_BAT2;
 				}
 			}
 
 			if ((success & mask) == mask) {
 				return mask;
 			}
+
+			if (time < shark_get_time_safe()) {
+				break;
+			}
 		}
 	}
 
 	return success;
 }
 
-u8 shark_battery_detect(void)
+shark_battery_mask_t shark_battery_detect(void)
 {
-	u64 time = shark_get_time() + 200;
-	u8 success = 0;
+	shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
 	u8 times;
 
-	while (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_1) {
-		if (time < shark_get_time_safe()) {
-			break;
-		}
-	}
-
-	while (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_2) {
-		if (time < shark_get_time_safe()) {
-			break;
-		}
-	}
-
-	sub_bms_info_1.conn_state = SUB_BMS_DISC_HV485;
-	sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
+	shark_battery_serial_wait_ready();
 
 	for (times = 0; times < 3; times++) {
+		u64 time = shark_get_time() + 200;
+
 		sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
 		g_event &= ~RS485_RECEIVE_END_EVENT;
 
@@ -753,15 +742,13 @@ u8 shark_battery_detect(void)
 		Send_Sub_BMS_CMD_1();
 		Send_Sub_BMS_CMD_2();
 
-		time = shark_get_time() + 200;
-
-		while (time > shark_get_time_safe()) {
+		while (shark_true) {
 			if(g_event & RS485_RECEIVE_END_EVENT) {
 				g_event &= ~RS485_RECEIVE_END_EVENT;
 				Handle_RS485_1_Data();
 
 				if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
-					success |= 1;
+					success |= SHARK_BATT_MASK_BAT1;
 				}
 			}
 
@@ -770,12 +757,16 @@ u8 shark_battery_detect(void)
 				Handle_RS485_2_Data();
 
 				if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
-					success |= 2;
+					success |= SHARK_BATT_MASK_BAT2;
 				}
 			}
 
-			if (success == 3) {
-				return 3;
+			if (success == SHARK_BATT_MASK_BOTH) {
+				return SHARK_BATT_MASK_BOTH;
+			}
+
+			if (time < shark_get_time_safe()) {
+				break;
 			}
 		}
 	}

+ 9 - 2
Source/app_rs485_1.h

@@ -113,6 +113,13 @@ typedef enum {
 	SHARK_BATT_EXIT_485,
 } shark_battery_exit_t;
 
+typedef enum {
+	SHARK_BATT_MASK_NONE = 0,
+	SHARK_BATT_MASK_BAT1 = 1 << 0,
+	SHARK_BATT_MASK_BAT2 = 1 << 1,
+	SHARK_BATT_MASK_BOTH = SHARK_BATT_MASK_BAT1 | SHARK_BATT_MASK_BAT2
+} shark_battery_mask_t;
+
 #pragma  pack (push,1)  
 typedef struct
 {
@@ -386,10 +393,10 @@ void Check_Enable_Test_Info(void);
 shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info);
 void shark_bms_set_vgs(shark_bms_vgs_t vgs, shark_bool enable);
 void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21);
-u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, u8 mask);
+shark_battery_mask_t shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, shark_battery_mask_t mask);
 shark_battery_power_t shark_battery_get_power(SUB_BMS_INFO *info);
 shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t power);
-u8 shark_battery_detect(void);
+shark_battery_mask_t shark_battery_detect(void);
 shark_bool shark_battery_is_normal_power_on(SUB_BMS_INFO *info);
 
 static inline void shark_bms_set_mos_close(void)

+ 2 - 1
Source/delay.c

@@ -22,9 +22,10 @@ uint16_t s_ms ;
 
 uint64_t shark_get_time_safe(void)
 {
+	u64 time = shark_mseconds;
 	fwdgt_counter_reload();
 	Handle_Can_Data();
-	return shark_mseconds;
+	return time;
 }
 
 void systick_close(void)

+ 3 - 0
Source/drv_io.c

@@ -32,6 +32,8 @@ static shark_bool shark_bms_acc2_enabled;
 static u16 shark_bms_acc2_error_times;
 static u16 shark_bms_acc2_work_times;
 
+u16 shark_bms_acc2_oc_times;
+
 void QD_Enable_From(uint8_t on,uint8_t from)
 {
 	if (shark_battery_switch_busy && on) {
@@ -497,6 +499,7 @@ void EXTI10_15_IRQHandler(void)
 		exti_interrupt_flag_clear(EXTI_14);
 		gpio_bit_reset(GPIO_PORT_ACC2_EN, GPIO_PIN_ACC2_EN);
 		shark_bms_acc2_work_times = 0;
+		shark_bms_acc2_oc_times++;
 		over_12V = 1;
     }
 	if (RESET != exti_interrupt_flag_get(EXTI_15))

+ 2 - 0
Source/drv_io.h

@@ -89,6 +89,8 @@ extern DELAY_COMMON charge_delay;
 extern uint8_t battery_charged_full;
 extern uint8_t QD_switch_from;
 
+extern u16 shark_bms_acc2_oc_times;
+
 enum
 {
 	FROM_QD,

+ 1 - 1
Source/sw_build_info.h

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