瀏覽代碼

wait voltage ready when switch battery

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 年之前
父節點
當前提交
5ef128e60a
共有 10 個文件被更改,包括 129 次插入44 次删除
  1. 1 1
      Project/version.cfg
  2. 1 1
      Project/version.txt
  3. 88 32
      Source/app.c
  4. 1 1
      Source/app.h
  5. 5 1
      Source/app_end_ctr.c
  6. 12 1
      Source/app_rs485_1.c
  7. 9 6
      Source/common.h
  8. 10 0
      Source/drv_io.c
  9. 1 0
      Source/low_power.c
  10. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.cfg

@@ -1,2 +1,2 @@
 project: PS100XX
-version: 01
+version: 10

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V01_11071816
+PS100XX_V10_11072107

+ 88 - 32
Source/app.c

@@ -42,7 +42,8 @@ const double nhb_default = 600;
 SHENG_YU_LI_CHENG sheng_yu_li_cheng;
 DELAY_COMMON save_param_delay;
 
-uint8_t shark_printf_enable;
+shark_bool shark_battery_switch_busy;
+shark_bool shark_printf_enabled;
 
 void Misc_Initial(void)
 {
@@ -121,12 +122,78 @@ shark_bool battery_wait_voltage_down(u32 voltage)
 	return shark_false;
 }
 
-shark_bool battery_wait_voltage_up(u32 voltage)
+shark_bool battery_wait_voltage_parallel(void)
 {
-	u64 time = shark_get_time() + 500;
+	u64 time1 = shark_get_time() + 1000;
+	u64 time2 = shark_get_time() + 5000;
+	u32 voltage_min, voltage_max;
+
+	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;
+				voltage_max = sub_bms_info_1.packet_common.m_total_vol;
+			}
+		} else {
+			voltage_min = 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;
+	} else {
+		return shark_false;
+	}
+
+	voltage_min -= 5000;
+	voltage_max += 5000;
+
+	while (shark_true) {
+		u32 voltage = Measure_Vol();
+		u32 time = shark_get_time_safe();
+
+		if (voltage < voltage_min) {
+			if (time > time1) {
+				println("parallel: %d < %d", voltage, voltage_min);
+				return shark_false;
+			}
+		} else if (voltage > voltage_max) {
+			if (time > time2) {
+				println("parallel: %d > %d", voltage, voltage_max);
+				return shark_false;
+			}
+		} else {
+			break;
+		}
+	}
+
+	return shark_true;
+}
+
+shark_bool battery_wait_voltage_series(void)
+{
+	u64 time = shark_get_time() + 1000;
+	u32 voltage, voltage_min;
+
+	if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
+		return shark_false;
+	}
+
+	if (sub_bms_info_2.conn_state != SUB_BMS_CONT_HV485) {
+		return shark_false;
+	}
 
-	while (Measure_Vol() < voltage) {
-		if (time < shark_get_time_safe()) {
+	voltage_min = sub_bms_info_1.packet_common.m_total_vol + sub_bms_info_2.packet_common.m_total_vol - 5000;
+
+	while (shark_true) {
+		voltage = Measure_Vol();
+		if (voltage > voltage_min) {
+			break;
+		}
+
+		if (shark_get_time_safe() > time) {
+			println("series: %d < %d", voltage, voltage_min);
 			return shark_false;
 		}
 	}
@@ -134,6 +201,7 @@ shark_bool battery_wait_voltage_up(u32 voltage)
 	return shark_true;
 }
 
+
 static u8 shark_battery_switch_series(void)
 {
 	Power_On_Normal(0, 2);
@@ -161,7 +229,12 @@ static u8 shark_battery_switch_series(void)
 	}
 
 	shark_bms_set_mos_series();
-	battery_wait_voltage_up(SERIES_VOLTAGE_MIN);
+
+	if (!battery_wait_voltage_series()) {
+		shark_bms_set_mos_close();
+		return CB_BAT_NO;
+	}
+
 	delay_1ms(200);
 
 	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) != 3) {
@@ -234,32 +307,15 @@ static u8 shark_battery_switch_bat1_or_bat2(void)
 
 static u8 shark_battery_switch_auto(shark_bool series)
 {
-	u8 mask;
-
 	shark_bms_set_mos_close();
 	sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
 	sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 
-	if (!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
-		return CB_BAT_NO;
-	}
-
-	mask = shark_battery_detect();
-	if (mask == 0) {
+	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, 3) == 0) {
 		return CB_BAT_NO;
 	}
 
-	if (cb_operate_state == CB_BAT_NO) {
-		mask = shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_SMALL, mask);
-		if (mask == 0) {
-			return CB_BAT_NO;
-		}
-
-		delay_1ms(200);
-	}
-
-	mask = shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, mask);
-	if (mask == 0) {
+	if (!battery_wait_voltage_parallel()) {
 		return CB_BAT_NO;
 	}
 
@@ -284,6 +340,8 @@ 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;
 	}
@@ -296,7 +354,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 	{
 		case CB_BAT1_BAT2_AUTO:
 			cb_operate = shark_battery_switch_auto(shark_false);
-			println("switch auto: %d", cb_operate);
+			println("single auto: %d", cb_operate);
 			break;
 
 		case CB_BAT1:
@@ -583,7 +641,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 		case CB_BAT1_BAT2_SERIES:
 #if 1
 			cb_operate = shark_battery_switch_auto(shark_true);
-			println("switch auto: %d", cb_operate);
+			println("series auto: %d", cb_operate);
 #else
 			Power_On_Normal(0,2);
 			shark_bms_set_mos_close();
@@ -772,13 +830,15 @@ 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;
 
 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
@@ -1093,10 +1153,6 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
 		return temp_op;
 	}	
 
-	if (Measure_Vol() < SELECT_ONE_BATTERY_VOL) {
-		return Select_One_BAT();
-	}
-
 	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))

+ 1 - 1
Source/app.h

@@ -84,7 +84,6 @@ extern uint8_t Check_CB_oper_sta_start;
 extern DELAY_COMMON Check_CB_oper_sta_delay;
 extern uint8_t is_intelligent;
 extern uint8_t CB_OPERATE_PRECEDENCE_Config;
-extern uint8_t shark_switch_disabled;
 
 __inline void Check_CB_Oper_Sta_Delay(void)
 {
@@ -111,6 +110,7 @@ __inline void Check_CB_Oper_Sta_Delay(void)
 #define SERIES_UNDER_VOL_TIME_OUT  (4000)
 #define NEXT_SERIES_TIME_OUT  (5000)
 #define SELECT_ONE_BATTERY_VOL  (60000)
+#define SINGLE_VOLTAGE_MIN  (30000)
 #define SERIES_VOLTAGE_MIN  (80000)
 #define SERIES_UNDER_XX_PERCENT  (20)
 

+ 5 - 1
Source/app_end_ctr.c

@@ -595,7 +595,11 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					buf[len++] = 0;
 					break;
 				case 3:
-					shark_printf_enable = buf[len];
+					shark_printf_enabled = buf[len];
+					if (shark_printf_enabled) {
+						println("log enabled");
+					}
+
 					buf[len++] = 0;
 					break;
 				case 5:

+ 12 - 1
Source/app_rs485_1.c

@@ -5,6 +5,7 @@
 #include "hardware_test.h"
 #include "app_end_ctr.h"
 #include "drv_io.h"
+#include "measure_vol.h"
 
 //uart1
 static uint8_t app_rs485_buf[TX_BUFFER_SIZE];
@@ -488,13 +489,19 @@ static shark_battery_exit_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
 		work_status &= ~(ST_OVRCHRG_VOL | ST_OVR_TEMPE_CHRG | ST_UDR_TEMPE_CHRG);
 	}
 
-	if(work_status) {
+	if (work_status) {
 		return SHARK_BATT_EXIT_ERROR;
 	}
 
 	if (info->conn_state != SUB_BMS_CONT_HV485) {
 		if (end_ctr_self_ss_new.xl_sta == 0 || info->state == SHARK_BATT_STATE_IDLE) {
 			return SHARK_BATT_EXIT_485;
+		} else if (cb_operate_state == CB_BAT1_BAT2_SERIES) {
+			if (Measure_Vol() < SERIES_VOLTAGE_MIN) {
+				return SHARK_BATT_EXIT_485;
+			}
+		} else if (Measure_Vol() < SINGLE_VOLTAGE_MIN) {
+			return SHARK_BATT_EXIT_485;
 		}
 	}
 
@@ -635,6 +642,10 @@ 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)
 {
+	if (info->conn_state != SUB_BMS_CONT_HV485) {
+		return shark_false;
+	}
+
 	switch (power) {
 	case SHARK_BATT_POWER_SMALL:
 		return SHARK_BOOL((info->packet_common.bms_status & BMS_POWER_SMALL) == BMS_POWER_SMALL);

+ 9 - 6
Source/common.h

@@ -11,7 +11,7 @@
 #include "gd32f10x_libopt.h"
 #include "delay.h"
 
-#define DEBUG_MODE    (1)
+#define DEBUG_MODE    (0)
  
 #define CONFIG_CAN_IAP
 #define USART_BAUND    (38400)
@@ -30,7 +30,7 @@
 
 #define println(fmt, args ...) \
 	do { \
-		if (shark_printf_enable) { \
+		if (shark_printf_enabled) { \
 			printf(fmt "\n", ##args); \
 		} \
 	} while (0)
@@ -38,10 +38,6 @@
 #define SHARK_BOOL(value) \
 	((shark_bool) (value))
 
-extern const uint8_t soft_version[];
-extern uint8_t sn[PS100_SERIAL_NUM_SIZE];
-extern uint8_t shark_printf_enable;
-
 typedef uint8_t u8;
 typedef uint16_t u16;
 typedef uint32_t u32;
@@ -49,6 +45,13 @@ typedef uint64_t u64;
 
 typedef enum { shark_false, shark_true } shark_bool;
 
+extern const uint8_t soft_version[];
+extern uint8_t sn[PS100_SERIAL_NUM_SIZE];
+
+extern shark_bool shark_battery_switch_busy;
+extern shark_bool shark_printf_enabled;
+
+
 typedef struct
 {
 	uint8_t set;

+ 10 - 0
Source/drv_io.c

@@ -34,6 +34,11 @@ static u16 shark_bms_acc2_work_times;
 
 void QD_Enable_From(uint8_t on,uint8_t from)
 {
+	if (shark_battery_switch_busy && on) {
+		println("qd busy");
+		return;
+	}
+
 	println("qd: %d %d", on, from);
 
 	// Check_S11(on,FROM_QD);
@@ -94,6 +99,11 @@ void ACC2_PWM(void)
 
 void ACC2_Enable(uint8_t on)
 {
+	if (shark_battery_switch_busy && on) {
+		println("acc2 busy");
+		return;
+	}
+
 	println("acc2: %d", on);
 
 	shark_bms_acc2_enabled = SHARK_BOOL(on);

+ 1 - 0
Source/low_power.c

@@ -11,6 +11,7 @@
 #include "app_can.h"
 #include "low_power.h"
 #include "measure_temprature.h"
+#include "drv_watch_dog.h"
 
 DELAY_COMMON enter_sleep_delay;
 

+ 1 - 1
Source/sw_build_info.h

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