Worked Example: Current Limits That Prevent Brownouts
Write a real Phoenix 6 supply-current-limit config and a power budget so the roboRIO never crosses its 6.3V/6.75V brownout thresholds.
Sign in to track progress, earn XP, and save lessons.
A brownout is a controls safety event: when battery voltage sags, the roboRIO disables outputs and your robot can stop responding mid-match. Understanding the staged thresholds and limiting current is the fix.
Know the thresholds (WPILib). As battery voltage drops under heavy load:
- 6.8V - the 6V output on the PWM pins begins to drop (Stage 1).
- 6.3V (roboRIO 1.0, fixed) or 6.75V (roboRIO 2.0 default, settable via RobotController.setBrownoutVoltage) - full brownout: PWM disabled; the 6V, 5V, and 3.3V user rails disabled; relay and GPIO outputs disabled; CAN motor controllers and pneumatics commanded off.
- The controller stays in brownout until voltage rises back above 7.5V.
Step 1 - Build a power budget. Treat ~180A as a worst-case sustained draw and allocate it across subsystems. Many teams gear the drivetrain so wheels slip at roughly 40-50A per motor, which caps the worst-case stall draw.
Step 2 - Set supply current limits in Phoenix 6. On a CTRE TalonFX (e.g., Kraken X60 or Falcon 500), a reasonable starting point is a 70A supply limit that drops to 40A after 1.0 second of active limiting (these also happen to be the Phoenix 6 defaults):
import com.ctre.phoenix6.configs.CurrentLimitsConfigs;
import com.ctre.phoenix6.hardware.TalonFX;
TalonFX motor = new TalonFX(1);
var limits = new CurrentLimitsConfigs();
limits.SupplyCurrentLimit = 70; // amps, steady
limits.SupplyCurrentLowerLimit = 40; // amps, after sustained limiting
limits.SupplyCurrentLowerTime = 1.0; // seconds
limits.SupplyCurrentLimitEnable = true;
motor.getConfigurator().apply(limits);
When enabled, the limiter holds supply current at or below SupplyCurrentLimit (preventing brownouts) and, after limiting for SupplyCurrentLowerTime, drops to SupplyCurrentLowerLimit to keep the branch-circuit breaker from tripping. The 2025 Phoenix 6 rework replaced the old SupplyCurrentThreshold/SupplyTimeThreshold pair with these SupplyCurrentLowerLimit/SupplyCurrentLowerTime fields and made the limiter far more responsive at actually preventing brownouts.
Step 3 - Monitor and detect. Read per-channel current from the REV PDH or CTRE PDP (these log current), and check RobotController.isBrownedOut() / RobotController.getBatteryVoltage() in code. After practice, open the Driver Station Log Viewer and look for brownout markers and the 12V fault count.
if (edu.wpi.first.wpilibj.RobotController.isBrownedOut()) {
System.out.println("BROWNOUT at " + RobotController.getBatteryVoltage() + "V");
}
Step 4 - Tune. If you still brown out, lower SupplyCurrentLimit, fix your gearing, or start matches only on a battery that tested above ~12.7V and under 0.015 Ohm. The deliverable is a committed config plus a one-page subsystem current budget.
Key takeaways
- Brownout stages: 6.8V (PWM 6V sag), 6.3V (roboRIO 1.0) / 6.75V (roboRIO 2.0) full disable, 7.5V to recover.
- Phoenix 6 SupplyCurrentLimit (e.g., 70A dropping to 40A after 1.0s) is the primary code-side brownout defense.
- Use RobotController.isBrownedOut() plus the DS Log Viewer to detect and confirm fixes.
Go deeper
Lesson quiz
RequiredAnswer all 3 questions correctly to complete this lesson.
1.At what battery voltage does the original roboRIO (1.0) enter its brownout-protection state and disable motor (PWM) outputs?
2.Which type of current limit does CTRE identify as MOST effective at preventing brownouts during acceleration?
3.Brownouts caused by excessive current draw most commonly occur in which situation?
Answer every question to submit.