mirror of
https://github.com/Klipper3d/klipper.git
synced 2025-08-10 07:15:10 -06:00
stepper: Add support for stepping on both edges of a step pulse
Add an optimized step function for drivers that support stepping on both rising and falling edges of the step pin. Enable this optimization on 32bit ARM micro-controllers. Automatically detect this capability in the host code and enable on TMC drivers running in SPI/UART mode. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
4acfd8d7c8
commit
689231df3a
10 changed files with 77 additions and 12 deletions
|
@ -224,6 +224,8 @@ class TMCCommandHelper:
|
|||
self.stepper_enable = self.printer.load_object(config, "stepper_enable")
|
||||
self.printer.register_event_handler("stepper:sync_mcu_position",
|
||||
self._handle_sync_mcu_pos)
|
||||
self.printer.register_event_handler("klippy:mcu_identify",
|
||||
self._handle_mcu_identify)
|
||||
self.printer.register_event_handler("klippy:connect",
|
||||
self._handle_connect)
|
||||
# Set microstep config options
|
||||
|
@ -345,6 +347,12 @@ class TMCCommandHelper:
|
|||
self.echeck_helper.stop_checks()
|
||||
except self.printer.command_error as e:
|
||||
self.printer.invoke_shutdown(str(e))
|
||||
def _handle_mcu_identify(self):
|
||||
# Lookup stepper object
|
||||
force_move = self.printer.lookup_object("force_move")
|
||||
self.stepper = force_move.lookup_stepper(self.stepper_name)
|
||||
# Note pulse duration and step_both_edge optimizations available
|
||||
self.stepper.setup_default_pulse_duration(.000000100, True)
|
||||
def _handle_stepper_enable(self, print_time, is_enable):
|
||||
if is_enable:
|
||||
cb = (lambda ev: self._do_enable(print_time))
|
||||
|
@ -352,9 +360,10 @@ class TMCCommandHelper:
|
|||
cb = (lambda ev: self._do_disable(print_time))
|
||||
self.printer.get_reactor().register_callback(cb)
|
||||
def _handle_connect(self):
|
||||
# Lookup stepper object
|
||||
force_move = self.printer.lookup_object("force_move")
|
||||
self.stepper = force_move.lookup_stepper(self.stepper_name)
|
||||
# Check if using step on both edges optimization
|
||||
pulse_duration, step_both_edge = self.stepper.get_pulse_duration()
|
||||
if step_both_edge:
|
||||
self.fields.set_field("dedge", 1)
|
||||
# Check for soft stepper enable/disable
|
||||
enable_line = self.stepper_enable.lookup_enable(self.stepper_name)
|
||||
enable_line.register_state_callback(self._handle_stepper_enable)
|
||||
|
|
|
@ -98,7 +98,6 @@ SignedFields = ["sgt"]
|
|||
|
||||
FieldFormatters = dict(tmc2130.FieldFormatters)
|
||||
FieldFormatters.update({
|
||||
"dedge": (lambda v: "1(Both Edges Active!)" if v else ""),
|
||||
"chm": (lambda v: "1(constant toff)" if v else "0(spreadCycle)"),
|
||||
"vsense": (lambda v: "1(165mV)" if v else "0(305mV)"),
|
||||
"sdoff": (lambda v: "1(Step/Dir disabled!)" if v else ""),
|
||||
|
|
|
@ -32,6 +32,7 @@ class MCU_stepper:
|
|||
"Stepper dir pin must be on same mcu as step pin")
|
||||
self._dir_pin = dir_pin_params['pin']
|
||||
self._invert_dir = dir_pin_params['invert']
|
||||
self._step_both_edge = self._req_step_both_edge = False
|
||||
self._mcu_position_offset = 0.
|
||||
self._reset_cmd_tag = self._get_position_cmd = None
|
||||
self._active_callbacks = []
|
||||
|
@ -54,6 +55,12 @@ class MCU_stepper:
|
|||
def units_in_radians(self):
|
||||
# Returns true if distances are in radians instead of millimeters
|
||||
return self._units_in_radians
|
||||
def get_pulse_duration(self):
|
||||
return self._step_pulse_duration, self._step_both_edge
|
||||
def setup_default_pulse_duration(self, pulse_duration, step_both_edge):
|
||||
if self._step_pulse_duration is None:
|
||||
self._step_pulse_duration = pulse_duration
|
||||
self._req_step_both_edge = step_both_edge
|
||||
def setup_itersolve(self, alloc_func, *params):
|
||||
ffi_main, ffi_lib = chelper.get_ffi()
|
||||
sk = ffi_main.gc(getattr(ffi_lib, alloc_func)(*params), ffi_lib.free)
|
||||
|
@ -61,11 +68,18 @@ class MCU_stepper:
|
|||
def _build_config(self):
|
||||
if self._step_pulse_duration is None:
|
||||
self._step_pulse_duration = .000002
|
||||
invert_step = self._invert_step
|
||||
sbe = int(self._mcu.get_constants().get('STEPPER_BOTH_EDGE', '0'))
|
||||
if self._req_step_both_edge and sbe:
|
||||
# Enable stepper optimized step on both edges
|
||||
self._step_both_edge = True
|
||||
self._step_pulse_duration = 0.
|
||||
invert_step = -1
|
||||
step_pulse_ticks = self._mcu.seconds_to_clock(self._step_pulse_duration)
|
||||
self._mcu.add_config_cmd(
|
||||
"config_stepper oid=%d step_pin=%s dir_pin=%s invert_step=%d"
|
||||
" step_pulse_ticks=%u" % (self._oid, self._step_pin, self._dir_pin,
|
||||
self._invert_step, step_pulse_ticks))
|
||||
invert_step, step_pulse_ticks))
|
||||
self._mcu.add_config_cmd("reset_step_clock oid=%d clock=0"
|
||||
% (self._oid,), on_restart=True)
|
||||
step_cmd_tag = self._mcu.lookup_command_tag(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue