Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions firmware/controller/src/commands/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
3 changes: 2 additions & 1 deletion software/squid/filter_wheel_controller/cephla.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
28 changes: 24 additions & 4 deletions software/tests/squid/test_filter_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand Down
Loading