|
|
@@ -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();
|
|
|
}
|