Battery capacity telemetry always goes back to 100%

I’m using Pixhawk 4 mini.
Voltage and current Metter set as per mnfct instructions.

The issue that I’m having, is that the battery capacity monitor always resets to 100% even though the voltage has dropped.

I start with a full battery at 25.2V
After 5 mins of flight the system reports normally a voltage drop and capacity drop.

After landing and rebooting, system reports lower voltage as expected, but capacity report shows 100%.
After rebooting, the capacity always shows 100% no matter what the actual voltage is.

It seems there is no capacity Scaling in the firmware to report lower capacity as voltage drops?

Any thoughts on this.

Try setting the battery capacity in MAH in mission planner.

That’s right there isn’t. Battery voltage is not a reliable indication of used/remaining capacity.


I think there is work underway to improve battery monitoring by battery voltage. However doing so is complex and difficult to do with accuracy. The measured battery voltage varies widely depending on load.

I initially had problems with premature battery failsafe triggers due to low battery voltage.

What I did was to greatly reduce the low battery voltage threshold, and configure my system to trigger on mAh consumed. This has allowed me to have much longer flights without over discharging my batteries.

My current low battery threshold voltage is somewhere between 8 and 9 volts, as I typically fly 3S batteries. My copter hovers in the 25-30 amp range.

What I rely on to make sure my hexcopter can safely return is mAh consumed. I try to make sure that I terminate a mission at about 80% of battery capacity consumed, or when 20% still remains.

Using that strategy, I recently made an 18 minute flight with my F550 hexcopter with 2212 motors, 1045 props, and a 10,000 mAh 25C battery.

You need to have your system calibrated properly to make this work. The default calibration for battery current on my system was far from accurate. Your system is likely capable of doing a decent job of monitoring current consumption if properly calibrated. I have thought about making a video of the current measurement calibration procedure that I used.

Best regards. I hope this was helpful.

If capacity is at 100% may be measured current is 0.

Used capacity in mAh is not stored across reboots. So after reboots it’s set back to 0.

Appreciate the comments.

Kind regards.


In my recent experience, capacity consumed in mAh appears to be stored on the FC, and clears on reboots of the FC, not reboots of the GCS.

Just attempting to elaborate on what @Hamstersocke had to say above.

BTW, this is a problem when changing batteries on the fly (subsequent batteries start with lower capacity left), unless I am missing something. Any workaround suggested, other than informing much greater capacity or rebooting FC?

Probably intelligent batteries, that’s how DJI is doing it. There are some smart batteries supported and I even played around some time with my own implementation of the SBS protocol, but I’m not sure if ardupilot can handle a battery change…

As mentioned by @Vabe, smart batteries are one solution.

Why do subsequent batteries start with lower capacity?

Even if this is the case, the problem can be addressed by setting a lower capacity through your GCS.

I am fairly new to this, but I am having good results by setting a fairly low minimum voltage (to allow for voltage drop under load), calibrating my power module’s current measurement, and flying until the battery reaches about 20% capacity remaining.

By “good results” I mean that the mAh needed to recharge is close to the mAh reported as consumed by the flight.

For what it’s worth, you can set BATT_FS_VOLTSRC to calculate failsafes based off of sag compensated voltage.

1 Like

HI All
I recently purchased the SKYDROID MX450. It uses their own ARDUCOPTER FIRMware.

It uses a HV 3 cell battery.

There are additional parameters in their firmware WRT to the battery monitoring. I’ll post a screen shoot of the additional battery parameters.

This new product seems to calculate the remaining capacity based on the voltage detected. It also DOES NOT re-set the capacity on reboot.

So, no matter what the voltage is, is has an algryhtym that calculates an estimate of capacity based on the remaining voltage. The system is set to RTH on low battery voltage.



I think that the problem has not been understood: it is not about remaining capacity estimation, but of resetting remaining capacity after changing a battery on the fly.

Image above corresponds to a .tlog for batteries changed on the fly, as seen by voltage going from 12V to 0V and back to 12V, part of finding the reason for ROI loss with receivers shifting and losing RC3 pulses (hence yaw appearing, which is as should on above image).

As seen, wasted capacity grows and grows: the FC is not aware about the battery change, even voltage goes from 0V to 12V. In the long run it can prevent arming and need FC reset, so I define a very high battery capacity, since I don’t mind much about it.

It is so evident (and has such a simple solution in the FC) that I have always thought I am missing something.

No, I got your point. I didn’t expect Ardupilot to realize that you’ve changed the battery with a normal “dumb” battery. With an intelligent battery I think it could work.

The SBS-protocol has a few parameters concerning the capacity.

  1. The advertised capacity of the battery when it’s full. This value is automatically saved as to the BATT_CAPACITY parameter on the FC. I’m not sure how often this parameter gets updated, but probably only once at startup.
  2. Already used capacity
  3. Remaining capacity

Here is why I say it could work with intelligent batteries:
If Ardupilot only uses the value of remaining capacity it should be fine. Your remaining capacity drops towards zero, you land, swap the battery and the remaining capacity is close to full again and your are good to go.
However if the remaining capacity is calculated inside the flight controller based on the full capacity and the used capacity, you would run into problems, since Ardupilot (to my knowledge) doesn’t realize a battery change (even with smart batteries).

But as a side note: Hot swapping a battery (like on the Inspire 2) is a delicate task which only works because very carefully designed hardware. Because if you just connect the two batteries together they will (try to) level each other out, which could lead to charge rates far beyond the maximum.

No need for intelligent batteries. If FC (not rebooted) sees exhausted battery voltage (such as 9V to 10V), then a low voltage (such as 1V to 3V), and then a charged battery voltage (such as 12V), all like image above, it is clearly an on the fly battery change.

Of coarse it is not done that way. Internally there is circuitry similar to diodes oring voltage, so the highest one is effective. I use a simple power bank through USB.