Procházet zdrojové kódy

update debounce

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui před 5 roky
rodič
revize
1f98e03ca0

+ 60 - 52
Application/app/sox/health.c

@@ -6,9 +6,9 @@
 #include "libs/logger.h"
 
 #define MAX_CURRENT_FOR_CHARGER (20*1000) //最大充电电流20A
-#define MIN_VOLTAGE_FOR_DISCHARGER (34 * 1000) //允许能放电的最小电压
-#define MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER (40 * 1000) //恢复放电的最小电压
-#define MIN_VOLTAGE_FOR_POWER_DOWN (32 * 1000)
+#define MIN_VOLTAGE_FOR_DISCHARGER (2.2f * CELLS_NUM * 1000) //允许能放电的最小电压
+#define MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER (2.3f * CELLS_NUM * 1000) //恢复放电的最小电压
+#define MIN_VOLTAGE_FOR_POWER_DOWN (2.1f * CELLS_NUM* 1000)
 #define SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE (1820) //最小允许的电芯放电电压 1.8v, 考虑到采样的误差取 1.82
 #define SIGLE_CELL_MAX_CHARGER_VOLTAGE (3880)//最大允许充电电压,3.9v,考虑到采样的误差取 3.88
 
@@ -125,61 +125,69 @@ void check_current_state(void){
 }
 
 /* 检测pack电压,cell电压,pack电压过低触发powerdown*/
