Nordic nPM Fuel Gauge roadtest

View table of contents ...  

RoadTest: Test and Review the Nordic nPM Fuel Gauge Board

Author: JWx

Creation date:

Evaluation Type: Evaluation Boards

Did you receive all parts the manufacturer stated would be included in the package?: True

What other parts do you consider comparable to this product?: none in this price range

What were the biggest problems encountered?: occasional GUI glitches, time consuming modelling

Detailed Review:

Introduction

As power efficiency of electronic modules increases, more and more appliances can be turned portable and thus battery powered. This fact makes more important tasks connected with the battery management - especially energy conservation and battery charge level measurement.

Nordic Semiconductor - manufacturer of  (among other components) power management IC's, identifies several methods of estimating charge level of lithium based batteries, namely:

  • Open Circuit Voltage monitoring - the easiest to implement but capable of causing great measurement errors, especially when temperature swing is involved,
  • Coulomb Counter implementation - in this approach, battery is constantly monitored for incoming and outgoing charge, giving potentially most precise measurement, but at the cost of: 
    • a need to maintain always operating (and power drawing) charge monitor,
    • and possibility of measurement error accumulation during operation,
  • Fuel Gauge implementations, where battery model is used, allowing for capacity estimation using only measurements of battery's voltage, current and temperature,

According to the manufacturer's information, most fuel gauge implementations involve only limited number of supported battery types, where new models are created by the manufacturer at customer's request. Nordic Semiconductor provide a possibility do model new battery models in-house, using only low cost nPM1300 evaluation kit with a dedicated load-generating daughterboard - and this is something we will try to test here. 

Nordic Semiconductors nPM1300 PMIC (which is a member of family of PMICs compatible with the models generated) is an power management IC designed for nRF52, nRF53, nRF54 and nRF91 system-on-chip (and System In Package in the latter case) - this is important information, because fuel gauging algorithm is implemented as a library running on the host system and provided as a compiled binary.

Introduction to the nPM1300  

nPM1300 is a power management IC supporting single-cell Li-ion, Li-poly or LiFePO4 battery with charge current up to 800 mA, 1350 mA unregulated output (when running from the battery) and up to 500 mA of adjustable, regulated output in the form of two 200 mA buck regulators and two 50 mA LDOs (which can be reconfigured as 100 mA load switches). 

It also contains:

  • a system-level watchdog,
  • power-loss warning signal generating circuit,
  • Ship and Hibernate low power modes implementation,
  • up to 5 GPIOs and 3 LED drivers,
  • System Monitor (allowing for measuring: input voltage, battery voltage, battery current and temperatures of battery and a chip),
  • Fuel Gauge hardware interface usable when connected to the compatible SOC/SIP,

and has a block diagram as below:

nPM1300 block diagram

nPM Fuel Gauge board

nPM Fuel Gauge is an daughterboard for nPM1300 evaluation kit, allowing for creating of new battery profiles, with the block diagram as below:

fuel gauge block diagram

As can be seen, it is essentially configurable current sink allowing for discharging a cell in the controlled manner, allowing for measuring it's parameters in all points of the discharge curve.

Capacity estimation methods

As it was written in the beginning, Nordic Semiconductors identifies three main approaches to the capacity estimation of the cell during discharge. Let's compare them in more detail.

Open Circuit Voltage method

Batterydesign.net portal defines Open Circuit Voltage as "potential difference between the positive and negative terminals when no current flows and the cell is at rest", while "at rest" "requires that the cell is left to reach an equilibrium before the potential difference is measured".

In this approach, only the voltage of the cell is considered (another question is if it is always possible to measure voltage of the battery without load while being powered by such a battery).

It's precision is connected to the discharge curve's slope - the stepper one is, the easier the measurement.

For example, Sony is providing following set of discharge curves for their Li-Ion battery families (sourced from "Lithium Ion Rechargeable Battery" catalog from 2001 - current products can have better parameters)

{gallery}Discharge curves

Li-Po

Lithium-Polimer

Li-Io, graphite

Lithium-Ion with graphite anode

Li-Ion with hard carbon

Lithium-Ion with hard carbon anode

As can be seen, discharge curves can be mostly flat in the middle part and voltage difference from temperature variation can outpace the difference caused by significant charge level change - turning the battery monitoring into the last moment "battery low" warning, without meaningful forecast capability.

To further underline this relationship, below are presented some of dQ/dV curves from "A Generalized SOC-OCV Model for Lithium-Ion Batteries and the SOC Estimation for LNMCO Battery", where long horizontal peaks on the right side of plots indicate voltage ranges where large charge differences are resulting in only small voltage changes.

{gallery}dQ/dV plots

LNMCO battery

LNMCO battery plot

LMO battery plot

LMO battery plot

LFP battery plot

LFP battery plot

As can be seen, especially in the case of LFP/LiFePO4 batteries, OVC voltage can be misleading when estimating battery charge, particularly when temperature variations are present.

Unboxing and initial connection

Both modules have arrived (after longer than usual stop at customs office) in small, cardboard boxes, containing boards packaged in ESD protection bags. So - no bundled software, no printed documentation, no (usually redundant) cables, only strictly necessary items.

packaging

 Both modules are provided in the form prepared to operate without enclosures - without any components on the bottom sides and equipped with plastic "feet", providing some separation from (possibly conductive) working surface.

{gallery}Module photos

Evaluation kit - top

Evaluation kit - top

Evaluation kit - bottom

Evaluation kit - bottom

Fuel Gauge PCB - top

Fuel gauge module - top

Fuel gauge module - bottom

Fuel gauge module - bottom

and can be connected using an edge connector (like below)

connected modules

nPM1300 evaluation kit can be used in connection with another development kit from Nordic Semiconductor using I2C compatible TWI interface (like below)

ek to dk connection

