Skip to content

CTRE Phoenix 6: Talon FX, Kraken X60/X44, and Falcon 500

learnfrc.com
learnfrc.comAuthor
Veer Bajaj
Veer BajajMaintainer

CTR Electronics (CTRE) makes some of the most common FRC motors and controllers. The Talon FX is the integrated motor-controller portion that drives the Kraken X60 , the Kraken X44 , and the (now effectively discontinued) Falcon 500 — these are integrated motors where the controller is built into the motor. They run on the CAN bus and use the Phoenix 6 software library plus the Phoenix Tuner X desktop app for configuration and diagnostics.

Install Phoenix 6 via VS Code’s “Manage Vendor Libraries” using CTRE’s vendordep URL.

Phoenix 6 uses a declarative configuration model: build a configuration object and apply it.

TalonFX motor = new TalonFX(1); // CAN ID 1
TalonFXConfiguration config = new TalonFXConfiguration();
config.MotorOutput.NeutralMode = NeutralModeValue.Brake;
// Stator limit protects the mechanism; supply limit protects the breaker/battery
config.CurrentLimits.StatorCurrentLimit = 80;
config.CurrentLimits.StatorCurrentLimitEnable = true;
config.CurrentLimits.SupplyCurrentLimit = 40;
config.CurrentLimits.SupplyCurrentLimitEnable = true;
motor.getConfigurator().apply(config);

Key idea: you get the device’s configurator with getConfigurator() and call apply(...).

To command the motor you create a control request object and pass it to setControl(...) :

// Simple open-loop: percent output via duty cycle
final DutyCycleOut openLoop = new DutyCycleOut(0);
motor.setControl(openLoop.withOutput(0.5)); // 50% output

This request-based design replaces the older “set mode then set value” style and makes advanced features (current limits, motion overrides) explicit.

A major advantage of the Talon FX is that PID and feedforward can run on the motor controller itself (faster than the roboRIO’s 50 Hz loop). You configure gains in a Slot0Configs and use control requests like VelocityVoltage or PositionVoltage. Note that Phoenix 6 works in rotations and rotations per second by default:

Slot0Configs slot0 = new Slot0Configs();
slot0.kP = 4.8; // proportional
slot0.kI = 0;
slot0.kD = 0.1;
slot0.kS = 0.25; // static friction feedforward (volts)
slot0.kV = 0.12; // velocity feedforward (volts per rps)
motor.getConfigurator().apply(slot0);
// Spin to 50 rotations/second using on-board velocity control
final VelocityVoltage velReq = new VelocityVoltage(0);
motor.setControl(velReq.withVelocity(50));

For smooth point-to-point moves, CTRE provides Motion Magic (its on-board motion profiling), commanded with MotionMagicVoltage.

The Talon FX has a built-in encoder you read with motor.getPosition() and motor.getVelocity() (these return Phoenix 6 StatusSignal objects; call .getValueAsDouble() for the number). Note: the Talon FX does not have screw terminals for hardware limit switches — instead you use limit configs/overrides on the control request, or wire a CANcoder (CTRE’s CAN magnetic encoder) as a remote sensor.

Use Phoenix Tuner X to assign CAN IDs, update firmware, run self-tests, plot signals, and field-calibrate. Assigning unique CAN IDs to every device is essential — duplicate IDs cause silent, confusing failures.

  • The Talon FX controller drives the Kraken X60, Kraken X44, and legacy Falcon 500 over the CAN bus.
  • Phoenix 6 is declarative: build a TalonFXConfiguration and getConfigurator().apply(it).
  • Command motors with control requests via setControl() (e.g., DutyCycleOut, VelocityVoltage); units are rotations and rotations/second.
  • PID + feedforward can run on the controller via Slot0Configs; Motion Magic adds on-board profiling.
  • Talon FX lacks screw-terminal limit switches — use limit configs/overrides or a CANcoder; manage CAN IDs in Phoenix Tuner X.

This lesson was adapted from learnfrc.com.