Просмотр исходного кода

update xl logic

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 лет назад
Родитель
Сommit
991a9a8622
11 измененных файлов с 170 добавлено и 133 удалено
  1. 1 1
      Project/version.txt
  2. 21 7
      Source/app.c
  3. 7 28
      Source/app_end_ctr.c
  4. 82 67
      Source/app_rs485_1.c
  5. 2 1
      Source/app_rs485_1.h
  6. 1 4
      Source/delay.c
  7. 1 5
      Source/drv_can.c
  8. 41 10
      Source/drv_io.c
  9. 9 5
      Source/drv_io.h
  10. 4 4
      Source/hardware_test.c
  11. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V10_11082122
+PS100XX_V10_11091648

+ 21 - 7
Source/app.c

@@ -316,7 +316,7 @@ static u8 shark_battery_switch_single(void)
 static shark_bool shark_battery_series_enabled(void)
 {
 	if (QD_Dect()) {
-		if (end_ctr_self_ss_new.xl_sta) {
+		if (shark_bms_xl_times > SHARK_XL_FUZZ) {
 			return shark_false;
 		}
 
@@ -377,10 +377,6 @@ static u8 shark_battery_switch_auto(u8 operate)
 	sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 
 	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL, SHARK_BATT_MASK_BOTH) == SHARK_BATT_MASK_NONE) {
-		if (shark_battery_detect() == SHARK_BATT_MASK_NONE) {
-			Power_On_Normal(0, 2);
-		}
-
 		return CB_BAT_NO;
 	}
 
@@ -985,7 +981,25 @@ uint8_t Select_One_BAT(void)
 
 	return temp_op;
 #else
-	return CB_BAT1_BAT2_AUTO;
+	if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
+		return CB_BAT1_BAT2_AUTO;
+	}
+
+	if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
+		return CB_BAT1_BAT2_AUTO;
+	}
+
+	if (work_normal) {
+		if (Measure_Vol() > 20000) {
+			return CB_BAT1_BAT2_AUTO;
+		}
+
+		if (shark_battery_ping(5) != SHARK_BATT_MASK_NONE) {
+			return CB_BAT1_BAT2_AUTO;
+		}
+	}
+
+	return CB_BAT_NO;
 #endif
 }
 
@@ -1231,7 +1245,7 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
 	}
 	else
 	{
-		if (end_ctr_self_ss_new.xl_sta && QD_Dect()) {
+		if (shark_bms_xl_times > SHARK_XL_FUZZ && QD_Dect()) {
 			shark_battery_series_disabled = shark_true;
 		}
 

+ 7 - 28
Source/app_end_ctr.c

@@ -27,17 +27,6 @@ uint8_t Is_Soak(void)
 	return end_ctr_self_ss_new.soak_sta;
 }
 
-void Shield_XL_Timeout(void)
-{
-	if(shield_xl.set)
-	{
-		if(++shield_xl.count >= SHIELD_XL_TIME)
-		{
-			memset(&shield_xl,0x00,sizeof(shield_xl));
-		}
-	}
-}
-
 void Can_End_Ctr_Self_Send_Check(CAN_FRAME*can_ctr_frame)
 {
 	uint16_t len;
@@ -603,6 +592,13 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 
 					buf[len++] = 0;
 					break;
+				case 4:
+					memcpy(buf + len, &shark_bms_xl_times, sizeof(shark_bms_xl_times));
+					len += sizeof(shark_bms_xl_times);
+					memcpy(buf + len, &shark_bms_xl_max, sizeof(shark_bms_xl_max));
+					len += sizeof(shark_bms_xl_max);
+					shark_bms_xl_max = 0;
+					break;
 				case 5:
 					buf[len++] = sub_bms_info_1.packet_common.bms_status;
 					buf[len++] = sub_bms_info_2.packet_common.bms_status;
@@ -641,13 +637,7 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 			if(work_normal == 1)
 			{
 				buf[len++] = QD_Dect();
-
 				qd_dec_delay.count = QD_DEC_TIMEOUT;
-				
-				shield_xl.set = 1;
-				shield_xl.count = 0;
-				xl_dec_delay.count = 0;	
-				xl_count = 0;
 			}
 			else
 				buf[len++] = 0;
@@ -796,17 +786,6 @@ void Check_End_Ctr_Status(void)
 		end_ctr_self_ss_new.qd_sta = QD_Dect();
 	}
 
-	//xl_dec_delay
-	if(xl_dec_delay.set&&xl_dec_delay.count >= XL_DEC_TIMEOUT)
-	{
-		xl_dec_delay.count = 0;	
-		if(shield_xl.set == 0)
-		{
-			end_ctr_self_ss_new.xl_sta = (xl_count > 0 || XL_Dect() == RESET);
-		}
-		xl_count = 0;
-	}
-
 	if(acc2_dec_delay.set&&acc2_dec_delay.count >= ACC2_DEC_TIMEOUT)
 	{
 		memset(&acc2_dec_delay,0x00,sizeof(acc2_dec_delay));

+ 82 - 67
Source/app_rs485_1.c

@@ -498,7 +498,7 @@ static shark_battery_exit_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
 			return SHARK_BATT_EXIT_485;
 		}
 
-		if (end_ctr_self_ss_new.xl_sta == 0) {
+		if (shark_bms_xl_times < SHARK_XL_FUZZ) {
 			return SHARK_BATT_EXIT_485;
 		}
 
@@ -693,10 +693,6 @@ 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);
@@ -723,108 +719,127 @@ static void shark_battery_serial_wait_ready(void)
 	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)
