From: Wesley28w Date: Sun, 19 Apr 2026 01:48:57 +0000 (-0700) Subject: making battery but need more info X-Git-Url: https://git.taranathan.com/?a=commitdiff_plain;h=1bb09a8298d18927609964b5abb39b26a356247c;p=FRC2026.git making battery but need more info --- diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index ef1aa53..fa920ae 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -37,10 +37,10 @@ import frc.robot.constants.VisionConstants; import frc.robot.controls.BaseDriverConfig; import frc.robot.controls.Operator; import frc.robot.controls.PS5ControllerDriverConfig; -import frc.robot.subsystems.Breaker.EMABreaker; import frc.robot.subsystems.Climb.LinearClimb; import frc.robot.subsystems.Intake.Intake; import frc.robot.subsystems.LED.LED; +import frc.robot.subsystems.PowerControl.EMABreaker; import frc.robot.subsystems.drivetrain.Drivetrain; import frc.robot.subsystems.drivetrain.GyroIOPigeon2; import frc.robot.subsystems.hood.Hood; diff --git a/src/main/java/frc/robot/subsystems/Breaker/BreakerConstants.java b/src/main/java/frc/robot/subsystems/Breaker/BreakerConstants.java deleted file mode 100644 index 99eb2a7..0000000 --- a/src/main/java/frc/robot/subsystems/Breaker/BreakerConstants.java +++ /dev/null @@ -1,23 +0,0 @@ -package frc.robot.subsystems.Breaker; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class BreakerConstants { - public static final Map THRESHOLDS = new LinkedHashMap<>(); - static { - THRESHOLDS.put(1.0, 6.0 * 120); // breaker default at 120 - THRESHOLDS.put(4.0, 3.4 * 120); - THRESHOLDS.put(10.0, 2.0 * 120); - THRESHOLDS.put(20.0, 1.6 * 120); - THRESHOLDS.put(30.0, 1.5 * 120); - } - - // ports - public static int[] DRIVETRAIN_PORTS = {8,9,10,11,18,19,0,1}; // bls, bld, fld, fls, frs, frd, brd, brs - public static int[] TURRET_PORTS = {2}; - public static int[] INTAKE_PORTS = {15,14,13}; // right, left, roller - public static int[] SHOOTER_PORTS = {3,4}; // left, right - public static int[] HOOD_PORTS = {5}; // shooter - public static int[] SPINDEXER_PORTS = {12}; // spindexer (unupdated on sheets) -} diff --git a/src/main/java/frc/robot/subsystems/Breaker/EMABreaker.java b/src/main/java/frc/robot/subsystems/Breaker/EMABreaker.java deleted file mode 100644 index f823ab6..0000000 --- a/src/main/java/frc/robot/subsystems/Breaker/EMABreaker.java +++ /dev/null @@ -1,110 +0,0 @@ -package frc.robot.subsystems.Breaker; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.littletonrobotics.junction.Logger; - -import edu.wpi.first.wpilibj.PowerDistribution; -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.constants.Constants; - -public class EMABreaker extends SubsystemBase { - - private static class Current { - double tau; - double alpha; // how much of the error we correct per loop - double average = 0; - double threshold; - } - - PowerDistribution pDis = new PowerDistribution(); - - double[] subsystemCurrents; - - private List filters = new ArrayList<>(); // contains currents with their alphas and thresholds - private List subsystems = new ArrayList<>(); - - public EMABreaker() { - for (Map.Entry entry : BreakerConstants.THRESHOLDS.entrySet()) { - double tau = entry.getKey(); // sec - double threshold = entry.getValue(); // A - - Current w = new Current(); // create a filter for the threshold - w.tau = tau; - w.threshold = threshold; - w.alpha = 1 - Math.exp(-Constants.LOOP_TIME / tau); // 1 - e^(-0.02/1) = 0.0198, 1 - e^(-0.02/2) = 0.00995 - - filters.add(w); - } - - // subsystems - for (int i=0; i f.threshold) { - return true; // uh oh - } - } - return false; - } -} diff --git a/src/main/java/frc/robot/subsystems/PowerControl/Battery.java b/src/main/java/frc/robot/subsystems/PowerControl/Battery.java new file mode 100644 index 0000000..fcb5221 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/PowerControl/Battery.java @@ -0,0 +1,28 @@ +package frc.robot.subsystems.PowerControl; + +import edu.wpi.first.wpilibj.PowerDistribution; +import edu.wpi.first.wpilibj.RobotController; +import edu.wpi.first.wpilibj2.command.SubsystemBase; + +public class Battery extends SubsystemBase { + private double voltage; + public Battery() { + updateVoltageFromBattery(); + } + + private void updateVoltageFromBattery() { + voltage = RobotController.getBatteryVoltage(); + } + public double getVoltage() { return voltage; } + + public double voltsTillBrownOut() { return voltage - RobotController.getBrownoutVoltage(); } + public double toBrownOut() { + // percent of volts we've got left over what we had to start with + return voltsTillBrownOut() / (BatteryConstants.MAX_STARTING_VOLTS - RobotController.getBrownoutVoltage()); + } + + @Override + public void periodic() { + updateVoltageFromBattery(); + } +} diff --git a/src/main/java/frc/robot/subsystems/PowerControl/BatteryConstants.java b/src/main/java/frc/robot/subsystems/PowerControl/BatteryConstants.java new file mode 100644 index 0000000..0f83c59 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/PowerControl/BatteryConstants.java @@ -0,0 +1,5 @@ +package frc.robot.subsystems.PowerControl; + +public class BatteryConstants { + public static final double MAX_STARTING_VOLTS = 12.5; // V +} diff --git a/src/main/java/frc/robot/subsystems/PowerControl/BreakerConstants.java b/src/main/java/frc/robot/subsystems/PowerControl/BreakerConstants.java new file mode 100644 index 0000000..8d57e45 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/PowerControl/BreakerConstants.java @@ -0,0 +1,25 @@ +package frc.robot.subsystems.PowerControl; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class BreakerConstants { + public static final Map THRESHOLDS = new LinkedHashMap<>(); + static { + THRESHOLDS.put(1.0, 6.0 * 120); // breaker default at 120 + THRESHOLDS.put(4.0, 3.4 * 120); + THRESHOLDS.put(10.0, 2.0 * 120); + THRESHOLDS.put(20.0, 1.6 * 120); + THRESHOLDS.put(30.0, 1.5 * 120); + } + + public static final double WARNING_PERCENTAGE = 0.6; // percent that the system reacts to approaching thresholds + + // ports + public static int[] DRIVETRAIN_PORTS = {8,9,10,11,18,19,0,1}; // bls, bld, fld, fls, frs, frd, brd, brs + public static int[] TURRET_PORTS = {2}; + public static int[] INTAKE_PORTS = {15,14,13}; // right, left, roller + public static int[] SHOOTER_PORTS = {3,4}; // left, right + public static int[] HOOD_PORTS = {5}; // shooter + public static int[] SPINDEXER_PORTS = {12}; // spindexer (unupdated on sheets) +} diff --git a/src/main/java/frc/robot/subsystems/PowerControl/EMABreaker.java b/src/main/java/frc/robot/subsystems/PowerControl/EMABreaker.java new file mode 100644 index 0000000..48f7692 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/PowerControl/EMABreaker.java @@ -0,0 +1,118 @@ +package frc.robot.subsystems.PowerControl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.littletonrobotics.junction.Logger; + +import edu.wpi.first.wpilibj.PowerDistribution; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import frc.robot.constants.Constants; + +public class EMABreaker extends SubsystemBase { + + private static class Current { + double tau; + double alpha; // how much of the error we correct per loop + double average = 0; + double threshold; + } + + PowerDistribution pDis = new PowerDistribution(); + + double[] subsystemCurrents; + + private List filters = new ArrayList<>(); // contains currents with their alphas and thresholds + private List subsystems = new ArrayList<>(); + + public EMABreaker() { + for (Map.Entry entry : BreakerConstants.THRESHOLDS.entrySet()) { + double tau = entry.getKey(); // sec + double threshold = entry.getValue(); // A + + Current w = new Current(); // create a filter for the threshold + w.tau = tau; + w.threshold = threshold; + w.alpha = 1 - Math.exp(-Constants.LOOP_TIME / tau); // 1 - e^(-0.02/1) = 0.0198, 1 - e^(-0.02/2) = 0.00995 + + filters.add(w); + } + + // subsystems + for (int i=0; i f.threshold * BreakerConstants.WARNING_PERCENTAGE) { + return true; // uh oh + } + } + return false; + } + + public double percentageUsage() { + double sumAvg = 0; + for (Current f : filters) { + sumAvg += f.average / f.threshold; // gets percentage of us + } + return sumAvg / filters.size(); // average across filters + } +}