nPM1300 charging battery and getting a correct SOC with the Fuel Gauge lib from nRF Connect SDK V2.6.0

Hi,

I am using the nPM1300 in combination with a STM32L431KBU MCU. 

Also the code from Nordic to communicate with the nPM1300: https://github.com/NordicSemiconductor/npmx 

to get the SOC I am using the fuel gauge lib provided by Nordic in de nRF Connect SDK V2.6.0 (cortex-m4\hard-float\libnrf_fuel_gauge.a).

For discharging the battery the SOC seems to be fine but when charging the battery the SOC value is incorrect.

Every second I update the fuel gauge lib, the SOC will increase 1%. within a 100sec the SOC is at 100% but the battery is still not full. (6 to 7 hours to go with 0.2C charging current)

I have tried to disable the charging module in the nPM1300 for a short period to do a fuel gauge update but as result losing the ADC battery voltage and current measurements.

fuel gauge update code (update interval, 1 sec):

static pm_error_t fuel_gauge_update(void)

{

bool cc_charging = false;

if(pm.charge.state == APP_STATE_VBUS_CONNECTED_CHARGING_CC)

{

cc_charging = true;

}

/*fuel gauge update*/

pm.gauge.delta = ((float)(pm_uptimer_get() - pm.gauge.ref_time)) / 1000.0f;

pm.gauge.soc = nrf_fuel_gauge_process(pm.adc.values.voltage, pm.adc.values.current, pm.adc.values.temp, pm.gauge.delta, NULL);

pm.gauge.tte = nrf_fuel_gauge_tte_get();

pm.gauge.ttf = nrf_fuel_gauge_ttf_get(cc_charging, -pm.gauge.term_charge_current);

return PM_SUCCES;

}

command used for disable charger module:

/* Disable charger before changing charge current. */

npmx_charger_module_disable_set(charger_instance, NPMX_CHARGER_MODULE_CHARGER_MASK | NPMX_CHARGER_MODULE_RECHARGE_MASK);

My questions:
How to get a correct SOC when charging?

Is this possible with the fuel gauge lib from Nordic?

  • Hi,

    "Where are you updating pm.gauge.ref_time?"

    Good Question...... the solution of the problem foundSlight smile.

    I mis interpreted the sample code.

    The part of the delta time for the nrf_fuel_gauge_process() function.

    I assumed that the fuel gauge library needed the delta time from startup.

    But I was wrong, it needs the delta time from the last gauge update (nrf_fuel_gauge_process).Face palm

    As it was, I set the pm.gauge.ref_time at startup and never changed it.

    As result that the pm.gauge.delta gets bigger and bigger.

    The code is changed now so pm.gauge.delta is the time difference between previous gauge update and new gauge update.

    static float pm_delta_time(uint64_t* ref)

    {

    uint64_t time = pm_uptimer_get();

    uint64_t delta = time - *ref;

    *ref = time;

    return ((float)delta)/1000.f;

    }

    pm.gauge.delta = pm_delta_time(&pm.gauge.ref_time);

    result:

    [00:15:31.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.73, SoC: 59.94, TTE : nan, TTF: 6101
    [00:15:32.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 59.94, TTE : nan, TTF: 6101
    [00:15:33.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 59.95, TTE : nan, TTF: 6099
    [00:15:34.027] <info> fuel_gauge: V: 3.798, I: -0.330, T: 46.73, SoC: 59.96, TTE : nan, TTF: 6098
    [00:15:35.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 59.96, TTE : nan, TTF: 6098
    [00:15:36.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.73, SoC: 59.97, TTE : nan, TTF: 6097
    [00:15:37.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.73, SoC: 59.98, TTE : nan, TTF: 6095
    [00:15:38.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 59.98, TTE : nan, TTF: 6095
    [00:15:39.027] <info> fuel_gauge: V: 3.808, I: -0.331, T: 46.86, SoC: 59.99, TTE : nan, TTF: 6093
    [00:15:40.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 60.00, TTE : nan, TTF: 6092
    [00:15:41.027] <info> fuel_gauge: V: 3.808, I: -0.331, T: 46.86, SoC: 60.00, TTE : nan, TTF: 6091
    [00:15:42.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.01, TTE : nan, TTF: 6090
    [00:15:43.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.02, TTE : nan, TTF: 6089
    [00:15:44.027] <info> fuel_gauge: V: 3.808, I: -0.329, T: 46.73, SoC: 60.02, TTE : nan, TTF: 6087
    [00:15:45.027] <info> fuel_gauge: V: 3.808, I: -0.331, T: 46.86, SoC: 60.03, TTE : nan, TTF: 6087
    [00:15:46.027] <info> fuel_gauge: V: 3.813, I: -0.330, T: 46.73, SoC: 60.04, TTE : nan, TTF: 6085
    [00:15:47.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.04, TTE : nan, TTF: 6084
    [00:15:48.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 60.05, TTE : nan, TTF: 6083
    [00:15:49.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 60.06, TTE : nan, TTF: 6082
    [00:15:50.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.06, TTE : nan, TTF: 6081
    [00:15:51.027] <info> fuel_gauge: V: 3.813, I: -0.330, T: 46.86, SoC: 60.07, TTE : nan, TTF: 6080
    [00:15:52.027] <info> fuel_gauge: V: 3.808, I: -0.329, T: 46.86, SoC: 60.08, TTE : nan, TTF: 6078
    [00:15:53.027] <info> fuel_gauge: V: 3.798, I: -0.330, T: 46.86, SoC: 60.08, TTE : nan, TTF: 6078
    [00:15:54.027] <info> fuel_gauge: V: 3.808, I: -0.331, T: 46.86, SoC: 60.09, TTE : nan, TTF: 6077
    [00:15:55.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.10, TTE : nan, TTF: 6076
    [00:15:56.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 60.11, TTE : nan, TTF: 6074
    [00:15:57.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.73, SoC: 60.11, TTE : nan, TTF: 6074
    [00:15:58.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.73, SoC: 60.12, TTE : nan, TTF: 6073
    [00:15:59.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.13, TTE : nan, TTF: 6072
    [00:16:00.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.13, TTE : nan, TTF: 6071
    [00:16:01.027] <info> fuel_gauge: V: 3.808, I: -0.330, T: 46.86, SoC: 60.14, TTE : nan, TTF: 6069
    [00:16:02.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.86, SoC: 60.15, TTE : nan, TTF: 6068
    [00:16:03.027] <info> fuel_gauge: V: 3.803, I: -0.329, T: 46.73, SoC: 60.15, TTE : nan, TTF: 6067
    [00:16:04.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 60.16, TTE : nan, TTF: 6067
    [00:16:05.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.73, SoC: 60.17, TTE : nan, TTF: 6066
    [00:16:06.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.17, TTE : nan, TTF: 6065
    [00:16:07.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 60.18, TTE : nan, TTF: 6064
    [00:16:08.027] <info> fuel_gauge: V: 3.803, I: -0.331, T: 46.86, SoC: 60.19, TTE : nan, TTF: 6063
    [00:16:09.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.19, TTE : nan, TTF: 6062
    [00:16:10.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.20, TTE : nan, TTF: 6061
    [00:16:11.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.21, TTE : nan, TTF: 6060
    [00:16:12.027] <info> fuel_gauge: V: 3.808, I: -0.329, T: 46.86, SoC: 60.21, TTE : nan, TTF: 6059
    [00:16:13.027] <info> fuel_gauge: V: 3.803, I: -0.330, T: 46.86, SoC: 60.22, TTE : nan, TTF: 6058

Related