+static void shark_battery_send_command(void)
 {
-	shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
-	u8 times;
-
-	shark_battery_serial_wait_ready();
+	g_event &= ~(RS485_RECEIVE_END_EVENT | RS485_2_RECEIVE_END_EVENT | SUB_BMS_1_RS485_DISC_EVENT | SUB_BMS_2_RS485_DISC_EVENT);
 
-	for (times = 0; times < 3; times++) {
-		u64 time = shark_get_time() + 200;
+	Send_Sub_BMS_CMD_1();
+	Send_Sub_BMS_CMD_2();
 
-		shark_battery_set_power_param(&sub_bms_info_1, power1);
-		g_event &= ~RS485_RECEIVE_END_EVENT;
+	sub_rs485_time_out_1.set = 0;
+	sub_rs485_time_out_2.set = 0;
+}
 
-		shark_battery_set_power_param(&sub_bms_info_2, power2);
-		g_event &= ~RS485_2_RECEIVE_END_EVENT;
+static shark_battery_mask_t shark_battery_wait_response(void)
+{
+	shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
+	u64 time = shark_get_time() + 100;
 
-		Send_Sub_BMS_CMD_1();
-		Send_Sub_BMS_CMD_2();
+	while (shark_true) {
+		if (g_event & RS485_RECEIVE_END_EVENT) {
+			g_event &= ~RS485_RECEIVE_END_EVENT;
 
-		while (shark_true) {
-			if(g_event & RS485_RECEIVE_END_EVENT) {
-				g_event &= ~RS485_RECEIVE_END_EVENT;
-				Handle_RS485_1_Data();
+			Handle_RS485_1_Data();
 
-				if (shark_battery_check_power(&sub_bms_info_1, power1)) {
-					success |= SHARK_BATT_MASK_BAT1;
-				}
+			if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
+				success |= SHARK_BATT_MASK_BAT1;
 			}
+		}
 
-			if (g_event & RS485_2_RECEIVE_END_EVENT) {
-				g_event &= ~RS485_2_RECEIVE_END_EVENT;
-				Handle_RS485_2_Data();
+		if (g_event & RS485_2_RECEIVE_END_EVENT) {
+			g_event &= ~RS485_2_RECEIVE_END_EVENT;
 
-				if (shark_battery_check_power(&sub_bms_info_2, power2)) {
-					success |= SHARK_BATT_MASK_BAT2;
-				}
-			}
+			Handle_RS485_2_Data();
 
-			if ((success & mask) == mask) {
-				return mask;
+			if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
+				success |= SHARK_BATT_MASK_BAT2;
 			}
+		}
 
-			if (time < shark_get_time_safe()) {
-				break;
-			}
+		if (success == SHARK_BATT_MASK_BOTH) {
+			break;
+		}
+
+		if (time < shark_get_time_safe()) {
+			break;
 		}
 	}
 
+	RS485_busy_1 = 0;
+	RS485_busy_2 = 0;
+
 	return success;
 }
 
-shark_battery_mask_t shark_battery_detect(void)
+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 < 5; times++) {
-		u64 time = shark_get_time() + 200;
+	for (times = 0; times < 3; times++) {
+		shark_battery_mask_t response;
 
-		sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
-		g_event &= ~RS485_RECEIVE_END_EVENT;
+		shark_battery_set_power_param(&sub_bms_info_1, power1);
+		shark_battery_set_power_param(&sub_bms_info_2, power2);
+		shark_battery_send_command();
 
-		sub_bms_info_2.sub_bms_cmd.operate = OP_READ_INFO;
-		g_event &= ~RS485_2_RECEIVE_END_EVENT;
+		response = shark_battery_wait_response();
 
-		Send_Sub_BMS_CMD_1();
-		Send_Sub_BMS_CMD_2();
+		if ((response & SHARK_BATT_MASK_BAT1) != 0 && shark_battery_check_power(&sub_bms_info_1, power1)) {
+			success |= SHARK_BATT_MASK_BAT1;
+		}
 
-		while (shark_true) {
-			if(g_event & RS485_RECEIVE_END_EVENT) {
-				g_event &= ~RS485_RECEIVE_END_EVENT;
-				Handle_RS485_1_Data();
+		if ((response & SHARK_BATT_MASK_BAT2) != 0 && shark_battery_check_power(&sub_bms_info_2, power2)) {
+			success |= SHARK_BATT_MASK_BAT2;
+		}
 
-				if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
-					success |= SHARK_BATT_MASK_BAT1;
-				}
-			}
+		if ((success & mask) == mask) {
+			return mask;
+		}
+	}
 
-			if (g_event & RS485_2_RECEIVE_END_EVENT) {
-				g_event &= ~RS485_2_RECEIVE_END_EVENT;
-				Handle_RS485_2_Data();
+	return success;
+}
 
-				if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
-					success |= SHARK_BATT_MASK_BAT2;
-				}
-			}
+shark_battery_mask_t shark_battery_detect(u8 times)
+{
+	shark_battery_mask_t success;
 
-			if (success == SHARK_BATT_MASK_BOTH) {
-				return SHARK_BATT_MASK_BOTH;
-			}
+	shark_battery_serial_wait_ready();
 
-			if (time < shark_get_time_safe()) {
-				break;
-			}
+	for (success = SHARK_BATT_MASK_NONE; times > 0; times--) {
+		sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
+		sub_bms_info_2.sub_bms_cmd.operate = OP_READ_INFO;
+		shark_battery_send_command();
+
+		success |= shark_battery_wait_response();
+		if (success == SHARK_BATT_MASK_BOTH) {
+			break;
 		}
 	}
 
 	return success;
 }
 
