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?

Parents
  • Hi.

    I have been looking at this recently, and I have it working correctly with the latest fuel gauge library and updated npmx.

    There is a pending update to our npmx-zephyr example project you may find useful as a reference:
    samples: fuel_gauge: Updated to latest nrfxlib by aasinclair · Pull Request #128 · NordicSemiconductor/npmx-zephyr (github.com)

    Andy

  • Hi,

    Thank you for you quick reply.

    I have look a the changes made and I already had concluded that there was a incorrect variable given to the nrf_fuel_gauge_ttf_get() function.

    OLD:

    ttf = nrf_fuel_gauge_ttf_get(-max_charge_current, -term_charge_current);

    NEW:
    ttf = nrf_fuel_gauge_ttf_get(cc_charging, -term_charge_current);

    Even with this change the SOC value is still incorrect when charging.

    the SOC is calculated by nrf_fuel_gauge_process() function.

    the sample code also reinforces the conclusion that nrf_fuel_gauge_process() may/needs to be used when charging because both nrf_fuel_gauge_process() and nrf_fuel_gauge_ttf_get() are called on in function fuel_gauge_update().

    I am using a lithium ion battery DNK 16340-2P 1700mAh.

    charging current around 0.2C (400mA)

    I made the battery model with the nRF Connect app and necessary Nordic evaluation boards.

    fuel gauge update interval: 1 second

    already tried different time intervals when charging, 30sec, 1 min and 2 min, to see if this will improved SOC. It does not.

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

    Is this possible with the fuel gauge lib from Nordic?

  • Hi.

    I get sensible increase in SoC during charging using the latest sample (see below).

    Can you post an example output with the incorrect SoC?
    Where are you updating pm.gauge.ref_time?

    Andy

    [00:01:16.806,121] <inf> fuel_gauge: V: 4.018, I: 0.021, T: 24.80, SoC: 82.13, TTE: 9623, TTF: nan
    [00:01:17.811,004] <inf> fuel_gauge: V: 4.013, I: 0.016, T: 24.80, SoC: 82.13, TTE: 9993, TTF: nan
    [00:01:18.815,856] <inf> fuel_gauge: V: 4.018, I: 0.055, T: 24.80, SoC: 82.13, TTE: 10355, TTF: nan
    [00:01:19.820,648] <inf> fuel_gauge: V: 4.018, I: 0.027, T: 24.80, SoC: 82.13, TTE: 10710, TTF: nan
    [00:01:20.825,531] <inf> fuel_gauge: V: 4.008, I: 0.008, T: 24.80, SoC: 82.11, TTE: 10968, TTF: nan
    [00:01:21.830,413] <inf> fuel_gauge: V: 4.013, I: 0.008, T: 24.80, SoC: 82.09, TTE: 11210, TTF: nan
    [00:01:22.835,327] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.80, SoC: 82.09, TTE: nan, TTF: nan
    [00:01:23.840,148] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.80, SoC: 82.11, TTE: nan, TTF: nan
    [00:01:24.845,031] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.13, TTE: nan, TTF: nan
    [00:01:25.849,914] <inf> fuel_gauge: V: 4.101, I: -0.163, T: 24.80, SoC: 82.15, TTE: nan, TTF: nan
    [00:01:26.854,827] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.91, SoC: 82.17, TTE: nan, TTF: nan
    [00:01:27.859,649] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.80, SoC: 82.18, TTE: nan, TTF: nan
    [00:01:28.864,532] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.20, TTE: nan, TTF: nan
    [00:01:29.869,445] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.22, TTE: nan, TTF: nan
    [00:01:30.874,389] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.24, TTE: nan, TTF: nan
    [00:01:31.879,241] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.26, TTE: nan, TTF: nan
    [00:01:32.884,094] <inf> fuel_gauge: V: 4.101, I: -0.163, T: 24.91, SoC: 82.27, TTE: nan, TTF: nan
    [00:01:33.889,007] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.80, SoC: 82.29, TTE: nan, TTF: nan
    [00:01:34.893,951] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.31, TTE: nan, TTF: nan
    [00:01:35.898,803] <inf> fuel_gauge: V: 4.101, I: -0.165, T: 24.80, SoC: 82.33, TTE: nan, TTF: nan
    [00:01:36.903,686] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.35, TTE: nan, TTF: nan
    [00:01:37.908,569] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.91, SoC: 82.36, TTE: nan, TTF: nan
    [00:01:38.913,482] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.38, TTE: nan, TTF: nan

Reply
  • Hi.

    I get sensible increase in SoC during charging using the latest sample (see below).

    Can you post an example output with the incorrect SoC?
    Where are you updating pm.gauge.ref_time?

    Andy

    [00:01:16.806,121] <inf> fuel_gauge: V: 4.018, I: 0.021, T: 24.80, SoC: 82.13, TTE: 9623, TTF: nan
    [00:01:17.811,004] <inf> fuel_gauge: V: 4.013, I: 0.016, T: 24.80, SoC: 82.13, TTE: 9993, TTF: nan
    [00:01:18.815,856] <inf> fuel_gauge: V: 4.018, I: 0.055, T: 24.80, SoC: 82.13, TTE: 10355, TTF: nan
    [00:01:19.820,648] <inf> fuel_gauge: V: 4.018, I: 0.027, T: 24.80, SoC: 82.13, TTE: 10710, TTF: nan
    [00:01:20.825,531] <inf> fuel_gauge: V: 4.008, I: 0.008, T: 24.80, SoC: 82.11, TTE: 10968, TTF: nan
    [00:01:21.830,413] <inf> fuel_gauge: V: 4.013, I: 0.008, T: 24.80, SoC: 82.09, TTE: 11210, TTF: nan
    [00:01:22.835,327] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.80, SoC: 82.09, TTE: nan, TTF: nan
    [00:01:23.840,148] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.80, SoC: 82.11, TTE: nan, TTF: nan
    [00:01:24.845,031] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.13, TTE: nan, TTF: nan
    [00:01:25.849,914] <inf> fuel_gauge: V: 4.101, I: -0.163, T: 24.80, SoC: 82.15, TTE: nan, TTF: nan
    [00:01:26.854,827] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.91, SoC: 82.17, TTE: nan, TTF: nan
    [00:01:27.859,649] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.80, SoC: 82.18, TTE: nan, TTF: nan
    [00:01:28.864,532] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.20, TTE: nan, TTF: nan
    [00:01:29.869,445] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.22, TTE: nan, TTF: nan
    [00:01:30.874,389] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.24, TTE: nan, TTF: nan
    [00:01:31.879,241] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.26, TTE: nan, TTF: nan
    [00:01:32.884,094] <inf> fuel_gauge: V: 4.101, I: -0.163, T: 24.91, SoC: 82.27, TTE: nan, TTF: nan
    [00:01:33.889,007] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.80, SoC: 82.29, TTE: nan, TTF: nan
    [00:01:34.893,951] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.31, TTE: nan, TTF: nan
    [00:01:35.898,803] <inf> fuel_gauge: V: 4.101, I: -0.165, T: 24.80, SoC: 82.33, TTE: nan, TTF: nan
    [00:01:36.903,686] <inf> fuel_gauge: V: 4.106, I: -0.164, T: 24.91, SoC: 82.35, TTE: nan, TTF: nan
    [00:01:37.908,569] <inf> fuel_gauge: V: 4.101, I: -0.164, T: 24.91, SoC: 82.36, TTE: nan, TTF: nan
    [00:01:38.913,482] <inf> fuel_gauge: V: 4.106, I: -0.163, T: 24.91, SoC: 82.38, TTE: nan, TTF: nan

Children
No Data
Related