|
|
@@ -27,6 +27,7 @@ static const float _discharger_gain[] = {1.0f/*>0
|
|
|
#define FULL_MAX_VOLTAGE (54000) //mV
|
|
|
#define FULL_MIN_CURRENT (500.0f) //mA
|
|
|
static void calibrate_soc_by_ocv(void);
|
|
|
+static void _soc_clear(void);
|
|
|
|
|
|
#if LEAST_SQUARE==1
|
|
|
static void _least_square_timer_handler(shark_timer_t *timer);
|
|
|
@@ -44,14 +45,12 @@ void soc_init(void){
|
|
|
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;
|
|
|
- _soc.coulomb_max = DEFALUT_MAX_COULOMB; //30HA,这个值最总需要soh模块给
|
|
|
- _soc.flags = 0;
|
|
|
- _soc.charger_coulomb = 0;
|
|
|
- _soc.pre_charger_coulomb = 0;
|
|
|
- _soc.dischrger_coulomb = 0;
|
|
|
- _soc.pre_discharger_coulomb = 0;
|
|
|
- _soc.total_coulomb = 0;
|
|
|
+ _soc_clear();
|
|
|
+ }
|
|
|
+ //如果最大容量和默认不一致,需要重新校准
|
|
|
+ if (_soc.coulomb_max != DEFALUT_MAX_COULOMB) {
|
|
|
+ _soc_clear();
|
|
|
+ nv_save_all_soc();
|
|
|
}
|
|
|
if ((_soc.flags & SOC_FLAG_CALIBRATED) == 0){
|
|
|
calibrate_soc_by_ocv();
|
|
|
@@ -60,6 +59,17 @@ void soc_init(void){
|
|
|
soc_log();
|
|
|
}
|
|
|
|
|
|
+static void _soc_clear(void){
|
|
|
+ _soc.coulomb_min = 0;
|
|
|
+ _soc.coulomb_max = DEFALUT_MAX_COULOMB; //30HA,这个值最总需要soh模块给
|
|
|
+ _soc.flags = 0;
|
|
|
+ _soc.charger_coulomb = 0;
|
|
|
+ _soc.pre_charger_coulomb = 0;
|
|
|
+ _soc.dischrger_coulomb = 0;
|
|
|
+ _soc.pre_discharger_coulomb = 0;
|
|
|
+ _soc.total_coulomb = 0;
|
|
|
+}
|
|
|
+
|
|
|
void soc_restore_by_iap(uint8_t flags, uint8_t capaticy){
|
|
|
_soc.coulomb_min = 0;
|
|
|
_soc.coulomb_max = DEFALUT_MAX_COULOMB; //30HA,这个值最总需要soh模块给
|