Browse Source

欠压修改为2.2v,powerdown等待5s

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 years ago
parent
commit
6f378b1883

+ 4 - 5
Application/app/bms_message.c

@@ -82,7 +82,7 @@ void process_bms_message(can_frame_t *frame, int len){
 					bresp.max_temp = measure_value()->pack_temp[i];
 					bresp.max_temp = measure_value()->pack_temp[i];
 				}
 				}
 			}
 			}
-			bresp.health = *((uint32_t *)bms_health());
+			bresp.health = bms_health()->i_status;
 			if (bms_is_ps_charger_in()) {/*如果在底座或者车上(有充电器),提前置位过高/低温充电标志*/
 			if (bms_is_ps_charger_in()) {/*如果在底座或者车上(有充电器),提前置位过高/低温充电标志*/
 				bresp.health |= (bms_health()->lower_temp_deny_charger << 12 | bms_health()->over_temp_deny_charger << 14);
 				bresp.health |= (bms_health()->lower_temp_deny_charger << 12 | bms_health()->over_temp_deny_charger << 14);
 			}
 			}
@@ -131,8 +131,7 @@ void process_bms_message(can_frame_t *frame, int len){
 			sresp.charger_fet = ml5238_is_charging();
 			sresp.charger_fet = ml5238_is_charging();
 			sresp.small_power = AUX_VOL_IS_OPEN();
 			sresp.small_power = AUX_VOL_IS_OPEN();
 			sresp.is_balancing = bms_state_get()->pack_balancing;
 			sresp.is_balancing = bms_state_get()->pack_balancing;
-			uint32_t *h = (uint32_t *)(bms_health());
-			sresp.health = (*h != 0);
+			sresp.health = (((uint16_t )(bms_health()->i_status)) != 0);
 			data = (uint8_t *)&sresp;
 			data = (uint8_t *)&sresp;
 			data_len = sizeof(sresp);
 			data_len = sizeof(sresp);
 			protocol_send_bms_info(frame->head.can_addr, frame->key, data, data_len);
 			protocol_send_bms_info(frame->head.can_addr, frame->key, data, data_len);
@@ -173,8 +172,8 @@ void process_bms_message(can_frame_t *frame, int len){
 			break;
 			break;
 		}
 		}
 		case CAN_KEY_BMS_GET_HEALTH_STAT:
 		case CAN_KEY_BMS_GET_HEALTH_STAT:
-			data = (uint8_t *)bms_health();
-			data_len = sizeof(*bms_health());
+			data = (uint8_t *)(&bms_health()->i_status);
+			data_len = sizeof(bms_health()->i_status);
 			protocol_send_bms_info(frame->head.can_addr, frame->key, data, data_len);
 			protocol_send_bms_info(frame->head.can_addr, frame->key, data, data_len);
 			break;
 			break;
 		case CAN_KEY_BMS_SET_WORK_MODE:
 		case CAN_KEY_BMS_SET_WORK_MODE:

+ 1 - 1
Application/app/pcba_test.c

@@ -111,7 +111,7 @@ int pcba_test(uint8_t *data, int len, uint8_t *response){
 	}else if (cmd == 0x11) {
 	}else if (cmd == 0x11) {
 		response[resp_len ++] = ml5238_is_discharging() | ml5238_is_charging()<<1;
 		response[resp_len ++] = ml5238_is_discharging() | ml5238_is_charging()<<1;
 	}else if (cmd == 0x22) {
 	}else if (cmd == 0x22) {
-		uint16_t health = *(uint16_t *)bms_health();
+		uint16_t health = (uint16_t)bms_health()->i_status;
 		response[resp_len ++] = AUX_VOL_IS_OPEN();
 		response[resp_len ++] = AUX_VOL_IS_OPEN();
 		response[resp_len ++] = health;
 		response[resp_len ++] = health;
 		response[resp_len ++] = health >> 8;
 		response[resp_len ++] = health >> 8;

+ 1 - 1
Application/app/protocol_old.c

@@ -66,7 +66,7 @@ static int get_response_data(uint8_t *data, uint8_t operate, uint8_t result){
 		}
 		}
 	}
 	}
 	
 	
