diff --git a/firmware/controller/src/commands/commands.cpp b/firmware/controller/src/commands/commands.cpp index fdab2a570..262fa525c 100644 --- a/firmware/controller/src/commands/commands.cpp +++ b/firmware/controller/src/commands/commands.cpp @@ -132,11 +132,11 @@ void callback_configure_stage_pid() tmc4361A_init_PID(&tmc4361[axis], 25, 25, axes_pid_arg[axis].p, axes_pid_arg[axis].i, axes_pid_arg[axis].d, tmc4361A_vmmToMicrosteps(&tmc4361[axis], MAX_VELOCITY_Z_mm), 4096, 2); else if (axis == w) { if (enable_filterwheel == true) - tmc4361A_init_PID(&tmc4361[axis], 2, 2, axes_pid_arg[axis].p, axes_pid_arg[axis].i, axes_pid_arg[axis].d, tmc4361A_vmmToMicrosteps(&tmc4361[axis], MAX_VELOCITY_W_mm), 4096, 2); + tmc4361A_init_PID(&tmc4361[axis], 20, 20, axes_pid_arg[axis].p, axes_pid_arg[axis].i, axes_pid_arg[axis].d, tmc4361A_vmmToMicrosteps(&tmc4361[axis], MAX_VELOCITY_W_mm), 4096, 2); } else if (axis == w2) { if (enable_filterwheel_w2 == true) - tmc4361A_init_PID(&tmc4361[axis], 2, 2, axes_pid_arg[axis].p, axes_pid_arg[axis].i, axes_pid_arg[axis].d, tmc4361A_vmmToMicrosteps(&tmc4361[axis], MAX_VELOCITY_W_mm), 4096, 2); + tmc4361A_init_PID(&tmc4361[axis], 20, 20, axes_pid_arg[axis].p, axes_pid_arg[axis].i, axes_pid_arg[axis].d, tmc4361A_vmmToMicrosteps(&tmc4361[axis], MAX_VELOCITY_W_mm), 4096, 2); } } diff --git a/software/squid/filter_wheel_controller/cephla.py b/software/squid/filter_wheel_controller/cephla.py index d332c9e48..e13ce1e22 100644 --- a/software/squid/filter_wheel_controller/cephla.py +++ b/software/squid/filter_wheel_controller/cephla.py @@ -120,7 +120,8 @@ def _configure_wheel(self, wheel_id: int, config: SquidFilterWheelConfig): if HAS_ENCODER_W: self.microcontroller.set_pid_arguments(axis, PID_P_W, PID_I_W, PID_D_W) self.microcontroller.configure_stage_pid(axis, config.transitions_per_revolution, ENCODER_FLIP_DIR_W) - self.microcontroller.turn_on_stage_pid(axis, ENABLE_PID_W) + if ENABLE_PID_W: + self.microcontroller.turn_on_stage_pid(axis) @staticmethod def _delta_to_usteps(delta_mm: float) -> int: diff --git a/software/tests/squid/test_filter_wheel.py b/software/tests/squid/test_filter_wheel.py index 9ed8da461..99ffa5161 100644 --- a/software/tests/squid/test_filter_wheel.py +++ b/software/tests/squid/test_filter_wheel.py @@ -4,6 +4,7 @@ import squid.config import squid.filter_wheel_controller.utils +from control._def import AXIS from squid.config import FilterWheelConfig, FilterWheelControllerVariant, SquidFilterWheelConfig from squid.filter_wheel_controller.cephla import SquidFilterWheel @@ -120,14 +121,33 @@ def test_normal_init_calls_mcu_initialization(self, mock_microcontroller, squid_ mock_microcontroller.init_filter_wheel.assert_called_once() mock_microcontroller.configure_squidfilter.assert_called_once() + @pytest.mark.parametrize( + "motor_slot,expected_axis", + [pytest.param(3, AXIS.W, id="W"), pytest.param(4, AXIS.W2, id="W2")], + ) @patch("squid.filter_wheel_controller.cephla.HAS_ENCODER_W", True) - def test_normal_init_configures_encoder_pid(self, mock_microcontroller, squid_config): - """skip_init=False with HAS_ENCODER_W=True should configure encoder PID.""" - SquidFilterWheel(mock_microcontroller, squid_config, skip_init=False) + @patch("squid.filter_wheel_controller.cephla.ENABLE_PID_W", True) + def test_normal_init_configures_encoder_pid(self, mock_microcontroller, motor_slot, expected_axis): + """HAS_ENCODER_W=True + ENABLE_PID_W=True should configure and engage PID.""" + config = _make_squid_config(motor_slot=motor_slot) + SquidFilterWheel(mock_microcontroller, config, skip_init=False) + + mock_microcontroller.set_pid_arguments.assert_called_once() + mock_microcontroller.configure_stage_pid.assert_called_once() + # turn_on_stage_pid takes axis only — passing extra args would TypeError. + mock_microcontroller.turn_on_stage_pid.assert_called_once_with(expected_axis) + + @pytest.mark.parametrize("motor_slot", [3, 4], ids=["W", "W2"]) + @patch("squid.filter_wheel_controller.cephla.HAS_ENCODER_W", True) + @patch("squid.filter_wheel_controller.cephla.ENABLE_PID_W", False) + def test_encoder_without_pid_skips_turn_on(self, mock_microcontroller, motor_slot): + """HAS_ENCODER_W=True + ENABLE_PID_W=False configures encoder but leaves PID off.""" + config = _make_squid_config(motor_slot=motor_slot) + SquidFilterWheel(mock_microcontroller, config, skip_init=False) mock_microcontroller.set_pid_arguments.assert_called_once() mock_microcontroller.configure_stage_pid.assert_called_once() - mock_microcontroller.turn_on_stage_pid.assert_called_once() + mock_microcontroller.turn_on_stage_pid.assert_not_called() class TestSquidFilterWheelAbsoluteMove: