Sensorless Homing
FOCI can home an axis by detecting the motion stall from the encoder, so that axis needs no endstop switch. Sensorless homing is optional. Physical endstops keep working, so skip this page if you use them.
Do this after Tuning. The stall detector measures how far the axis lags behind its commanded position, and that lag depends on the tuned gains.
Configure
Section titled “Configure”Two changes per axis. In [foci <stepper>], set homing_current, the
reduced current used while homing:
[foci <stepper>]run_current: 1.0encoder_ppr: 1000homing_current: 0.4In [<stepper>], point the endstop at FOCI’s virtual endstop:
[<stepper>]endstop_pin: foci_<stepper>:virtual_endstophoming_currentis required on each axis that uses the virtual endstop. Klipper reports a config error if it’s missing. It must be above 0 and at least 0.05 A belowrun_current.- Start at 30 to 50% of
run_current. - On CoreXY, both motors move for every X or Y home. On the motor whose
axis doesn’t use the virtual endstop,
homing_currentis optional. Without it, that motor homes at fullrun_current. Set it there too to reduce the current on both motors.
Set homing_speed in [<stepper>] to at least
1.25 × 1000 × rotation_distance ÷ encoder_ppr mm/s, which is 50 mm/s
for a rotation_distance of 40 and an encoder_ppr of 1000. Slower
than that, FOCI detects the stop later, so the axis presses harder
against it before homing completes. Common homing speeds are 80 to 120
mm/s.
Then home:
G28 <axis>Verify
Section titled “Verify”Home the axis 10 times. Every home should complete without an error.
Troubleshooting
Section titled “Troubleshooting”- Triggers early, mid-travel. Klipper retries once at the second
homing speed, then reports an error. Raise
homing_currentby 0.1 A, raisestall_margin_mmby 0.05, or lowerhoming_speed, staying above the minimum.stall_margin_mmis how far the axis can lag behind its commanded position, above its normal lag, before it counts as a stall. Keep it belowstall_ceiling_mm, the fixed lag limit that always counts as a stall. - “No trigger on
after full movement”. The toolhead never registered a stall. If it reached the hard stop, lowerstall_margin_mmby 0.05. If it stopped short of the hard stop, lowerhoming_speed.
Change one value at a time, RESTART, and re-run the 10-home check.