-static debounce_t _discharger_lower_voltage = {.count = 0, .max_count = 10};
-static debounce_t _discharger_low_normal_voltage = {.count = 0, .max_count = 10};
-static debounce_t _power_down_voltage = {.count = 0, .max_count = 10};
-static debounce_t _sigle_cell_discharger_lower_vol = {.count = 5, .max_count = 10};
-static debounce_t _sigle_cell_charger_max_vol = {.count = 15, .max_count = 30};
+static debounce_t _discharger_lower_voltage = {.count = 10, .max_count = 20, .init_count = 10};
+static debounce_t _power_down_voltage = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _sigle_cell_discharger_lower_vol = {.count = 5, .max_count = 10, .init_count = 5};
+static debounce_t _sigle_cell_charger_max_vol = {.count = 15, .max_count = 30, .init_count = 15};
 
 void check_voltage_state(void) {
-	if (bms_state_get()->charging){
-		if (bms_state_get()->cell_max_vol>= SIGLE_CELL_MAX_CHARGER_VOLTAGE){
+	if (bms_state_get()->charging){ //check sigle cell's voltage for charger
+		if ((bms_state_get()->cell_max_vol>= SIGLE_CELL_MAX_CHARGER_VOLTAGE) && !_health.sigle_cell_over_voltage){
 			debounce_inc(_sigle_cell_charger_max_vol);
-		}else {
+			if (debounce_reach_max(_sigle_cell_charger_max_vol)){
+				_health.sigle_cell_over_voltage = 1;
+				debounce_reset(_sigle_cell_charger_max_vol);
+			}
+		}else if ((bms_state_get()->cell_max_vol < SIGLE_CELL_MAX_CHARGER_VOLTAGE) && _health.sigle_cell_over_voltage){
 			debounce_dec(_sigle_cell_charger_max_vol);
+			if (debounce_reach_zero(_sigle_cell_charger_max_vol)){
+				_health.sigle_cell_over_voltage = 0;
+				debounce_reset(_sigle_cell_charger_max_vol);
+			}
 		}
-		if (debounce_reach_max(_sigle_cell_charger_max_vol)){
-			_health.sigle_cell_over_voltage = 1;
-		}else if (debounce_reach_zero(_sigle_cell_charger_max_vol)){
-			_health.sigle_cell_over_voltage = 0;
-		}
-	}else if (bms_state_get()->discharging){
-		if (bms_state_get()->cell_min_vol <= SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE){
+	}else{ 
+		//check sigle cell's voltage for discharger
+		if ((bms_state_get()->cell_min_vol <= SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE) && !_health.sigle_cell_lower_voltage){
 			debounce_inc(_sigle_cell_discharger_lower_vol);
-		}else {
+			if (debounce_reach_max(_sigle_cell_discharger_lower_vol)){
+				_health.sigle_cell_lower_voltage = 1;
+				debounce_reset(_sigle_cell_discharger_lower_vol);
+			}
+		}else if ((bms_state_get()->cell_min_vol > SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE) && _health.sigle_cell_lower_voltage){
 			debounce_dec(_sigle_cell_discharger_lower_vol);
+			if (debounce_reach_zero(_sigle_cell_discharger_lower_vol)){
+				_health.sigle_cell_lower_voltage = 0;
+				debounce_reset(_sigle_cell_discharger_lower_vol);
+			}
 		}
-		if (debounce_reach_max(_sigle_cell_discharger_lower_vol)){
-			_health.sigle_cell_lower_voltage = 1;
-		}else if (debounce_reach_zero(_sigle_cell_discharger_lower_vol)){
-			_health.sigle_cell_lower_voltage = 0;
-		}
-	}	
-	if (!_health.discharger_lower_voltage){ //check for low pack voltage for close discharger
-		if (bms_state_get()->pack_voltage <= MIN_VOLTAGE_FOR_DISCHARGER){
-			debounce_inc(_discharger_lower_voltage);
-		}else {
-			debounce_reset(_discharger_lower_voltage);
-		}
-		if (debounce_reach_max(_discharger_lower_voltage)){
-			_health.discharger_lower_voltage = 1;
-			debounce_reset(_discharger_lower_voltage);
-		}
+		//check sigle pack's voltage for discharger
+		if (!_health.discharger_lower_voltage){ //check for low pack voltage for close discharger
+			if (bms_state_get()->pack_voltage <= MIN_VOLTAGE_FOR_DISCHARGER){
+				debounce_inc(_discharger_lower_voltage);
+			}else {
+				debounce_reset(_discharger_lower_voltage);
+			}
+			if (debounce_reach_max(_discharger_lower_voltage)){
+				_health.discharger_lower_voltage = 1;
+				debounce_reset(_discharger_lower_voltage);
+			}
 
-	}else { //check for discharger recovery
-		if (bms_state_get()->pack_voltage >= MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER){
-			debounce_inc(_discharger_low_normal_voltage);
-		}else {
-			debounce_reset(_discharger_low_normal_voltage);
-		}
-		if (debounce_reach_max(_discharger_low_normal_voltage)){
-			_health.discharger_lower_voltage = 0;
-			debounce_reset(_discharger_low_normal_voltage);
+		}else { //check for discharger recovery
+			if (bms_state_get()->pack_voltage >= MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER){
+				debounce_inc(_discharger_lower_voltage);
+			}else {
+				debounce_reset(_discharger_lower_voltage);
+			}
+			if (debounce_reach_max(_discharger_lower_voltage)){
+				_health.discharger_lower_voltage = 0;
+				debounce_reset(_discharger_lower_voltage);
+			}		
 		}		
-	}
+	}	
+
 	/* check for power down */
 	if (!io_state()->charger_detect && !bms_state_get()->charging && !_health.powerdown_lower_voltage){
-		if (bms_state_get()->pack_voltage >= MIN_VOLTAGE_FOR_POWER_DOWN){
+		if (bms_state_get()->pack_voltage <= MIN_VOLTAGE_FOR_POWER_DOWN){
 			debounce_inc(_power_down_voltage);
 		}else {
 			debounce_reset(_power_down_voltage);
@@ -198,12 +206,12 @@ void check_voltage_state(void) {
 
 /* 检测温度情况,看是否过高温,或者过低温 */
 
-static debounce_t _charger_over_temp      = {.count = 0, .max_count = 10};
-static debounce_t _charger_lower_temp     = {.count = 0, .max_count = 10};
-static debounce_t _charger_normal_temp    = {.count = 0, .max_count = 10};
-static debounce_t _discharger_over_temp   = {.count = 0, .max_count = 10};
-static debounce_t _discharger_lower_temp  = {.count = 0, .max_count = 10};
-static debounce_t _discharger_normal_temp = {.count = 0, .max_count = 10};
+static debounce_t _charger_over_temp      = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _charger_lower_temp     = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _charger_normal_temp    = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _discharger_over_temp   = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _discharger_lower_temp  = {.count = 0, .max_count = 10, .init_count = 0};
+static debounce_t _discharger_normal_temp = {.count = 0, .max_count = 10, .init_count = 0};
 
 static int _is_over_temp(int8_t *temps){
 	for (int i = 0; i < PACK_TEMPS_NUM; i++){

+ 1 - 1
Application/app/sox/measure.c

@@ -36,7 +36,7 @@ static const float max_gd_adc = 65535.0f;
 static const float v_cs1180_ref = 1235.0f;//cs1180 vref = 1.235v
 static const float max_cs1180_adc = 0x7FFFF;//
 static const float small_cur_r_sense = 360.0f;//mo
-static uint8_t adc_used = GD32_ADC;////CS1180_ADC;
+static uint8_t adc_used = CS1180_ADC;//|GD32_ADC;
 
 static void __inline__ select_gain_10x(int select){	
 	if (select){

+ 11 - 26
Application/app/sox/state.c

@@ -10,7 +10,7 @@
 #include "iostate.h"
 
 #define ALLOW_DEEP_SLEEP 0
-#define ALLOW_POWER_DOWN 0
+#define ALLOW_POWER_DOWN 1
 #define ALLOW_5238_BALANCE 1
 
 static bms_state_t _bms_state;
@@ -71,7 +71,6 @@ static s32 _process_unheath(void){
 		charger_open(0); //disable charger mosfet
 		AUX_VOL_OPEN(0);
 		_bms_state.charging = 0;
-		_bms_state.discharging = 0;
 		return (Health_Discharger_Failt | Health_charger_Fault);
 	}
 
@@ -83,7 +82,6 @@ static s32 _process_unheath(void){
 
 	if (bms_health()->discharger_over_temp || bms_health()->discharger_lower_temp || bms_health()->discharger_lower_voltage){
 		discharger_open(0); //disable charger mosfet
-		_bms_state.discharging = 0;
 		return Health_Discharger_Failt;
 	}
 
@@ -169,34 +167,21 @@ static u32 _bms_main_task_handler(void){
 	return 0;
 }
 
-static debounce_t _charging_detect = {.count = 0, .max_count = 10};
+static debounce_t _charging_detect = {.count = 10, .max_count = 20, .init_count = 10};
 static void check_charging(){
-	if (!_bms_state.charging) {
-		if (measure_value()->load_current >= MIN_START_CHARGER_CURRENT) {
-			debounce_inc(_charging_detect);
-		}else {
-			debounce_reset(_charging_detect);
-		}
-		if (debounce_reach_max(&_charging_detect)){
+	if ((measure_value()->load_current >= MIN_START_CHARGER_CURRENT) && !_bms_state.charging) {
+		debounce_inc(_charging_detect);
+		if (debounce_reach_max(_charging_detect)){
 			_bms_state.charging = 1;
-			_bms_state.discharging = 0;
-			debounce_reset(_charging_detect);
-		}
-	}else {
-		if (measure_value()->load_current <= MIN_START_LOADING_CURRENT) {
-			debounce_inc(_charging_detect);
-		}else {
 			debounce_reset(_charging_detect);
 		}
-		if (debounce_reach_max(_charging_detect)){
-			_bms_state.charging = 0;
-			_bms_state.discharging = 1;
-			shark_timer_cancel(&_balance_timer);
-			_balance_timer_handler(&_balance_timer);
+	}else if ((measure_value()->load_current < MIN_START_CHARGER_CURRENT) && _bms_state.charging){
+		debounce_dec(_charging_detect);
+		if (debounce_reach_zero(_charging_detect)){
+			_bms_state.charging = 1;
 			debounce_reset(_charging_detect);
-		}
-	}
-
+		}		
+	}	
 }
 
 static void _current_notify(void){

+ 5 - 4
Application/app/sox/state.h

@@ -14,13 +14,12 @@
 #define BATT_USED_BY_CHARGER_DOCKER 2
 #define HATT_USED_BY_CHARGER_BOX 3
 
-#define MIN_START_CHARGER_CURRENT 100 //ma, 如果有正向超过 MIN_START_CHARGER_CURRENT的电流,认为在充电
-#define MIN_START_LOADING_CURRENT 2  //ma, 如果有反向小于 MIN_START_LOADING_CURRENT的电流,认为在放电
+#define MIN_START_CHARGER_CURRENT 5 //ma, 如果有正向超过 MIN_START_CHARGER_CURRENT的电流,认为在充电
+//#define MIN_START_LOADING_CURRENT 2  //ma, 如果有反向小于 MIN_START_LOADING_CURRENT的电流,认为在放电
 #define MAX_DIFF_BETWEEN_MIN_MAX_CELL 150 //0.15v ,压差超过这个值,开始balance
 #define MIN_DIFF_BETWEEN_MIN_MAX_CELL 050 //0.05v, 牙差低于这个数据,停止balance
 #define CELL_FUSION_VOLTAGE      3500 //LFP电池在3.5v的时候,开始发散,需要判断是否要balance
 typedef struct{
-	uint16_t discharging :1;
 	uint16_t charging: 1;
 	uint16_t pack_balancing:1;
 	uint16_t pack_voltage; //电池包的总电压
@@ -46,6 +45,7 @@ typedef struct {
 typedef struct {
 	int count;
 	int max_count;
+	int init_count;
 }debounce_t;
 
 /* 充电充满判断OK前,需要经过balance 的判断再决定是否告知充电完成,判断balance前soc会一直在99% 
@@ -60,7 +60,8 @@ typedef enum {
 
 #define debounce_reach_max(dt) (dt.count >= dt.max_count)
 #define debounce_reach_zero(dt) (dt.count == 0)
-#define debounce_reset(dt) {dt.count = 0;}
+#define debounce_reset(dt) {dt.count = dt.init_count;}
+#define debounce_set_count(dt, c) {dt.count = c;}
 #define debounce_inc(dt) {if (dt.count < dt.max_count) dt.count++;}
 #define debounce_dec(dt) {if (dt.count > 0) dt.count--;}
 void bms_state_init(void);

+ 23 - 17
Application/bsp/cs1180.c

@@ -23,6 +23,7 @@ static float _cs1180_gain = 1.0f;
 
 static int cs1180_send_cmd(uint8_t data);
 static uint8_t cs1180_read_data(uint8_t data);
+static void cs1180_reset(void);
 
 void cs_delay(void)
 {
@@ -130,7 +131,7 @@ __attribute__((unused)) static void cs1180_sys_gain_calibrate(void)
 	while (!IS_CS1180_READY());
 }
 
-void cs1180_adc_set_gain(int gain){
+static void _cs1180_adc_set_gain(int gain){
 	/* 输出频率 15hz,参考电压1.235V 输出数据高位在前,
 	 * 输入缓冲器关闭,采样频率 OSC/128,数据格式双极性
 	 */
@@ -146,6 +147,26 @@ void cs1180_adc_set_gain(int gain){
 	cs1180_dumy_read();	
 }
 
+void cs1180_adc_set_gain(int gain){
+	int count = 0;
+	do {
+		cs1180_reset();
+		delay_us(10);
+	
+		_cs1180_adc_set_gain(gain);
+		delay_us(10);
+
+		if (cs1180_dumy_read() == gain){
+			break;
+		}
+		count ++;
+	}while(count <= 20);
+	delay_us(10*1000);
+	cs1180_sys_offset_calibrate();
+	cs1180_dumy_read();
+}
+
+
 static void cs1180_reset(void){
 	cs1180_cs(0);
 	cs_delay();
@@ -161,22 +182,7 @@ void cs1180_adc_init(void){
 	delay_us(200 * 1000);
 	spi1_init();
 	delay_us(10);
-	int count = 0;
-	do {
-		cs1180_reset();
-		delay_us(10);
-	
-		cs1180_adc_set_gain(CS1180_INIT_GAIN);
-		delay_us(10);
-
-		if (cs1180_dumy_read() == CS1180_INIT_GAIN){
-			break;
-		}
-		count ++;
-	}while(count <= 20);
-	delay_us(10*1000);
-	cs1180_sys_offset_calibrate();
-	cs1180_dumy_read();
+	cs1180_adc_set_gain(CS1180_INIT_GAIN);
 }
 
 

+ 2 - 2
Application/bsp/shark_bsp.h

@@ -28,8 +28,8 @@
 #define CELLS_NUM 15
 #define PACK_TEMPS_NUM 4
 
-#define GD32_ADC 1
-#define CS1180_ADC 2
+#define GD32_ADC (1<<0)
+#define CS1180_ADC (1<<1)
 
 void bsp_init(void);
 void wdog_start(int timeout);

+ 36 - 10
Project/SP700.uvoptx

@@ -135,7 +135,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name></Name>
+          <Name>d</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -148,7 +148,40 @@
           <Name>UL2CM3(-S0 -C0 -P0 )  -FN1 -FC1000 -FD20000000 -FF0GD32F3x0 -FL010000 -FS08000000 -FP0($$Device:GD32F330C8$Flash\GD32F3x0.FLM)</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint/>
+      <Breakpoint>
+        <Bp>
+          <Number>0</Number>
+          <Type>0</Type>
+          <LineNumber>192</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134226450</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>..\Application\app\sox\health.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\SP700\../Application/app/sox/health.c\192</Expression>
+        </Bp>
+        <Bp>
+          <Number>1</Number>
+          <Type>0</Type>
+          <LineNumber>114</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134223102</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>..\Application\app\sox\state.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\SP700\../Application/app/sox/state.c\114</Expression>
+        </Bp>
+      </Breakpoint>
       <WatchWindow1>
         <Ww>
           <count>0</count>
@@ -158,16 +191,9 @@
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>SystemCoreClock,0x0A</ItemText>
+          <ItemText>_measure_value</ItemText>
         </Ww>
       </WatchWindow1>
-      <WatchWindow2>
-        <Ww>
-          <count>0</count>
-          <WinNumber>2</WinNumber>
-          <ItemText>max_cs1180_adc</ItemText>
-        </Ww>
-      </WatchWindow2>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>