-	response->health_state = *((uint16_t *)bms_health()) | (bms_health()->sigle_cell_lower_voltage << 1);
+	response->health_state = ((uint16_t)bms_health()->i_status) | (bms_health()->sigle_cell_lower_voltage << 1);
 	if (bms_is_ps_charger_in()) {
 	if (bms_is_ps_charger_in()) {
 		response->health_state |= (bms_health()->lower_temp_deny_charger << 12 | bms_health()->over_temp_deny_charger << 14);
 		response->health_state |= (bms_health()->lower_temp_deny_charger << 12 | bms_health()->over_temp_deny_charger << 14);
 	}
 	}

+ 13 - 7
Application/app/sox/health.c

@@ -31,18 +31,18 @@ static int8_t work_lower_temp_recovry[PACK_TEMPS_NUM - 1] = {5,5,5}; //pcb
 /*能提供动力的最小电压*/
 /*能提供动力的最小电压*/
 static float min_discharger_power_vol[] = {32000, 38000}; //允许能提供动力的最小电压
 static float min_discharger_power_vol[] = {32000, 38000}; //允许能提供动力的最小电压
 static float min_discharger_power_recovery_vol[] = {34000, 40000}; //恢复能提供动力的最小电压
 static float min_discharger_power_recovery_vol[] = {34000, 40000}; //恢复能提供动力的最小电压
-static float min_discharger_power_cell_vol[] = {2100, 2600}; //允许能提供动力的最小电芯电压
-static float min_discharger_power_recovery_cell_vol[] = {2200, 2700}; //恢复能提供动力的最小电芯电压
+static float min_discharger_power_cell_vol[] = {2100, 2400}; //允许能提供动力的最小电芯电压
+static float min_discharger_power_recovery_cell_vol[] = {2200, 2500}; //恢复能提供动力的最小电芯电压
 
 
 /*能提供大电的最小电压*/
 /*能提供大电的最小电压*/
 static float min_discharger_vol[] = {30000, 36000};//允许能放电的最小电压
 static float min_discharger_vol[] = {30000, 36000};//允许能放电的最小电压
-static float min_discharger_recovery_vol[] = {32000, 40000};//恢复放电的最小电压
-static float min_discharger_cell_vol[] = {1900, 2400};//允许能放电的最小电芯电压
-static float min_discharger_cell_recovery_vol[] = {2000, 2500};//恢复放电的最小电芯电压
+static float min_discharger_recovery_vol[] = {32000, 38000};//恢复放电的最小电压
+static float min_discharger_cell_vol[] = {1900, 2200};//允许能放电的最小电芯电压
+static float min_discharger_cell_recovery_vol[] = {2000, 2300};//恢复放电的最小电芯电压
 
 
 /*电池PowerDown的最小电压 */
 /*电池PowerDown的最小电压 */
-static float min_discharger_pdown_vol[] = {28000, 34000}; //power down的最小电压
-static float min_discharger_pdown_cell_vol[] = {1800, 2100};                        //power down的最小电芯电压
+static float min_discharger_pdown_vol[] = {28000, 32000}; //power down的最小电压
+static float min_discharger_pdown_cell_vol[] = {1800, 2000}; //power down的最小电芯电压
 
 
 #define MAX_TRY_FOR_AUX_SHORT 10
 #define MAX_TRY_FOR_AUX_SHORT 10
 
 
@@ -308,7 +308,13 @@ void check_voltage_state(void) {
 			 * system will power on with powerdown_lower_voltage cleared
 			 * system will power on with powerdown_lower_voltage cleared
 			*/			
 			*/			
 			_health.powerdown_lower_voltage = 1;
 			_health.powerdown_lower_voltage = 1;
+			_health.sigle_cell_lower_voltage = 1;
+			_health.pd_time = shark_get_seconds();
 		}
 		}
+	}else {
+		_health.powerdown_lower_voltage = 0;
+		_power_down_voltage.count = _power_down_voltage.init_count;
+		_health.pd_time = shark_get_seconds();
 	}
 	}
 	debug_health();
 	debug_health();
 }
 }

+ 33 - 28
Application/app/sox/health.h

