Battery capacity is not a number you pick from a shelf. It falls out of an energy budget you write down. Motors, compute, sensors and idle time each draw differently, and the pack has to survive the worst case, not the average.
This guide shows how to size a robot battery from measured loads, how to choose the pack configuration and C-rate, and how to test the result before trusting it on a machine that costs more than the battery.
Start with an energy budget, not a voltage
List every load, its current at the voltage it actually sees, and the fraction of time it runs. Convert everything to watts, multiply by hours, and add a margin. The result is watt-hours, which is the only number that compares across voltages.
| Load | Typical draw | Duty cycle | Energy per hour |
|---|---|---|---|
| Drive motors, 4 x 12 V geared | 1.2 A each while moving | 50% | 28.8 Wh |
| Control board and sensors | 0.4 A at 5 V | 100% | 2.0 Wh |
| Lidar or depth camera | 0.35 A at 12 V | 100% | 4.2 Wh |
| Compute (SBC or mini PC) | 10 W | 100% | 10.0 Wh |
| Servos or gripper | 1.5 A at 6 V peaks | 10% | 0.9 Wh |
That robot draws roughly 46 Wh per hour of mixed operation. For a two-hour run with a 30 percent reserve, the usable capacity needs to be about 120 Wh. A 12 V pack at 10 Ah stores 120 Wh, so the nominal target is 10 Ah at 12 V, before derating for cold, age and converter losses.
The arithmetic, in code
Write the budget as a script so it can be revised when a component changes. Guessing in a spreadsheet works until someone swaps the compute module.
loads = [
# name, volts, amps, duty 0-1
("drive", 12.0, 4.8, 0.5),
("control", 5.0, 0.4, 1.0),
("lidar", 12.0, 0.35, 1.0),
("compute", 12.0, 0.83, 1.0),
("servo", 6.0, 1.5, 0.1),
]
wh_per_hour = sum(v * a * d for _, v, a, d in loads)
run_hours = 2.0
reserve = 0.30
efficiency = 0.85 # converter and wiring losses
usable_wh = wh_per_hour * run_hours / efficiency
pack_wh = usable_wh / (1 - reserve)
print(round(wh_per_hour, 1), "Wh per hour")
print(round(pack_wh, 1), "Wh required")
pack_voltage = 12.0
print(round(pack_wh / pack_voltage, 2), "Ah at", pack_voltage, "V")Two details matter. The converter efficiency applies to loads that run through a regulator, so a 5 V rail pulling 2 W actually costs about 2.4 W from a 12 V pack. And the reserve is not optional: lithium packs age, and a pack that runs to cutoff every cycle will not last a year.
C-rate decides whether the pack can deliver
Capacity tells you how long. C-rate tells you whether the pack can supply the current at all. A 10 Ah pack rated at 1C delivers 10 A continuously. The same capacity rated at 3C delivers 30 A, and the difference is cell chemistry and construction, not marketing.
capacity_ah = 10.0
continuous_c = 1.0
burst_c = 3.0
print(capacity_ah * continuous_c, "A continuous")
print(capacity_ah * burst_c, "A for a few seconds")
# motor stall current for four geared motors
stall_per_motor = 5.0
print(4 * stall_per_motor, "A worst case")If the stall current exceeds the continuous rating, the pack will sag, the controller may reset, and the BMS may trip. Either choose a pack with a higher C-rate, add a current limit in the motor driver, or both. Never rely on the BMS to protect you from a design that pulls too much current.
Series and parallel: build the voltage first
Cells in series add voltage. Cells in parallel add capacity and current capability. Build the voltage your motors and controllers want, then parallel enough cells to reach the capacity and C-rate.
| Configuration | Nominal voltage | Capacity at 3 Ah cells | Best for |
|---|---|---|---|
| 3S1P | 11.1 V | 3 Ah | Small rover, short runs |
| 3S2P | 11.1 V | 6 Ah | Camera robot, 1–2 hours |
| 4S2P | 14.8 V | 6 Ah | 12 V motors with headroom |
| 6S2P | 22.2 V | 6 Ah | Larger drive, higher efficiency |
A 12 V motor on a 14.8 V pack runs faster and draws more current at the same load. That is acceptable if the driver and motor are rated for it, but check the controller’s maximum voltage before assuming more is better.
Voltage sag is the real-world test
A pack measured at 12.6 V resting can drop below 10 V when four motors start together. The controller sees that sag as a brownout, and the robot reboots mid-task. Measure the pack voltage while the robot accelerates, not while it sits on the bench.
- Log pack voltage and current during a full run, not just at the start.
- Watch the minimum voltage during acceleration and turns.
- Check that the 5 V rail stays within tolerance under the same load.
- Add bulk capacitance near the motor drivers if the sag is fast and short.
- Use thicker wire and shorter runs before blaming the cells.
If the voltage collapses only at the end of the run, the pack is empty. If it collapses at the start, the pack or the wiring cannot supply the current. The two failures need different fixes.
Charging and storage change the usable capacity
Lithium packs lose capacity when stored full and hot. A pack left at 100 percent in a workshop at 35 degrees will age faster than one stored at 50 to 60 percent. If the robot runs a few times a week, store it part-charged and charge before use.
Charging current matters too. A pack charged at 1C every cycle runs hotter and ages sooner than one charged at 0.5C. For a robot that charges overnight, there is no reason to rush. The lithium safety guide covers the practical rules for charging and storage.
The BMS is not optional
A battery management system balances cells, protects against over-current and short circuits, and disconnects the pack when a cell goes out of range. On a robot with regenerative braking or a heavy inductive load, the protection path has to handle reverse current as well.
Check that the BMS continuous current rating exceeds the highest sustained draw with margin, that the balance current is adequate for the pack size, and that the low-voltage cutoff matches the controller’s minimum. The BMS guide walks through the selection in more detail.
Test the pack before the robot depends on it
Run a controlled discharge on the bench with a known load and log voltage, current and temperature. Compare the delivered watt-hours with the label. A pack that delivers less than 80 percent of its rating when new is either mislabelled or unsuitable.
- Discharge at the robot’s average current, not at a gentle bench rate.
- Record the voltage curve and note where it starts to fall steeply.
- Repeat after ten cycles to see whether capacity is stable.
- Check cell balance at the end of the run; a large spread means a weak cell.
- Feel the pack and the wiring for hotspots under load.
Then run the robot until the low-voltage warning, and compare the runtime with the budget. If the real runtime is 30 percent short, fix the model before buying a bigger pack; the error is usually duty cycle, converter loss or an unmeasured load.
A sizing checklist
- Every load listed with voltage, current and duty cycle.
- Watt-hours computed, then divided by converter efficiency.
- Runtime target with a reserve of at least 20 to 30 percent.
- Peak current checked against the pack’s continuous C-rate.
- Pack voltage matched to the motor driver’s range.
- BMS current, balancing and cutoff verified.
- Voltage sag measured under acceleration.
- Charge and storage routine written down.
The maths takes an hour. Getting it wrong costs a rebuild of the battery bay, and often the chassis around it, because the pack you need is larger than the space you left.
How do I convert mAh to Wh?
Multiply amp-hours by nominal voltage. A 5,000 mAh pack at 11.1 V stores 5 Ah x 11.1 V = 55.5 Wh. Comparing packs by mAh alone is misleading when the voltages differ.
Can I use a car battery for a robot?
It works for large, slow platforms where weight is not critical, but lead-acid is heavy and its usable capacity drops sharply under deep discharge. Lithium is usually the better choice for anything mobile.
How much reserve should I keep?
At least 20 percent, and 30 percent for a robot that must finish a shift. The reserve protects against ageing, cold and an unexpected extra task, and it keeps the BMS away from cutoff.
Why does my robot reboot when the motors start?
Voltage sag, usually from undersized wiring, a pack with a low C-rate, or a shared 5 V rail without enough capacitance. Log the pack voltage during acceleration to confirm.
Is a bigger battery always better?
No. Extra capacity adds weight, cost and charging time, and weight increases motor current. Size to the task, then verify with a real discharge test.
Sources and further reading
- Battery University BU-503 — how discharge rate, temperature and age affect capacity.
- Battery University BU-409 — lithium charging behaviour and cycle life.
- Texas Instruments — battery management and gauge reference designs.
- Digi-Key India — cell and BMS datasheets for comparison.


