Skip to content

Worked Example: Current Limits That Prevent Brownouts

learnfrc.com
learnfrc.comAuthor
Veer Bajaj
Veer BajajMaintainer

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. Check the 12V fault count live on the Driver Station’s CAN/Power tab during operation, and after practice review the Driver Station Log Viewer’s battery-voltage graph for the dips that indicate a brownout.

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.

  • 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.

This lesson was adapted from learnfrc.com.