+shark_bool shark_battery_ping(u8 times)
+{
+	while (shark_true) {
+		if (shark_battery_detect(1) != SHARK_BATT_MASK_NONE) {
+			return shark_true;
+		}
+
+		if (times > 0) {
+			times--;
+		} else {
+			break;
+		}
+	}
+
+	return shark_false;
+}
+
 int8_t Update_Sub_BMS_1_Software(uint8_t step)
 {
 	uint8_t rtn;

+ 2 - 1
Source/app_rs485_1.h

@@ -396,7 +396,8 @@ void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21);
 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);
-shark_battery_mask_t shark_battery_detect(void);
+shark_battery_mask_t shark_battery_detect(u8 times);
+shark_bool shark_battery_ping(u8 times);
 shark_bool shark_battery_is_normal_power_on(SUB_BMS_INFO *info);
 u32 shark_battery_get_voltage(SUB_BMS_INFO *info);
 u32 shark_battery_get_voltage_delta(void);

+ 1 - 4
Source/delay.c

@@ -108,6 +108,7 @@ void SysTick_Handler(void)
 
 	}
 
+	shark_bms_xl_tick();
 	ACC2_PWM();
 	
 	Uart1_Time_Out();
@@ -206,8 +207,6 @@ if(send_delay.set)
 		repair_dec_delay.count++;
 	if(qd_dec_delay.set)
 		qd_dec_delay.count++;
-	if(xl_dec_delay.set)
-		xl_dec_delay.count++;
 	if(acc2_dec_delay.set)
 		acc2_dec_delay.count++;
 	
@@ -250,8 +249,6 @@ if(send_delay.set)
 
 	ADAS_Timeout();
 
-	Shield_XL_Timeout();
-
 	Check_Charger_Timeout();
 
 	Series_Delay_Timeout();

+ 1 - 5
Source/drv_can.c

@@ -452,14 +452,10 @@ static can_trasnmit_message_struct shark_can_log_message;
 
 static void shark_can_log_flush(uint8_t dest)
 {
-	u64 time = shark_get_time() + 200;
-
 	shark_can_log_message.tx_efid = 3 << 24 | 1 << 19 | 1 << 14 | SELF_ID << 7 | dest;
 	shark_can_log_message.tx_ff = CAN_FF_EXTENDED;
 	shark_can_log_message.tx_ft = CAN_FT_DATA;
-
-	while (can_message_transmit(CAN0, &shark_can_log_message) == CAN_NOMAILBOX && time > shark_get_time());
-
+	can_message_transmit(CAN0, &shark_can_log_message);
 	shark_can_log_message.tx_dlen = 0;
 }
 

+ 41 - 10
Source/drv_io.c

@@ -3,13 +3,13 @@
 #include "hardware_test.h"
 #include "app_rs485_1.h"
 #include "app.h"
+#include "app_end_ctr.h"
 
 CHECK_CHARGER check_charger;
 DELAY_COMMON side_stay_dec_delay;
 DELAY_COMMON sti_dec_delay;
 DELAY_COMMON repair_dec_delay;
 DELAY_COMMON qd_dec_delay;
-DELAY_COMMON xl_dec_delay;
 DELAY_COMMON acc2_dec_delay;
 
 DELAY_COMMON left_light_delay;
@@ -21,8 +21,6 @@ DELAY_COMMON charge_delay;
 
 CTR_DELAY_COMMON soak_dec_delay;
 
-uint32_t xl_count = 0;
-
 #define ACC2_USE_PWM (1)
 
 uint8_t battery_charged_full = 0;
@@ -32,7 +30,11 @@ 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;
+u32 shark_bms_acc2_oc_times;
+u16 shark_bms_xl_times;
+u16 shark_bms_xl_max;
+u16 shark_bms_xl_count;
+u8 shark_bms_xl_skip;
 
 void QD_Enable_From(uint8_t on,uint8_t from)
 {
@@ -43,6 +45,10 @@ void QD_Enable_From(uint8_t on,uint8_t from)
 
 	println("qd: %d %d", on, from);
 
+	if (QD_Dect() == 0) {
+		shark_bms_xl_skip = 5;
+	}
+
 	// Check_S11(on,FROM_QD);
 	QD_Enable(on);
 	QD_switch_from = from;
@@ -53,6 +59,36 @@ uint8_t ACC2_Is_On(void)
 	return shark_bms_acc2_enabled;
 }
 
