JK BMS SOC Stuck at 99%: Why It Never Reaches 100% and the Fix
Your pack charges all day, the cells look full, and the JK BMS still shows 99%. It never ticks over to 100%, or it does so only on some days. In most cases nothing is wrong with the cells. The BMS holds the last percent on purpose and waits for the end of a complete charge, and something in the charging setup stops that end from ever arriving.
Why the JK BMS holds SOC at 99%
The JK BMS counts amp-hours in and out of the pack (coulomb counting). On the inverter-style JK BMS (the PB series and similar models on V15 and V19 firmware) the counter is not allowed to show 100% just because it counted enough amp-hours. It stops at 99% and only jumps to 100% when the charge has really finished.
There is a good reason for that. Many inverters stop charging as soon as the battery reports 100%. If the BMS showed 100% from the counter alone, a pack with a drifted counter would stop charging early, the cells would never get a full absorption phase, and the balancer would never get its time at the top.
So the BMS waits for three things, in this order:
- The pack voltage reaches the Cell RCV (request charge voltage) multiplied by the number of cells.
- It holds that voltage for the full RCV time, the absorption phase.
- When the RCV time ends, the cells are still at or above the SOC-100% voltage.
Only then does the BMS reset the counter to 100% and, with float mode on, move on to the float voltage. If any of the three is missed, the next charge starts again from 99% and the reset never happens.
Older and smaller JK models without an RCV timer behave more simply: they reset to 100% as soon as a cell reaches the SOC-100% voltage. The JK BMS SOC calibration guide covers that case and the general drift problem.
Common causes of SOC stuck at 99%
The charger target is below RCV. If the inverter or charger absorbs at 55.2 V and the BMS expects 16 × 3.50 V = 56.0 V, the pack never reaches RCV and the timer never starts. This is the most frequent cause with chargers that are set by hand.
Voltage drop or a different meter. Even with matching settings, the cables, the fuse and the shunt drop a little voltage under current, and the inverter's meter can read 0.1 to 0.2 V higher than the BMS. With a closed-loop CAN or RS485 link (Deye, Victron, Growatt and others) the inverter believes it already delivers the requested voltage while the BMS sees less.
The RCV time does not fit the day. With a long RCV time, solar power fades before the timer finishes, so the reset only happens on sunny days. A charger that switches to float or stops on its own timer before the BMS timer ends has the same effect.
The SOC-100% voltage is too close to RCV. When absorption ends the current falls and the cell voltage relaxes a little. If the SOC-100% voltage sits right under RCV, the cells can drop below it at the exact moment the BMS checks.
One high cell stops the charge. If the pack is unbalanced, the highest cell reaches Cell OVP while the average is still below RCV. The BMS turns off charging, the pack never reaches RCV, and the log shows overcharge protection instead of a full charge. See why cell overcharge protection keeps tripping and JK BMS balance settings.
The battery capacity is set too low. The counter then reaches 99% hours before the pack is full and sits there for the rest of the charge. It looks like a stuck SOC even when everything else is right.
How to fix it, step by step
- Compare voltages. Multiply the Cell RCV by the number of cells and compare it with the charger or inverter absorption voltage. Set the charger 0.1 to 0.2 V above that figure to cover cable losses, but keep it below Cell OVP multiplied by the cell count.
- Check the chain. The firmware requires Cell OVP recovery < SOC-100% voltage < Cell RCV < Cell OVP, strictly. For LFP the ready presets use RCV 3.55, 3.50 and 3.45 V with SOC-100% voltage 3.50, 3.45 and 3.41 V (hard, medium, gentle). A gap of about 0.05 V between them is what makes the reset reliable. See ready presets.
- Set a realistic RCV time. The editor recommends 0.5 to 5 hours, with 1 hour as a sensible default for daily solar cycling. Long timers only help a pack that badly needs balancing.
- Fix the balance first. If one cell runs away at the top, the voltages above cannot work. Let the balancer start a little below RCV, as described in the LiFePO4 settings guide.
- Confirm the capacity. Enter the real pack capacity in Ah, cell capacity multiplied by the number of parallel strings.
- Run one full charge and watch it. The pack should reach RCV, hold it, and switch to 100% when the RCV time ends.
Check it in JK Preset Studio
Connect your BMS over Bluetooth or open your .jkcfg file in the editor. It checks the whole chain from OVP recovery to RCV before anything is written and flags an RCV time or SOC-100% voltage outside the recommended range. The RCV time itself is still a file-only setting in the editor: change it through a .jkcfg import or in the JK app. The parameter reference explains every field.
If the pack keeps stopping short of RCV, load the Detail Log on the log analysis page. Overcharge protection trips near the top of the charge point at a high cell rather than at the SOC settings.
FAQ
Is a SOC stuck at 99% harmful?
Not by itself. It only means the counter has not been recalibrated. Over weeks the error grows, and the SOC shown at the bottom of the discharge becomes less reliable, so it is worth fixing.
Why does it reach 100% on some days but not others?
The RCV time finishes only on days with enough sun to hold RCV for the whole timer. A shorter RCV time or a slightly higher charger voltage usually makes it consistent.
Should I lower OVP to force a reset?
No. That only moves the protection closer to normal charging and causes trips. Fix the charger voltage, the RCV time and the SOC-100% voltage instead.
Related guides
- JK BMS SOC Calibration: Fix SOC Drift, Jumps and ResetJK BMS SOC calibration explained: why SOC drifts or jumps, what the SOC-100% voltage and SOC-0% voltage do, and how to set them and recalibrate the pack.
- JK BMS Settings for LiFePO4: 8S and 16S, 280Ah and 314AhJK BMS settings for LiFePO4 packs: per-cell voltage, balance, current and temperature values for 8S and 16S with 280Ah and 314Ah cells, in three wear levels.
- JK BMS Cell Over Charge Protection Keeps Tripping: Causes and FixJK BMS cell over charge protection tripping and releasing every minute? See why a charger set too high causes it, how to tell it from a weak cell, and how to fix it.