or connected to the PC computer, using USB (and another USB for PMIC power)

ek to PC connection

and - as seen on the block diagram below, PC connection (and use of embedded nRF53 SOC) is required to operate Fuel Gauge daughterboard (and create battery profiles)

evaluation kit block diagram

At this stage we need to underline the important difference:

  • fuel gauging algorithm running on nRF SOC connected to the supported PMIC and capable of estimating charge level of previously modeled battery (without the need of Fuel Gauge daughterboard),
  • and Fuel Gauge daughterboard, which is an add-on to nPM1300 evaluation kit and allows for creating models for new batteries

Another component needed for operating the evaluation kit from the PC (and creating models) is an nPM PowerUP application, that can be installed inside of nRF Connect for Desktop package 

nrf connect with powerup app

Inside PowerUP application, evaluation kit should be selected first:

select ek

then, after the initial connection, firmware upgrade will be executed:

ek firmware upgrade 

Test setup

As a test setup, two elements were connected to the Evaluation Kit - a salvaged battery of unknown parameters (marked as 18250 battery with 600 mAh capacity) and an 47Ω resistor (used for controlled discharge of the battery).

As generating precise battery models involve taking into consideration the temperature (and - to get better results, can be repeated at different temperatures, for example +5°C, +25°C and +45°C, while avoiding extreme heat and below freezing values is recommended, as they can increase non-linearities and distort the model), 10 kΩ NTC termistor was glued to the battery. 

In case when no termistor is present, evaluation kit provides (selectable by a jumper) fixed 10 kΩ resistor that can be substituted for it, but in this case user supplied test temperature will be used instead ot the measurement, making the model less precise.

Evaluation kit provides three methods of battery connection:

  • three contact, 1 mm pitch JST-SH connector for batteries with NTC,
  • two contact, 1 mm pitch JST-SH connector for batteries without NTC,
  • two standard, 0.1"" pin headers (one for NTC and another one for the battery),

battery connector

According to the datasheet, JST-SH connectors are rated at 1 A, so they can be used in the whole range of charging currents (evaluation kit provides 800 mA at most), but could be insufficient to provide 1350 mA of discharge current - in this case, header connection would be more fitting.

As the battery under test was not equipped with JST connector, header connector was selected.

Another component used during the test was an 47 Ω resistor connected to the output of one of two buck regulators - the one marked as "BUCK1" was selected, because the other one is an recommended reference voltage for TWI and GPIO pins (so it cannot be switched off or reducted below 1.7 V and trying to do so generates warnings in GUI). Use of fixed resistor in connection with stabilized power supply allowed for configuring a constant and software controlled load for the battery.

load connection

resulting in the installation as below

test setup

As the battery to be profiled should be fully charged, during the first step charger was configured (with terminal voltage of 4.2 V and charging current - in this case 60 mA, later modified to 120 mA) and then activated. At the screenshot below one can see that "Default" battery model is used and the estimated charge level is presented.

initial charging 

 Charging (and discharging) process can be monitored on the GRAPH tab - for example, screen below shows a switch from constant current to constant voltage mode during battery charging

CC/CV switch

Battery profiling