+void shark_bms_xl_tick(void)
+{
+	static u8 ticks;
+
+	if (ticks < XL_DEC_TIMEOUT) {
+		ticks++;
+
+		if (XL_Dect() == RESET) {
+			shark_bms_xl_count++;
+		}
+	} else {
+		ticks = 0;
+
+		if (shark_bms_xl_skip > 0) {
+			shark_bms_xl_skip--;
+			end_ctr_self_ss_new.xl_sta = 0;
+			shark_bms_xl_times = shark_bms_xl_max = 0;
+		} else {
+			if (shark_bms_xl_max < shark_bms_xl_times) {
+				shark_bms_xl_max = shark_bms_xl_times;
+			}
+
+			shark_bms_xl_times = shark_bms_xl_count;
+			end_ctr_self_ss_new.xl_sta = (shark_bms_xl_count > 0);
+		}
+
+		shark_bms_xl_count = 0;
+	}
+}
+
 void ACC2_PWM(void)
 {
 #if 0
@@ -217,8 +253,6 @@ void E_CTR_Initial(void)
 	repair_dec_delay.count = REPAIR_DEC_TIMEOUT;
 	qd_dec_delay.set = 1;
 	qd_dec_delay.count = QD_DEC_TIMEOUT;
-	xl_dec_delay.set = 1;
-	xl_dec_delay.count = XL_DEC_TIMEOUT;
 	acc2_dec_delay.set = 1;
 	acc2_dec_delay.count = ACC2_DEC_TIMEOUT;
 	
@@ -442,10 +476,7 @@ void EXTI5_9_IRQHandler(void)
 	if (RESET != exti_interrupt_flag_get(EXTI_7))
 	{  
         exti_interrupt_flag_clear(EXTI_7);
-		if(shield_xl.set == 0)
-			++xl_count;
-		else
-			xl_count = 0;
+		shark_bms_xl_count++;
     }
 	
 	if (RESET != exti_interrupt_flag_get(EXTI_8))

+ 9 - 5
Source/drv_io.h

@@ -20,6 +20,8 @@
 #define GPIO_PORT_ACC2_EN			GPIOC
 #define GPIO_PIN_ACC2_EN			GPIO_PIN_15
 
+#define SHARK_XL_FUZZ				20
+
 #define Can_Power_Enable(on) gpio_bit_write(GPIOA,GPIO_PIN_12,(bit_status)(!on))
 #define FL_Enable(on) gpio_bit_write(GPIOB,GPIO_PIN_2,(bit_status)(!on))
 
@@ -76,20 +78,20 @@ extern CTR_DELAY_COMMON soak_dec_delay;
 extern DELAY_COMMON sti_dec_delay;
 extern DELAY_COMMON repair_dec_delay;
 extern DELAY_COMMON qd_dec_delay;
-extern DELAY_COMMON xl_dec_delay;
 extern DELAY_COMMON acc2_dec_delay;
 extern DELAY_COMMON acc2_delay;
 extern DELAY_COMMON left_light_delay;
 extern DELAY_COMMON right_light_delay;
 
-extern DELAY_COMMON shield_xl;
-
-extern uint32_t xl_count;
 extern DELAY_COMMON charge_delay;
 extern uint8_t battery_charged_full;
 extern uint8_t QD_switch_from;
 
-extern u16 shark_bms_acc2_oc_times;
+extern u32 shark_bms_acc2_oc_times;
+extern u16 shark_bms_xl_times;
+extern u16 shark_bms_xl_max;
+extern u16 shark_bms_xl_count;
+extern u8 shark_bms_xl_skip;
 
 enum
 {
@@ -124,5 +126,7 @@ uint8_t ACC2_Is_On(void);
 
 void Check_S11_May_Operate(void);
 
+void shark_bms_xl_tick(void);
+
 #endif
 

+ 4 - 4
Source/hardware_test.c

@@ -474,18 +474,18 @@ int8_t HT_Rsp_CMD(uint8_t *buf)
 			len = sizeof(HT_FRAME);
 			if(buf[len] == 1)
 			{
-				xl_count = 0;
+				shark_bms_xl_count = 0;
 				delay_1ms(100);
-				if(xl_count)
+				if(shark_bms_xl_count)
 					buf[len++] = 1;
 				else
 					buf[len++] = 0;
 			}
 			else if(buf[len] == 2)
 			{
-				xl_count = 0;
+				shark_bms_xl_count = 0;
 				delay_1ms(100);
-				if(xl_count)
+				if(shark_bms_xl_count)
 					buf[len++] = 1;
 				else
 					buf[len++] = 0;

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V10_11082122"
+#define CONFIG_VERSION "PS100XX_V10_11091648"