ソースを参照

解决骑行过程中电量在0和1之间跳变

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 年 前
コミット
b5323345d3
1 ファイル変更14 行追加6 行削除
  1. 14 6
      Application/app/sox/soc.c

+ 14 - 6
Application/app/sox/soc.c

@@ -11,7 +11,8 @@
 
 static soc_t _soc;
 static uint8_t chargering = 0;
-static u64     time_ms = 0;
+static u64     current_sample_ts = 0;
+static u64     charger_ts = 0;
 static float     soc_delta_time = 0;
 static float     max_soc_delta_time = 0;
 static float _charger_coefficient = 1.0f;
@@ -37,7 +38,7 @@ static int least_square_started = 0;
 void soc_init(void){
 	set_log_level(MOD_SOC, L_debug);
 	
-	time_ms = shark_get_mseconds();
+	current_sample_ts = shark_get_mseconds();
 	if (nv_restore_soc() != 0){
 		soc_warning("SOC: nv storage is not inited, use default value!!\n");
 		_soc.coulomb_min = 0;
@@ -137,8 +138,8 @@ static void calibrate_soc_by_ocv(void){
 }
 
 static __inline__ float _delta_time(void){
-	u32 delta = shark_get_mseconds() - time_ms;
-	time_ms = shark_get_mseconds();
+	u32 delta = shark_get_mseconds() - current_sample_ts;
+	current_sample_ts = shark_get_mseconds();
 	soc_delta_time = (float)delta / (1000.0f);
 	if (soc_delta_time > max_soc_delta_time){
 		max_soc_delta_time = soc_delta_time;
@@ -146,6 +147,10 @@ static __inline__ float _delta_time(void){
 	return soc_delta_time; //Ãë
 }
 
+static __inline__ u32 charger_time(void){
+	return (shark_get_mseconds() - charger_ts);
+}
+
 int soc_update_by_ocv(void){
 	
 	int changed = 0;
@@ -288,10 +293,10 @@ void soc_update(void){
 		_soc.charger_coulomb = 0;//clear charing
 		_soc.total_coulomb += _soc.pre_charger_coulomb / 3600.0f;
 		chargering = 1;
-		is_force_empty = 0;
 		if (_soc.capacity < 100) {
 			is_force_full = 0;
 		}
+		charger_ts = shark_get_mseconds();
 #if LEAST_SQUARE==1		
 		start_least_square(0);
 #endif
@@ -310,7 +315,10 @@ void soc_update(void){
 	if(!chargering && abs(measure_value()->load_current) >= 5000){
 		start_least_square(1);
 	}
-#endif	
+#endif
+	if (chargering && (charger_time() >= 10 * 1000)){
+		is_force_empty = 0;
+	}
 	soc_update_by_current_and_time(measure_value()->load_current, _delta_time(), pre_chargering);
 	soc_update_charger_remain_time();
 }