|
@@ -10,6 +10,7 @@ static soc_t _soc;
|
|
|
static uint8_t chargering = 0;
|
|
static uint8_t chargering = 0;
|
|
|
static u64 time_ms = 0;
|
|
static u64 time_ms = 0;
|
|
|
static float soc_delta_time = 0;
|
|
static float soc_delta_time = 0;
|
|
|
|
|
+static float max_soc_delta_time = 0;
|
|
|
static float _charger_coefficient = 1.0f;
|
|
static float _charger_coefficient = 1.0f;
|
|
|
static float _discharger_coefficient = 1.0f;
|
|
static float _discharger_coefficient = 1.0f;
|
|
|
uint32_t charger_remain_time = 0;
|
|
uint32_t charger_remain_time = 0;
|
|
@@ -39,17 +40,19 @@ void soc_init(void){
|
|
|
soc_log();
|
|
soc_log();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+#define TOHA(x) (float)(x/3600.0f)
|
|
|
|
|
+
|
|
|
void soc_log(void){
|
|
void soc_log(void){
|
|
|
- soc_debug("C now: %f\n", _soc.coulomb_now);
|
|
|
|
|
- soc_debug("C min: %f\n", _soc.coulomb_min);
|
|
|
|
|
- soc_debug("C max: %f\n", _soc.coulomb_max);
|
|
|
|
|
- soc_debug("C char: %f\n", _soc.charger_coulomb);
|
|
|
|
|
- soc_debug("C dischar: %f\n", _soc.dischrger_coulomb);
|
|
|
|
|
- soc_debug("C pre char: %f\n", _soc.pre_discharger_coulomb);
|
|
|
|
|
- soc_debug("C pre dischar: %f\n", _soc.pre_charger_coulomb);
|
|
|
|
|
- soc_debug("C tol: %d\n", _soc.total_coulomb);
|
|
|
|
|
|
|
+ soc_debug("C now: %.2f\n", TOHA(_soc.coulomb_now));
|
|
|
|
|
+ soc_debug("C min: %.2f\n", TOHA(_soc.coulomb_min));
|
|
|
|
|
+ soc_debug("C max: %.2f\n", TOHA(_soc.coulomb_max));
|
|
|
|
|
+ soc_debug("C char: %.2f\n", TOHA(_soc.charger_coulomb));
|
|
|
|
|
+ soc_debug("C dischar: %.2f\n", TOHA(_soc.dischrger_coulomb));
|
|
|
|
|
+ soc_debug("C pre char: %.2f\n", TOHA(_soc.pre_discharger_coulomb));
|
|
|
|
|
+ soc_debug("C pre dischar: %.2f\n", TOHA(_soc.pre_charger_coulomb));
|
|
|
|
|
+ soc_debug("C tol: %.2f\n", _soc.total_coulomb);
|
|
|
soc_debug("C energy: %f\n", _soc.energy);
|
|
soc_debug("C energy: %f\n", _soc.energy);
|
|
|
- soc_debug("C delta time %fs\n", soc_delta_time);
|
|
|
|
|
|
|
+ soc_debug("C delta time %f,%f\n", max_soc_delta_time, soc_delta_time);
|
|
|
if (chargering){
|
|
if (chargering){
|
|
|
soc_debug("C remain %d\n", charger_remain_time);
|
|
soc_debug("C remain %d\n", charger_remain_time);
|
|
|
}
|
|
}
|
|
@@ -84,6 +87,9 @@ static __inline__ float _delta_time(void){
|
|
|
u32 delta = shark_get_mseconds() - time_ms;
|
|
u32 delta = shark_get_mseconds() - time_ms;
|
|
|
time_ms = shark_get_mseconds();
|
|
time_ms = shark_get_mseconds();
|
|
|
soc_delta_time = (float)delta / (1000.0f);
|
|
soc_delta_time = (float)delta / (1000.0f);
|
|
|
|
|
+ if (soc_delta_time > max_soc_delta_time){
|
|
|
|
|
+ max_soc_delta_time = soc_delta_time;
|
|
|
|
|
+ }
|
|
|
return soc_delta_time; //秒
|
|
return soc_delta_time; //秒
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -105,6 +111,7 @@ void soc_update_by_ocv(void){
|
|
|
if (measure_value()->load_current <= 300.0f){
|
|
if (measure_value()->load_current <= 300.0f){
|
|
|
//判断总电压
|
|
//判断总电压
|
|
|
if (bms_state_get()->pack_voltage >= 54000){
|
|
if (bms_state_get()->pack_voltage >= 54000){
|
|
|
|
|
+ soc_debug("measure_value()->load_current %d\n", measure_value()->load_current);
|
|
|
_soc.capacity = 100;
|
|
_soc.capacity = 100;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -143,11 +150,13 @@ void soc_update(void){
|
|
|
_soc.charger_coulomb = 0;//clear charing
|
|
_soc.charger_coulomb = 0;//clear charing
|
|
|
_soc.total_coulomb += _soc.pre_charger_coulomb / 3600.0f;
|
|
_soc.total_coulomb += _soc.pre_charger_coulomb / 3600.0f;
|
|
|
chargering = 1;
|
|
chargering = 1;
|
|
|
|
|
+ soc_warning("changed to chargering, current = %d\n", measure_value()->load_current);
|
|
|
}else if (chargering && !bms_state_get()->charging){
|
|
}else if (chargering && !bms_state_get()->charging){
|
|
|
_soc.pre_discharger_coulomb = _soc.dischrger_coulomb;
|
|
_soc.pre_discharger_coulomb = _soc.dischrger_coulomb;
|
|
|
_soc.dischrger_coulomb = 0; //clear discharger
|
|
_soc.dischrger_coulomb = 0; //clear discharger
|
|
|
_soc.total_coulomb += _soc.pre_discharger_coulomb / 3600.0f;
|
|
_soc.total_coulomb += _soc.pre_discharger_coulomb / 3600.0f;
|
|
|
chargering = 0;
|
|
chargering = 0;
|
|
|
|
|
+ soc_warning("changed to dischargering, current = %d\n", measure_value()->load_current);
|
|
|
}
|
|
}
|
|
|
double current = measure_value()->load_current / 1000.0f; //A
|
|
double current = measure_value()->load_current / 1000.0f; //A
|
|
|
double delta_q = current * _delta_time();
|
|
double delta_q = current * _delta_time();
|
|
@@ -166,7 +175,10 @@ void soc_update(void){
|
|
|
_soc.coulomb_now = _soc.coulomb_min;
|
|
_soc.coulomb_now = _soc.coulomb_min;
|
|
|
}
|
|
}
|
|
|
uint8_t old_cap = _soc.capacity;
|
|
uint8_t old_cap = _soc.capacity;
|
|
|
- _soc.capacity = (_soc.coulomb_now - _soc.coulomb_min)/(_soc.coulomb_max - _soc.coulomb_min) * 100;
|
|
|
|
|
|
|
+ _soc.capacity = ((_soc.coulomb_now - _soc.coulomb_min)/(_soc.coulomb_max - _soc.coulomb_min) + 0.5f) * 100;//四舍五入
|
|
|
|
|
+ if (_soc.capacity > 100){
|
|
|
|
|
+ _soc.capacity = 100;
|
|
|
|
|
+ }
|
|
|
if (chargering && (_soc.capacity == 100)){
|
|
if (chargering && (_soc.capacity == 100)){
|
|
|
_soc.capacity = 99;//充电的时候必须通过ovc才能把电量校准到100
|
|
_soc.capacity = 99;//充电的时候必须通过ovc才能把电量校准到100
|
|
|
}else if (!chargering && (_soc.capacity == 0)){
|
|
}else if (!chargering && (_soc.capacity == 0)){
|