haotianblog
HPPC Pulse Resistance Analyser
Search
Ask the AI

HPPC Pulse Resistance Analyser

Turn exported HPPC time-current-voltage data into direct-current internal resistance R0, the RC pair (R1, tau) and the full R(t) curve. These are the numbers a BMS uses for power limits and the ones an equivalent circuit model is built from.

Nothing is uploaded. Parsing, pulse detection, fitting and plotting all happen in your own browser; this tool makes no network requests.

Why this does not print a single DCIR number

R0 is defined as dV/dI at the instant of the step, and sampled data contains no such instant. The first sample after the step arrives one sampling interval later, by which time the RC pair has already started charging. So the same cell, in the same experiment, gives a different R0 at 10 Hz than at 1 Hz.

That is measurable, not hand-waving. Taking a first-order Thevenin cell with known truth (R0 = 12.500 mOhm, R1 = 8.000 mOhm, tau = 12 s) and changing only the sampling interval:

Sampling intervalFirst measurable pointR0 reportedvs truth
0.01 s (100 Hz)0.01 s12.507 mOhm+0.1%
0.1 s (10 Hz)0.1 s12.566 mOhm+0.5%
0.5 s (2 Hz)0.5 s12.826 mOhm+2.6%
1 s (1 Hz)1 s13.140 mOhm+5.1%
2 s (0.5 Hz)2 s13.728 mOhm+9.8%

So the tool plots R against elapsed time within the pulse and states the sampling interval next to the result. The filled dot at the left end of each curve is the point being called “R0” – and its distance from the vertical axis is precisely the part of the step this measurement cannot see.

The two dashed lines at 1 s and 10 s mark the USABC/IEC conventions. They are conventions, not physics: a reported resistance is not reproducible unless the sampling interval and the read-off time go with it.

“Pulse end minus R0” is not R1

The common shortcut is to subtract R0 from the resistance at the end of the pulse and call the difference R1. That subtraction under-reads systematically, because the pulse never reaches the asymptote:

R(t) = R0 + R1(1 – e-t/tau) has only climbed to R0 + R1 x 0.918 at t = 30 s with tau = 12 s. On the same synthetic data the pulse ends at 19.843 mOhm, and subtracting R0 gives 7.017 mOhm against a true R1 of 8.000 – low by 12%.

Since tau has already been fitted from the relaxation tail, that factor divides back out exactly. Hence the table is split in half:

  • Left, “measured”: division on the data itself, dependent on no model, but carrying the biases described above.
  • Right, “first-order model”: the unfinished fraction divided back out, and R0 extrapolated to t = 0. On the same data it returns R0 = 12.503 and R1 = 8.019, matching the truth – provided the cell really is first-order Thevenin.

The split is not cosmetic. The left-hand numbers can go straight into a report; the right-hand ones distort when a cell has two time constants, or when diffusion contributes visibly at the step.

When tau is withheld

tau comes from fitting the exponential relaxation during the rest after each pulse. If the rest is shorter than tau, the exponential has not run far enough, and what the data supports is “tau is at least this large” rather than a point estimate. In that case the table shows > value instead of a number – because this figure then propagates into C1 and power capability, and a confident wrong number is far more dangerous there than an admission of ignorance.

Input format

  • Three numeric columns: time, current, voltage. Resistance comes out as V/A and is displayed in mOhm.
  • Time is read as seconds by default; the dropdown also offers ms and min. Getting it wrong is immediately visible – the sampling-interval line will read something obviously wrong like 500 or 0.0017.
  • Either current sign convention works: discharge negative or positive, resistance stays positive.
  • Comma, tab and semicolon delimiters are detected automatically. A header row is optional.
  • Pulses are found by a current threshold set at 10% of the maximum, so a 2 A cell and a 200 A module go through the same logic.
  • Comment, unit and step-separator rows in the middle of the file are skipped – any row where a column is not numeric is dropped whole.

Ways it can fail

  • No pulses detected: usually the wrong current column, or an export where current is always zero because the cycler keeps it in another field.
  • More pulses than expected: the file includes CC charge or discharge segments, which are also “contiguous stretches of non-zero current”. Trim to the pulse sequence first.
  • R@10s shows as “-“: the pulse is shorter than 10 s. The tool leaves it blank rather than extrapolating.
  • The whole right half is “-“: tau is not identifiable, so the model extrapolation has no basis and is withheld.
  • R0 much larger than expected: check the sampling interval first. R0 from a 1 Hz record is naturally larger than from 10 Hz, and that is not cell ageing.
  • R(t) is not monotonic: under a first-order RC it must rise monotonically. If it does not, current was not constant during the pulse, or another step crept into the data.

Related reading

Scroll down