The exact roboRIO brownout voltage stages, how to spot one in the Driver Station log, and the fixes ranked by payoff: current limits, battery health, gearing, and compressor scheduling.
to read
words
sections
A brownout is the roboRIO protecting itself by cutting motor power once your battery voltage sags below a set threshold, and it's almost always a current problem, not a battery problem, even though a weak battery makes it much easier to trigger. The roboRIO watches its own input voltage in real time and steps through a documented, staged shutdown as that voltage drops. It isn't guessing, and it isn't random. Once you know the exact stages and where to see one in your Driver Station log, you can tell which of the fixes below is actually worth your time first, instead of just swapping batteries and hoping.
Every subsystem on your robot shares one 12V battery. When several things draw hard current at once, like a drivetrain accelerating out of a stop while a compressor kicks on, the voltage at the battery terminals sags. The roboRIO's job is to keep itself and the rest of the control system (the radio, the CAN bus, your sensors) alive even when that happens, so it has a staged brownout protection scheme built in specifically to preserve its own input voltage and prevent an uncontrolled reset.
| Stage | Voltage trigger | What happens |
|---|---|---|
| Stage 1 | Below 6.8V | The 6V rail on the roboRIO's PWM pins starts to sag. Only PWM-driven devices (older motor controllers, servos) are affected here; most modern CAN-based motor controllers won't notice yet. |
| Stage 2 | Below 6.3V (roboRIO 1.0, fixed) or 6.75V (roboRIO 2.0, default) | Full brownout protection. PWM outputs disable after one neutral pulse, the 6V/5V/3.3V user rails shut off, GPIO outputs go high-impedance, relays disable, CAN motor controllers get an explicit disable command, and pneumatics devices (CTRE PCM, REV Pneumatic Hub) shut down. The roboRIO stays in this state until voltage climbs back above 7.5V. |
| Stage 3 | Below 4.5V | The roboRIO itself may black out completely. It won't begin a normal reboot until voltage rises back above 4.65V. |
The roboRIO 2.0, the current standard FRC control system, lets you change the Stage 2 threshold in code:
RobotController.setBrownoutVoltage(7.0);
frc::RobotController::SetBrownoutVoltage(7_V);
Most teams never touch this. It's worth knowing it exists, but raising or lowering it doesn't fix the underlying current problem, it just moves where the roboRIO decides to give up. Check the current WPILib docs for your season, since these numbers are exactly the kind of thing that can shift with a control system change like the upcoming SystemCore transition.
Live, on the field: the roboRIO's power LED turns amber, the voltage box on the Driver Station turns red, and the status string switches to "Voltage Brownout." See our status lights guide for what every other blink pattern means.
After the match, in the log: open the Driver Station Log File Viewer (the gear icon in the DS, or the shortcut in your FRC Driver Station Start Menu folder). The battery voltage plots as a yellow line over time, and any brownout event is marked with a bright orange line right where it happened. If you just want a fast yes/no, the CAN/Power tab on the live Driver Station shows a 12V fault counter that increments by one every time Stage 2 triggers. For a deeper look at current per motor, per subsystem, over time, AdvantageScope reads the same logs with far more detail than the stock viewer.
This is the single highest-leverage fix, and it costs you nothing but a config call. Every brushless controller in FRC ships with (or lets you set) a current limit, and lowering it caps the current spike before it ever reaches the battery.
REV SPARK MAX / SPARK Flex default to an 80A stall limit with a 20A free-speed limit. Most teams tighten that per mechanism:
SparkMaxConfig config = new SparkMaxConfig();
config.smartCurrentLimit(40);
motor.configure(config, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
CTRE Talon FX / Kraken default to a 120A stator limit and a 70A supply limit, both enabled out of the box. The stator limit caps current in the motor itself, which is directly proportional to torque, so it's the more effective lever against brownouts because it constrains supply current automatically during hard acceleration. The supply limit caps what's actually pulled from the battery:
var talonFXConfigurator = m_talonFX.getConfigurator();
var limitConfigs = new CurrentLimitsConfigs();
limitConfigs.StatorCurrentLimit = 80;
limitConfigs.StatorCurrentLimitEnable = true;
talonFXConfigurator.apply(limitConfigs);
Set both limits on every controller, not just the drivetrain. A single unlimited manipulator motor can spike hard enough to brown out a robot that's otherwise fine.
A worn battery doesn't lower your voltage on its own, it sags much further under the exact same current draw a fresh battery would shrug off, because its internal resistance has crept up. WPILib's own guidance puts a healthy battery's internal resistance under 0.015 ohms (manufacturer spec is usually around 0.011 ohms) and says a battery reading above 0.020 ohms shouldn't go into competition matches. A battery reading 12.5V on an idle, powered-on robot should already be swapped and charged before you queue for a match, since a fresh pack reads closer to 12.7 to 13.5V open circuit when fully disconnected.
Loose connections do the same damage as a bad battery. A battery lug that isn't torqued down, or an Anderson connector that isn't fully seated, adds resistance right at the point where you can least afford it. Check both every time you swap a battery. For the full charging, testing, and load-testing routine, see the FRC battery guide.
Stall current on a modern FRC motor is enormous. A NEO stalls at roughly 105A, and a Kraken X60 can hit around 366A in trapezoidal commutation, both far past what a single 40A PDH channel or your battery can sustain for long. Gearing decides how close your drivetrain gets to that number under load. A ratio that's too aggressive for speed makes the motor work harder, and closer to stall, every time you accelerate hard or push against another robot.
The standard target most teams design toward is gearing the drivetrain so the wheels lose traction and slip at somewhere around 40 to 50A per motor, before the motor itself ever approaches stall. That converts a defensive shoving match into wheelspin instead of a current spike. Our gear ratios guide walks through the math for picking that ratio for your robot's weight and wheel traction.
The compressor runs on its own closed-loop control, turning on automatically whenever the pressure switch reports the system isn't full, with no awareness of what else the robot is doing at that instant. A REV Pneumatic Hub caps compressor output at 15A continuously, and REV recommends stepping up to a 20A breaker if you're running a higher-draw compressor. REV's own troubleshooting docs also note that the hub draws more current at lower battery voltage, meaning a compressor that kicks on right as your drivetrain is already spiking makes the sag worse instead of helping.
You can pause that with code. WPILib's Compressor class exposes disable() and enableDigital(), so you can suppress the compressor during a known high-draw window, like the first second of teleop or a sustained push, and let it resume once things settle:
m_compressor.disable();
// ... later, once the high-draw moment has passed
m_compressor.enableDigital();
Filling your tank to max pressure before the match starts also means the compressor has less catching up to do live. For wiring and full pneumatic system setup, see the FRC pneumatics guide.
For a guided walkthrough with practice questions, the Brownouts lesson in the Common Mistakes & Troubleshooting module covers the same material with a quiz at the end.
This article is AI-assisted: drafted from primary sources, then reviewed and edited by hand. Errors still get through. When one is reported we fix it and write down what changed — publicly, in the corrections log.
Keep going
You came here for one answer. These lessons teach the same subject properly, in the order a team actually learns it. All 35 are free and none of them need an account to read.
Go deeper
Pit problems repeat. A free account lets you bookmark troubleshooting guides and checklists so they're one tap away at competition.
Create a free accountKeep reading
Structured lessons and quizzes across every department. Create a free account to save your progress, track your team, and earn a certificate.