After the battery is full, profiling can be started - it generates several warnings before starting (about expected temperature, operations that should be executed (removing of USB power connection), and a warning against changing device's configuration during profiling) and takes a long time - about two days for each temperature.

At the end, profile can be written to the evaluation kit's memory, into one of four slots

{gallery}Battery profiling

profiling preparation

Warnings before profiling

profiling started

Profiling started

Profiling finished

Profiling finished

Profile writing

Writing of the profile

Profile written

Profile written

After profiling battery is empty and needs charging (which is possible after reconnecting USB power cable, disconnected in the profiling process). At this stage, newly created profile can be selected as a current one

Charging after profiling

Profiling process generates two main files, one json (to be used with PowerUP application) and one inc (for use with nPM SDK):

output files

both of them contain 12 data structures containing parameters for fuel gauging algorithm, and as   have learned they are intentionally left undocumented by the manufacturer.

/*
 * Copyright (c) 2023 Nordic Semiconductor ASA
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

.param_1 = {0.0, 0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.1, 0.105, 0.11, 0.115, 0.12, 0.125, 0.13, 0.135, 0.14, 0.145, 0.15, 0.155, 0.16, 0.165, 0.17, 0.17500000000000002, 0.18, 0.185, 0.19, 0.195, 0.2, 0.20500000000000002, 0.21, 0.215, 0.22, 0.225, 0.23, 0.23500000000000001, 0.24, 0.245, 0.25, 0.255, 0.26, 0.265, 0.27, 0.275, 0.28, 0.28500000000000003, 0.29, 0.295, 0.3, 0.305, 0.31, 0.315, 0.32, 0.325, 0.33, 0.335, 0.34, 0.34500000000000003, 0.35000000000000003, 0.355, 0.36, 0.365, 0.37, 0.375, 0.38, 0.385, 0.39, 0.395, 0.4, 0.405, 0.41000000000000003, 0.41500000000000004, 0.42, 0.425, 0.43, 0.435, 0.44, 0.445, 0.45, 0.455, 0.46, 0.465, 0.47000000000000003, 0.47500000000000003, 0.48, 0.485, 0.49, 0.495, 0.5, 0.505, 0.51, 0.515, 0.52, 0.525, 0.53, 0.535, 0.54, 0.545, 0.55, 0.555, 0.56, 0.5650000000000001, 0.5700000000000001, 0.5750000000000001, 0.58, 0.585, 0.59, 0.595, 0.6, 0.605, 0.61, 0.615, 0.62, 0.625, 0.63, 0.635, 0.64, 0.645, 0.65, 0.655, 0.66, 0.665, 0.67, 0.675, 0.68, 0.685, 0.6900000000000001, 0.6950000000000001, 0.7000000000000001, 0.705, 0.71, 0.715, 0.72, 0.725, 0.73, 0.735, 0.74, 0.745, 0.75, 0.755, 0.76, 0.765, 0.77, 0.775, 0.78, 0.785, 0.79, 0.795, 0.8, 0.805, 0.81, 0.8150000000000001, 0.8200000000000001, 0.8250000000000001, 0.8300000000000001, 0.835, 0.84, 0.845, 0.85, 0.855, 0.86, 0.865, 0.87, 0.875, 0.88, 0.885, 0.89, 0.895, 0.9, 0.905, 0.91, 0.915, 0.92, 0.925, 0.93, 0.935, 0.9400000000000001, 0.9450000000000001, 0.9500000000000001, 0.9550000000000001, 0.96, 0.965, 0.97, 0.975, 0.98, 0.985, 0.99, 0.995, 1.0},
.temps = {22.0},
.param_2 = {2.99, 3.0, 3.0100000000000002, 3.02, 3.0300000000000002, 3.04, 3.0500000000000003, 3.06, 3.0700000000000003, 3.08, 3.0900000000000003, 3.1, 3.1100000000000003, 3.12, 3.1300000000000003, 3.14, 3.1500000000000004, 3.16, 3.1700000000000004, 3.18, 3.1900000000000004, 3.2, 3.2100000000000004, 3.22, 3.2300000000000004, 3.24, 3.25, 3.2600000000000002, 3.2700000000000005, 3.2800000000000002, 3.29, 3.3000000000000003, 3.31, 3.3200000000000003, 3.33, 3.3400000000000003, 3.35, 3.3600000000000003, 3.37, 3.3800000000000003, 3.39, 3.4000000000000004, 3.41, 3.4200000000000004, 3.43, 3.4400000000000004, 3.45, 3.4600000000000004, 3.47, 3.4800000000000004, 3.49, 3.5, 3.5100000000000002, 3.5200000000000005, 3.5300000000000002, 3.54, 3.5500000000000003, 3.5600000000000005, 3.5700000000000003, 3.58, 3.5900000000000003, 3.6, 3.6100000000000003, 3.62, 3.6300000000000003, 3.64, 3.6500000000000004, 3.66, 3.6700000000000004, 3.68, 3.6900000000000004, 3.7, 3.71, 3.72, 3.7300000000000004, 3.74, 3.75, 3.7600000000000002, 3.7700000000000005, 3.7800000000000002, 3.79, 3.8000000000000003, 3.8100000000000005, 3.8200000000000003, 3.83, 3.8400000000000003, 3.85, 3.8600000000000003, 3.87, 3.8800000000000003, 3.89, 3.9000000000000004, 3.91, 3.9200000000000004, 3.93, 3.9400000000000004, 3.95, 3.96, 3.97, 3.9800000000000004, 3.99, 4.0, 4.01, 4.0200000000000005, 4.03, 4.04, 4.050000000000001, 4.0600000000000005, 4.07, 4.08, 4.09, 4.1000000000000005, 4.11, 4.12, 4.130000000000001, 4.140000000000001, 4.15, 4.16, 4.17, 4.18, 4.19, 4.2},
.param_3 = {0.10046154969478571, 0.12078958076647256, 0.1351781216996947, 0.1447033727264946, 0.15044153407891497, 0.15346880598899845, 0.15486138868878768, 0.15569525197197215, 0.15674480262341184, 0.1578897314456722, 0.15886724237101366, 0.15965656971022468, 0.16038281834036383, 0.1611172547549376, 0.16183129064888815, 0.1624933556597257, 0.16311551131881283, 0.16372416977375706, 0.1642996187863873, 0.1647709924752372, 0.16509430632441194, 0.16532717339947461, 0.16554518819756855, 0.16577476034190497, 0.1660082890492854, 0.1662374949556724, 0.1664540986970283, 0.1666509292849206, 0.1668286927455596, 0.1669915061629773, 0.16714350031103065, 0.1672888059635764, 0.16743143035662686, 0.16757486292314347, 0.16772245745211903, 0.16787756773205673, 0.16804354412604727, 0.16822235564168095, 0.1684124800532867, 0.1686118520273498, 0.16881840623035546, 0.16903007285953262, 0.16924450234784283, 0.16945890468343663, 0.16967045115945006, 0.1698763130690194, 0.17007375710234157, 0.1702622530646238, 0.17044347887800848, 0.1706192088620854, 0.17079121733644423, 0.17096116924456686, 0.17112947696737987, 0.17129575368193997, 0.17145959963949003, 0.1716206150912729, 0.1717784224936843, 0.17193278770310783, 0.1720835335535894, 0.17223048302399116, 0.1723734590937938, 0.17251250827249853, 0.17264853380106135, 0.17278264414385075, 0.1729159477652352, 0.17304955152919282, 0.17318415302385232, 0.17331949965688948, 0.1734552043280212, 0.17359087993696423, 0.17372614567251424, 0.17386093969588814, 0.1739956636479779, 0.174130755631149, 0.17426665374776765, 0.17440375161389762, 0.17454154737920363, 0.17467870941155714, 0.174813874753355, 0.17494568044699355, 0.17507290738043949, 0.17519581626490555, 0.1753155384751265, 0.17543321654817917, 0.17554999302114016, 0.17566695717814623, 0.175784885099696, 0.17590443873839587, 0.17602627988150987, 0.1761510702521096, 0.1762786302215647, 0.17640583262505455, 0.1765289051893281, 0.17664407564113394, 0.1767475891625348, 0.17683874019990464, 0.17692333150973943, 0.1770080024880369, 0.17709939253079476, 0.1772040063705432, 0.17732270129692798, 0.17744875045415148, 0.17757489439509905, 0.17769387367265585, 0.17779884154568426, 0.1778902479872523, 0.1779747951871072, 0.17805938757731313, 0.17815092958993467, 0.17825555841698493, 0.1783722913938879, 0.17849628368484782, 0.1786226521910125, 0.1787465138135298, 0.17886370930053527, 0.1789739630246897, 0.17907829627906055, 0.17917773126478273, 0.17927329016743707, 0.17936594829239697, 0.17945653072873305, 0.179545832540114, 0.17963464879020846, 0.17972377173250262, 0.1798136403793007, 0.17990400047412333, 0.17999451709109068, 0.1800848553043226, 0.18017469088231736, 0.18026407448996865, 0.18035352140062316, 0.18044357578370915, 0.18053478180865498, 0.18062760226357452, 0.18072122974181334, 0.18081385147764983, 0.18090362720065734, 0.18098871664040914, 0.18106763108714063, 0.18114183156323224, 0.18121425243201802, 0.18128783893992947, 0.18136553633339803, 0.18144959552068374, 0.18153886014593063, 0.1816311303977876, 0.18172420619578483, 0.18181588823856928, 0.18190491168876816, 0.18199275788761834, 0.18208141008872647, 0.1821728515456992, 0.18226906558167802, 0.1823720421412347, 0.18248378316244623, 0.18260629184769764, 0.18274157139937405, 0.18289150394009077, 0.18305435005681286, 0.18322421216655363, 0.18339496363691468, 0.1835604778354975, 0.18371492789507907, 0.18385665700658962, 0.18398706448766944, 0.18410761986758678, 0.18421979267561056, 0.18432505244100905, 0.18442486869305103, 0.18452071096100497, 0.18461404877413945, 0.18470635166172322, 0.18479889895823742, 0.1848921245358454, 0.18498622742566, 0.18508140664959416, 0.1851778612295609, 0.1852757901874731, 0.18537539254524368, 0.18547686732478574, 0.1855804135480122, 0.1856862348472635, 0.18579486260971675, 0.18590736805096772, 0.1860248727510102, 0.18614849828983804, 0.1862793662474449, 0.18641859820382475, 0.18656731573897123, 0.18672664043287826, 0.18689769386553964, 0.18708159761694915, 0.18727947326710062, 0.18749244239598786, 0.1877216265836047, 0.18796814740994486, 0.1882331264550023, 0.1885176852987707, 0.18882294552124385, 0.18915002870241576, 0.18950005642228002},
.param_4 = {0.004566434077035714, 0.005490435489385116, 0.0061444600772588495, 0.006577426033022482, 0.006838251549041589, 0.006975854817681747, 0.007039154031308531, 0.007077056907816915, 0.007124763755609629, 0.007176805974803281, 0.00722123828959153, 0.007257116805010212, 0.007290128106380173, 0.00732351157976989, 0.007355967756767643, 0.007386061620896622, 0.0074143414235824006, 0.0074420077169889565, 0.007468164490290332, 0.007489590567056235, 0.007504286651109633, 0.007514871518157937, 0.007524781281707662, 0.0075352163791774975, 0.007545831320422063, 0.00755624977071238, 0.007566095395319467, 0.007575042240223663, 0.007583122397525436, 0.007590523007408059, 0.007597431832319574, 0.007604036634708018, 0.007610519561664857, 0.007617039223779248, 0.00762374806600541, 0.007630798533275305, 0.007638342914820331, 0.007646470710985497, 0.00765511272969485, 0.007664175092152263, 0.007673563919561611, 0.007683185129978755, 0.007692931924901946, 0.007702677485610755, 0.007712293234520457, 0.007721650594046336, 0.007730625322833707, 0.007739193321119264, 0.007747430858091295, 0.007755418584640244, 0.0077632371516565555, 0.007770962238389402, 0.007778612589426357, 0.007786170621906361, 0.007793618165431364, 0.007800937049603314, 0.007808110113349286, 0.007815126713777628, 0.007821978797890428, 0.007828658319272324, 0.00783515723153608, 0.007841477648749933, 0.00784766062732097, 0.007853756551993215, 0.00785981580751069, 0.0078658887058724, 0.00787200695562965, 0.007878159075313158, 0.00788432746945551, 0.007890494542589282, 0.007896642985114282, 0.007902769986176734, 0.007908893802180812, 0.007915034346870409, 0.007921211533989437, 0.007927443255177165, 0.007933706699054709, 0.00793994133688896, 0.007946085216061589, 0.007952076383954251, 0.007957859426383612, 0.007963446193859343, 0.007968888112505748, 0.007974237115826325, 0.007979545137324552, 0.007984861689915737, 0.007990222049986182, 0.00799565630629072, 0.00800119454006863, 0.008006866829641345, 0.008012665010071121, 0.008018446937502479, 0.008024041144969457, 0.008029276165506088, 0.008033981325569763, 0.00803812455454112, 0.008041969614079065, 0.008045818294910767, 0.008049972387763399, 0.008054727562297418, 0.008060122786223999, 0.008065852293370522, 0.008071586108868137, 0.008076994257847993, 0.008081765524803828, 0.008085920363056923, 0.008089763417595782, 0.008093608526241506, 0.008097769526815212, 0.008102525382590223, 0.008107831426994904, 0.008113467440220354, 0.008119211463227841, 0.008124841536978627, 0.008130168604569785, 0.008135180137485896, 0.008139922558139116, 0.008144442330217397, 0.008148785916701684, 0.008152997649654407, 0.008157115033124229, 0.008161174206368818, 0.008165211308645838, 0.00816926235147739, 0.008173347289968214, 0.008177454567005606, 0.00818156895868594, 0.008185675241105573, 0.00818975867646897, 0.008193821567725846, 0.008197887336391962, 0.008201980717441324, 0.008206126445847953, 0.008210345557435206, 0.008214601351900606, 0.008218811430802265, 0.008222892145484424, 0.008226759847291324, 0.0082303468675973, 0.008233719616510557, 0.008237011474182637, 0.00824035631545134, 0.008243888015154455, 0.008247708887303806, 0.008251766370269573, 0.008255960472626708, 0.008260191190717492, 0.008264358556298604, 0.008268405076762188, 0.008272398085800834, 0.008276427731305748, 0.008280584161168145, 0.00828495752643991, 0.008289638279147032, 0.008294717416474829, 0.008300285993077165, 0.008306435063607912, 0.008313250179095033, 0.008320652275309674, 0.008328373280297893, 0.008336134710768849, 0.008343658083431705, 0.008350678540685412, 0.0083571207730268, 0.008363048385803155, 0.0083685281757994, 0.008373626939800479, 0.00837841147459132, 0.008382948576956864, 0.008387305043682044, 0.008391547671551793, 0.008395743257351054, 0.008399949952647156, 0.008404187478902063, 0.008408464882984546, 0.008412791211345189, 0.008417175510434586, 0.008421626826703322, 0.008426154206601985, 0.008430766696581169, 0.008435473343091462, 0.00844028340214834, 0.008445221027714398, 0.008450334911407623, 0.008455676034136828, 0.00846129537681082, 0.008467243920338404, 0.008473572645628397, 0.0084803325335896, 0.008487574565130829, 0.008495349721160892, 0.008503708982588596, 0.008512703330322755, 0.008522383745272175, 0.008532801208345667, 0.008544006700452038, 0.008556051202500104, 0.008568985695398667, 0.008582861160056538, 0.008597728577382533, 0.008613638928285455},
.param_5 = {0.18480028246988037, 0.15780260002231355, 0.10869905436373663, 0.06937914717827395, 0.039842878465926476, 0.020090248226694186, 0.010120209013516832, 0.008560972430109778, 0.009974906698636578, 0.009647453398190127, 0.008031083020693108, 0.006888981678864273, 0.006639477475967742, 0.006583965038747027, 0.006255004112673199, 0.005837366681475751, 0.00559460960923349, 0.005382306670793143, 0.004758285006727873, 0.0036122160819300995, 0.0025280951101701657, 0.0020494630598028897, 0.00203448610195606, 0.0021050038714401365, 0.0021033391534882803, 0.0020264074897404123, 0.0018792469511282398, 0.0017027002205968235, 0.001548076718439588, 0.0014309434794138737, 0.0013513627299959093, 0.0013087729345282254, 0.0013002589071229968, 0.0013228504340553372, 0.0013759309496057595, 0.0014594848814920847, 0.001567217771019161, 0.0016769814874519236, 0.0017704381166766016, 0.001845118986676126, 0.00190100378264918, 0.0019368005340334588, 0.0019492355632000705, 0.0019361309618511242, 0.0018973108435580213, 0.0018332088313250186, 0.0017542727072928505, 0.001680553525758733, 0.001622526352098013, 0.0015806293565260796, 0.0015543653749157914, 0.0015375437769801943, 0.0015208383516958704, 0.001500557600500694, 0.0014766427696952765, 0.0014491947917921397, 0.0014189664174314026, 0.0013868684541141867, 0.0013531605494696702, 0.0013178433645653215, 0.001281932947760911, 0.001250339578488975, 0.00122789032432815, 0.0012155180189718853, 0.0012132153879185203, 0.0012191148118959744, 0.001227036944075749, 0.0012320513825860024, 0.0012335467276124515, 0.0012315515658773216, 0.001227544358745232, 0.0012250817066529127, 0.0012264360693674259, 0.0012317731808625387, 0.0012408908306756408, 0.0012495165065271735, 0.0012498081711794992, 0.0012378517006880405, 0.0012135047065290824, 0.0011774210322022804, 0.0011369809905091566, 0.001102868612213627, 0.0010790921966982031, 0.0010657024818803984, 0.001062457408941217, 0.0010676912661629692, 0.0010794616374983773, 0.00109724900824483, 0.0011210523350624335, 0.0011470470002491323, 0.0011580107861133837, 0.0011376134898335999, 0.0010829228003609442, 0.0009940180600305493, 0.0008848389035032156, 0.0007988288509301958, 0.0007693740369647123, 0.0008002773684333622, 0.0008909267386650668, 0.0010150398460600021, 0.001112473107310434, 0.0011463322644138588, 0.001114196447747108, 0.0010179415935691188, 0.0008926105208929488, 0.000799789279195412, 0.0007688163184582653, 0.0008006109219430013, 0.000891685634871707, 0.001006190017969165, 0.0010942057630131466, 0.001138003623293686, 0.0011374096758273028, 0.0010957141341944032, 0.0010338600507269272, 0.0009753953569330634, 0.0009262192731500363, 0.0008863358562568105, 0.0008555319437010198, 0.0008329116422544844, 0.0008176556714411046, 0.0008096275521609839, 0.0008088145108572573, 0.0008135981322375183, 0.0008192215528215682, 0.0008221668717726255, 0.0008220674099966574, 0.0008189717783029654, 0.0008146326620273037, 0.0008128659922992595, 0.00081591497154785, 0.0008239109455991309, 0.0008364839993882031, 0.0008474906052652678, 0.0008465873367058396, 0.000829079358381779, 0.0007948416489059196, 0.0007454722112876927, 0.0006959769219232539, 0.0006664606585335756, 0.0006636698940782823, 0.0006876540971818834, 0.0007352571852466822, 0.0007878355115117225, 0.0008251585322902044, 0.0008424820447919604, 0.000839808367189554, 0.0008213886044695917, 0.0008039529502229872, 0.0008022654543559868, 0.0008186075367311654, 0.0008529795134161813, 0.0009054117978886736, 0.0009759890034918839, 0.0010647713930132807, 0.0011717647133082862, 0.00129641860178685, 0.001421721170176242, 0.001512310120285916, 0.0015482435459174618, 0.0015284803133812017, 0.0014543829916563097, 0.0013462689595095112, 0.001236984511774307, 0.0011407402772599731, 0.001057855399732438, 0.0009883298791920486, 0.000932163715638458, 0.0008893569090723599, 0.0008599094594928872, 0.0008438213669010805, 0.0008402281095363368, 0.0008444221551008255, 0.0008514930337389856, 0.0008603732443126372, 0.0008710627450040156, 0.0008835615358132945, 0.0008978696167399533, 0.000913986987784686, 0.0009319136489476659, 0.000951670556717174, 0.0009747684622935654, 0.0010051509259282818, 0.0010455006422429788, 0.001096046540319598, 0.0011567886201576186, 0.0012277268817577347, 0.0013088613251195994, 0.0014001919502432125, 0.0015017187571292681, 0.0016134417457767253, 0.001735360916186278, 0.001867476268357926, 0.002009787802291149, 0.0021622955179862943, 0.0023249994154437084, 0.002497899494662871, 0.0026809957556434352, 0.0028742881983866153, 0.0030777768228917174, 0.0031820701805844454},
.param_6 = {4.065606214337369, 3.471657200490899, 2.3913791960022053, 1.526341237922027, 0.8765433262503841, 0.4419854609872709, 0.2226445982973696, 0.18834139346241563, 0.21944794737000506, 0.21224397476018175, 0.17668382645524838, 0.15155759693501747, 0.14606850447129172, 0.14484723085243234, 0.13761009047880968, 0.1284220669924674, 0.12308141140313644, 0.1184107467574469, 0.10468227014801268, 0.0794687538024641, 0.055618092423742604, 0.045088187315661665, 0.04475869424303558, 0.04631008517168578, 0.04627346137674182, 0.04458096477428786, 0.041343432924820234, 0.037459404853129596, 0.03405768780567198, 0.031480756547105915, 0.02972998005990879, 0.028793004559621305, 0.028605695956707144, 0.0291027095492169, 0.03027048089132567, 0.032108667392824475, 0.034478790962422234, 0.03689359272394388, 0.038949638566884714, 0.040592617706874945, 0.04182208321828196, 0.042609611748736786, 0.0428831823904019, 0.04259488116072352, 0.041740838558276816, 0.040330594289150756, 0.03859399956044063, 0.03697217756669091, 0.03569557974615889, 0.03477384584357479, 0.03419603824814654, 0.03382596309356445, 0.03345844373731088, 0.03301226721101613, 0.03248614093329383, 0.031882285419426726, 0.03121726118349155, 0.030511105990510545, 0.02976953208833344, 0.028992554020440542, 0.028202524850737265, 0.027507470726753636, 0.02701358713522173, 0.0267413964173846, 0.026690738534207448, 0.02682052586171213, 0.02699481276966509, 0.02710513041688789, 0.027138028007475667, 0.027094134449304197, 0.027005975892391287, 0.02695179754636512, 0.026981593526084757, 0.027099009978975852, 0.027299598274863057, 0.02748936314359851, 0.02749577976595141, 0.027232737415136543, 0.026697103543640854, 0.025903262708448782, 0.025013581791200057, 0.02426310946870014, 0.02374002832736255, 0.023445454601367377, 0.02337406299670608, 0.023489207855584282, 0.023748156024963607, 0.024139478181386953, 0.024663151371373537, 0.025235034005482992, 0.02547623729449444, 0.025027496776339198, 0.02382430160793869, 0.021868397320670696, 0.019466455877070743, 0.017574234720463267, 0.016926228813224364, 0.017606102105532928, 0.019600388250631817, 0.022330876613321782, 0.024474408360827815, 0.025219309817106628, 0.024512321850436725, 0.02239471505852131, 0.019637431459645915, 0.0175953641422949, 0.016913959006081836, 0.01761344028274603, 0.019617083967179982, 0.022136180395324057, 0.024072526786289572, 0.025036079712459358, 0.025023012868197192, 0.02410571095227687, 0.022744921115991357, 0.02145869785252774, 0.020376824009302186, 0.019499388837651566, 0.018821702761423476, 0.01832405612959831, 0.01798842477170326, 0.017811806147541298, 0.017793919238862088, 0.017899158909223667, 0.01802287416207138, 0.018087671178998455, 0.01808548301992785, 0.01801737912266732, 0.017921918564603456, 0.017883051830580587, 0.017950129374050272, 0.01812604080318192, 0.018402647986537346, 0.01864479331583624, 0.018624921407531247, 0.01823974588439914, 0.01748651627593023, 0.016400388648329933, 0.015311492282310546, 0.01466213448773901, 0.014600737669723252, 0.015128390138000047, 0.016175658075426314, 0.017332381253259976, 0.018153487710387273, 0.0185346049854207, 0.018475784078167412, 0.018070549298332406, 0.017686964904906066, 0.017649839995831362, 0.018009365808085986, 0.01876554929515495, 0.01991905955354978, 0.021471758076821446, 0.023424970646293564, 0.02577882369278195, 0.028521209239312784, 0.03127786574388114, 0.033270822646286335, 0.03406135801018173, 0.03362656689438748, 0.03199642581643847, 0.029617917109212022, 0.027213659259037182, 0.025096286099715592, 0.02327281879411225, 0.02174325734222715, 0.020507601744046422, 0.019565851999592265, 0.018918008108842477, 0.018564070071824812, 0.018485018409797327, 0.018577287412216426, 0.018732846742258724, 0.018928211374877324, 0.01916338039008869, 0.019438353787892826, 0.019753131568278626, 0.02010771373126552, 0.020502100276850732, 0.02093675224777436, 0.021444906170456357, 0.02211332037042324, 0.023001014129345188, 0.024113023887031848, 0.025449349643469343, 0.02700999139867155, 0.02879494915263292, 0.030804222905350676, 0.03303781265684147, 0.03549571840708865, 0.03817794015609777, 0.0410844779038716, 0.04421533165040736, 0.047570501395699516, 0.05114998713975916, 0.05495378888258351, 0.05898190662415592, 0.06323434036450692, 0.06771109010361709, 0.07000554397285086},
.param_7 = {0.0004643408424046534, 0.0004751416308327458, 0.00048594241926083867, 0.000496743207688931, 0.0005075439961170238, 0.0005183447845451161, 0.0005291455729732089, 0.0005399463614013013, 0.000550747149829394, 0.0005615479382574866, 0.0005723487266855794, 0.0005831495151136717, 0.0005939503035417645, 0.0006047510919698569, 0.0006155518803979496, 0.000626352668826042, 0.0006371534572541348, 0.0006479542456822271, 0.00065875503411032, 0.0006695558225384124, 0.0006803566109665053, 0.0006982489367490469, 0.0007161780633013259, 0.000734107189853604, 0.0007520363164058826, 0.0007699654429581608, 0.0007878945695104388, 0.0008058236960627177, 0.0008237528226149963, 0.0008416819491672744, 0.0008596110757195525, 0.0008775402022718311, 0.0008954693288241094, 0.000918934334555488, 0.000952918801138174, 0.0009869032677208617, 0.001020887734303548, 0.0010548722008862353, 0.0010888566674689215, 0.0011228411340516089, 0.0011835953272356942, 0.0012574726065387558, 0.0013313498858418145, 0.0014349784400910994, 0.0015583562445101178, 0.001662395011578475, 0.001760418123587231, 0.0018547751334646956, 0.001944632440805275, 0.002034489748145858, 0.0021385812613209723, 0.002243828392987555, 0.002368394914812586, 0.002499071774266008, 0.0026407315541202227, 0.0027817141600768834, 0.002921794661293105, 0.0030651156981412755, 0.0032118626802490747, 0.0033672556090111492, 0.003530383798623422, 0.0036972277587161324, 0.003866866487824527, 0.004045649001664781, 0.004255774484223956, 0.004554681033067253, 0.005011249717572902, 0.005455499279130866, 0.0059201004495214975, 0.006488623761063441, 0.007178241553464816, 0.007875976649990993, 0.008470848444052641, 0.008988562412108847, 0.009474340947310861, 0.009956902616283375, 0.010468287282135467, 0.011032726962809575, 0.011633229268902968, 0.012253504794916938, 0.012905411160484824, 0.01360455913984547, 0.014360285966215212, 0.015126921525965948, 0.01588606975271595, 0.016648177256862243, 0.017398545870358596, 0.018181007367933, 0.01904455198149231, 0.019909843569651798, 0.02072721850465652, 0.021729988697693395, 0.02274900905836049, 0.02362631545890037, 0.024745902743176548, 0.02558333668439513, 0.026530440521944865, 0.027655335915146538, 0.02879814575161814, 0.02994132246897766, 0.031074964507359557, 0.03241600066290961, 0.03354661739802123, 0.034653618786602704, 0.03547606666914474, 0.036106379017884195, 0.036736999654563625, 0.03753859406332894, 0.038567777785243396, 0.039668699449238155, 0.04070505990011609, 0.04164415277573723, 0.042434319107885025, 0.04307807113107077, 0.043611070029777384, 0.044066414274872644, 0.04446500287790962, 0.04481663563795654, 0.04513700802267784, 0.045360824742268054, 0.045360824742268054, 0.045360824742268054},
.param_8 = {2.1106401927484246e-05, 2.15973468560339e-05, 2.2088291784583575e-05, 2.2579236713133224e-05, 2.3070181641682897e-05, 2.3561126570232546e-05, 2.4052071498782222e-05, 2.4543016427331875e-05, 2.5033961355881545e-05, 2.5524906284431204e-05, 2.601585121298088e-05, 2.650679614153053e-05, 2.6997741070080202e-05, 2.7488685998629858e-05, 2.7979630927179528e-05, 2.847057585572918e-05, 2.8961520784278856e-05, 2.9452465712828506e-05, 2.994341064137818e-05, 3.0434355569927834e-05, 3.092530049847751e-05, 3.173858803404758e-05, 3.255354833187845e-05, 3.336850862970927e-05, 3.418346892754012e-05, 3.499842922537094e-05, 3.5813389523201763e-05, 3.662834982103262e-05, 3.7443310118863464e-05, 3.825827041669429e-05, 3.907323071452511e-05, 3.988819101235596e-05, 4.0703151310186785e-05, 4.1769742479794904e-05, 4.331449096082609e-05, 4.4859239441857345e-05, 4.640398792288853e-05, 4.794873640391978e-05, 4.949348488495097e-05, 5.103823336598222e-05, 5.379978760162246e-05, 5.715784575176162e-05, 6.0515903901900654e-05, 6.52262927314136e-05, 7.083437475045989e-05, 7.55634096172034e-05, 8.00190056176014e-05, 8.430796061203162e-05, 8.839238367296704e-05, 9.247680673390264e-05, 9.720823915095328e-05, 0.0001019921996812525, 0.000107654314309663, 0.00011359417155754581, 0.00012003325246001011, 0.0001264415527307674, 0.00013280884824059568, 0.00013932344082460342, 0.00014599375819313975, 0.0001530570731368704, 0.00016047199084651917, 0.00016805580721436966, 0.0001757666585374785, 0.00018389313643930825, 0.00019344429473745257, 0.0002070309560485115, 0.00022778407807149553, 0.0002479772399604939, 0.00026909547497824983, 0.0002949374436847018, 0.0003262837069756734, 0.0003579989386359542, 0.0003850385656387564, 0.0004085710187322203, 0.0004306518612414028, 0.0004525864825583352, 0.0004758312400970667, 0.000501487589218617, 0.0005287831485864985, 0.0005569774906780425, 0.0005866095982038556, 0.0006183890518111577, 0.0006527402711916005, 0.0006875873420893612, 0.0007220940796689068, 0.0007567353298573747, 0.0007908429941072088, 0.0008264094258151363, 0.000865661453704196, 0.0009049928895296272, 0.0009421462956662053, 0.0009877267589860634, 0.0010340458662891133, 0.0010739234299500166, 0.0011248137610534792, 0.0011628789401997785, 0.0012059291146338574, 0.0012570607234157515, 0.0013090066250735517, 0.0013609692031353482, 0.0014124983866981617, 0.0014734545755868004, 0.0015248462453646013, 0.0015751644903001228, 0.0016125484849611243, 0.0016411990462674633, 0.001669863620661983, 0.0017062997301513156, 0.0017530808084201541, 0.001803122702238098, 0.0018502299954598219, 0.001892916035260783, 0.0019288326867220465, 0.0019580941423213982, 0.0019823213649898808, 0.0020030188306760293, 0.0020211364944504374, 0.0020371198017252973, 0.0020516821828489924, 0.0020618556701030933, 0.0020618556701030933, 0.0020618556701030933},
.param_9 = {0.7305813870697574},
.param_10 = {160.81299196643764, 0.5229135523419954},
.param_11 = {0.5714742853756033, 0.0035815434921769133},
.param_12 = {0.41477565277722667},
.name = {'b', '1', '8', '2', '5', '0'},

In addition, several CSV files are created under profile_1 directory, some of them containing measurements from the profiling process. For example, file b18250_600mAh_Tp25.csv contains data like this:

Seconds	Current(A)	Voltage(V)	Temperature(C)
1	-0.000025	4.179207	24.176
[...]
7	-0.000025	4.179207	24.072999
8	0	4.179199	24.072999
9	-0.000025	4.179207	24.072999
[...]
340	-0.120025	4.074407	24.072999
341	-0.120025	4.074407	24.072999
[...]
90151	-0.059825	3.097947	21.834999
90152	-0.059825	3.096347	21.834999

As can be seen, profiling process discharges the battery using current of different values and even some intervals with no current draw (which may be connected with the intent to measure Open Circuit Voltage when the battery is "at rest").

Results verification 

Profiling process was repeated twice for the same battery (used, low cost, of unknown current parameters) with the following results:

  • first run estimated the current capacity at 415 mAh,
  • second run estimated value at 461 mAh

The source of differences is currently unknown (may be some uncaught operator error, regeneration of long unused battery during the first full charge/discharge cycle or maybe some incompatibility of the algorithm with the partially degraded cell).

 Now the question arises - how to test newly generated model? One of the advertised advantages of the fuel gauging algorithm is the possibility to precisely estimate the charge level, especially for the battery in the middle of the discharging curve (when OCV method would be unreliable) and without the need of measuring all the charge drawn from the battery (using Coulomb Counter approach).

To do this test, we have discharged the battery to about 60% charge level first by enabling BUCK1 regulator, configured to output 1.8 V and with 47 Ω resistor connected. As the output is powered from USB first, and from the battery only when USB power is not present, USB power cable was disconnected.

discharge to 60 pct

What is interesting here is a current plot - despite being loaded with a fixed resistor, current fluctuates in the range of about 10 - 30 mA, which means that instantaneous current measurements at the battery side loaded with switched regulator are presented.

After the battery was discharged to about 60%, main test was executed: five times evaluation kit was powered down by disconnecting the USB cable from controller port (and closing the PowerUP application), which seems sufficient to clear any internal state from the Evaluation Kit, as the fuel gauge algorithm (with high probability) runs on the controller SOC, which is powered by the PC USB connection. 

Results are as below and seem repeatable:

fuel gauge test

 

Summary

Given the difficulties of obtaining reliable li-ion battery charge estimation - especially in the middle of discharge curve and in energy-efficient manner, fuel gauging method provided by the Nordic Semiconductor seems to provide repeatable results. 

Somewhat unfortunate is the fact that it is restricted to their nRF SOCs (running the algorithm) and PMICs (providing measurements), but for new projects seeking a great level of power efficiency it is a very interesting proposition, especially when end-user can profile new batteries in-house, without the need of getting support from the manufacturer.

Minor annoyances were identified in the PowerUP GUI application - namely, blinking when refreshing data (which seems connected with the performance of the machine running the application - the slower the machine, the more blinking encountered) and occasional (once every several days) disconnections with the Evaluation Kit, resulting in graph data loss,  but those are of low significance.

Generating models was easy (if somewhat time-consuming) so in summary this is a very interesting solution for somebody already using an nRF technology or planning to build a power-efficient solution without restraints on the technology used.

Anonymous

Top Comments

  • Hi  

    In reference to your summary comment "Somewhat unfortunate is the fact that it is restricted to their nRF SOCs". Please see my earlier comment on this topic in another road test below.

    We support running our fuel gauge algorithm on non-Nordic SoCs. It's correct that we don't share detailed information about the battery model and the fuel gauge algorithm, as this is to protect this valuable IP. However this information isn't needed to implement fuel gauge on non-Nordic SoCs.

    A good starting point is our fuel gauge sample: nPM1300: Fuel gauge. So far we have support for any M4 and M33 based devices, but more will be added based on customer feedback.

    We also have a user guide describing the essentials for the nPM1300 fuel gauge: Using the nPM1300 Fuel Gauge

    I hope this helps.

    Best Regards,
    Eirik Slettahjell
    Technical Product Manager - PMICs Nordic Semiconductor