@@ -14,41 +14,46 @@
  * xxx_under_temp: 表示过低温(温度过低)
  * xxx_under_temp: 表示过低温(温度过低)
 */
 */
 typedef struct {
 typedef struct {
-	uint32_t charger_over_voltage:1;
-	uint32_t discharger_lower_voltage:1; //关闭大电流输出
-	uint32_t small_current_short:1;
-	uint32_t load_current_short:1; //大电短路保护
+	union {
+		uint32_t i_status;
+		struct {
+			uint32_t charger_over_voltage:1;
+			uint32_t discharger_lower_voltage:1; //关闭大电流输出
+			uint32_t small_current_short:1;
+			uint32_t load_current_short:1; //大电短路保护
 
 
-	uint32_t charger_current:1; //不需要
-	uint32_t discharger_current:1;
-	uint32_t charger_over_current:1;
-	uint32_t discharger_over_current:1;
+			uint32_t charger_current:1; //不需要
+			uint32_t discharger_current:1;
+			uint32_t charger_over_current:1;
+			uint32_t discharger_over_current:1;
 
 
-	uint32_t res1 :1;//ST_TOTAL_CHRG
-	uint32_t charger_cells_vol_diff_over:1; //充电cell的电压差异超过阈值
-	uint32_t power_save:1;
-	uint32_t powerdown_lower_voltage:1;
+			uint32_t res1 :1;//ST_TOTAL_CHRG
+			uint32_t charger_cells_vol_diff_over:1; //充电cell的电压差异超过阈值
+			uint32_t power_save:1;
+			uint32_t powerdown_lower_voltage:1;
 
 
-	uint32_t charger_lower_temp:1;
-	uint32_t discharger_lower_temp:1;
-	uint32_t charger_over_temp:1;
-	uint32_t discharger_over_temp:1;
+			uint32_t charger_lower_temp:1;
+			uint32_t discharger_lower_temp:1;
+			uint32_t charger_over_temp:1;
+			uint32_t discharger_over_temp:1;
 
 
-	uint32_t sigle_cell_lower_voltage:1; //关闭大电流输出
-	uint32_t sigle_cell_over_voltage:1;
-	uint32_t discharger_shutpower_voltage:1; //关闭动力
-	uint32_t discharger_cell_shutpower_voltage:1; //关闭动力
+			uint32_t sigle_cell_lower_voltage:1; //关闭大电流输出
+			uint32_t sigle_cell_over_voltage:1;
+			uint32_t discharger_shutpower_voltage:1; //关闭动力
+			uint32_t discharger_cell_shutpower_voltage:1; //关闭动力
 
 
-	uint32_t hall_is_detected:1;
-	uint32_t lower_temp_deny_charger:1;
-	uint32_t lower_temp_deny_discharger:1;
-	uint32_t over_temp_deny_charger:1;
-	uint32_t over_temp_deny_discharger:1;
-
-	uint32_t is_work_temp_normal:1;
-	uint32_t small_current_real_short:1; //真实短路
+			uint32_t hall_is_detected:1;
+			uint32_t lower_temp_deny_charger:1;
+			uint32_t lower_temp_deny_discharger:1;
+			uint32_t over_temp_deny_charger:1;
+			uint32_t over_temp_deny_discharger:1;
 
 
+			uint32_t is_work_temp_normal:1;
+			uint32_t small_current_real_short:1; //真实短路
+		};
+	};
 	uint8_t    internal_resistance[CELLS_NUM];   //cell's internal resistance
 	uint8_t    internal_resistance[CELLS_NUM];   //cell's internal resistance
+	uint32_t      pd_time;
 }bms_health_t;
 }bms_health_t;
 
 
 typedef struct {
 typedef struct {

+ 3 - 0
Application/app/sox/state.c

@@ -343,6 +343,9 @@ static void _process_user_request(s32 health){
 static void _process_power_down(void){
 static void _process_power_down(void){
 #if (ALLOW_POWER_DOWN==1)	
 #if (ALLOW_POWER_DOWN==1)	
 	if (bms_health()->powerdown_lower_voltage){
 	if (bms_health()->powerdown_lower_voltage){
+		if (shark_get_seconds() < bms_health()->pd_time + 5) {//³¬¹ý5s powerdown
+			return;
+		}
 		state_debug("BMS System PowerDown!!\n");
 		state_debug("BMS System PowerDown!!\n");
 
 
 		if (bms_work_is_normal() && soc_update_by_ocv()) {
 		if (bms_work_is_normal() && soc_update_by_ocv()) {