def __init__(self, config): self.printer = config.get_printer() self.name = config.get_name().split()[1] # Register event handlers self.printer.register_event_handler("klippy:connect", self.handle_connect) self.printer.register_event_handler("homing:home_rails_end", self.handle_home_rails_end) self.printer.load_object(config, "endstop_phase") # Obtain step_distance and microsteps from stepper config section sconfig = config.getsection(self.name) self.step_dist = stepper.parse_step_distance(sconfig) self.phases = sconfig.getint("microsteps", note_valid=False) * 4 # Read config self.endstop_phase = None trigger_phase = config.get('trigger_phase', None) if trigger_phase is not None: try: p, ps = [int(v.strip()) for v in trigger_phase.split('/')] except: raise config.error("Unable to parse trigger_phase '%s'" % (trigger_phase, )) if p >= ps: raise config.error("Invalid trigger_phase '%s'" % (trigger_phase, )) self.endstop_phase = convert_phase(p, ps, self.phases) self.endstop_align_zero = config.getboolean('endstop_align_zero', False) self.endstop_accuracy = config.getfloat('endstop_accuracy', None, above=0.) # Determine endstop accuracy if self.endstop_accuracy is None: self.endstop_phase_accuracy = self.phases // 2 - 1 elif self.endstop_phase is not None: self.endstop_phase_accuracy = int( math.ceil(self.endstop_accuracy * .5 / self.step_dist)) else: self.endstop_phase_accuracy = int( math.ceil(self.endstop_accuracy / self.step_dist)) if self.endstop_phase_accuracy >= self.phases // 2: raise config.error("Endstop for %s is not accurate enough for" " stepper phase adjustment" % (self.name, )) if self.printer.get_start_args().get('debugoutput') is not None: self.endstop_phase_accuracy = self.phases self.phase_history = [0] * self.phases self.get_phase = None
def TMCStealthchopHelper(config, mcu_tmc, tmc_freq): fields = mcu_tmc.get_fields() en_pwm_mode = False velocity = config.getfloat('stealthchop_threshold', 0., minval=0.) if velocity: stepper_name = " ".join(config.get_name().split()[1:]) stepper_config = config.getsection(stepper_name) step_dist = stepper.parse_step_distance(stepper_config) step_dist_256 = step_dist / (1 << fields.get_field("MRES")) threshold = int(tmc_freq * step_dist_256 / velocity + .5) fields.set_field("TPWMTHRS", max(0, min(0xfffff, threshold))) en_pwm_mode = True reg = fields.lookup_register("en_pwm_mode", None) if reg is not None: fields.set_field("en_pwm_mode", en_pwm_mode) else: # TMC2208 uses en_spreadCycle fields.set_field("en_spreadCycle", not en_pwm_mode)
def __init__(self, config): self.printer = config.get_printer() self.name = config.get_name().split()[1] # Obtain step_distance and microsteps from stepper config section sconfig = config.getsection(self.name) rotation_dist, steps_per_rotation = stepper.parse_step_distance( sconfig) self.step_dist = rotation_dist / steps_per_rotation self.phases = sconfig.getint("microsteps", note_valid=False) * 4 self.phase_calc = PhaseCalc(self.printer, self.name, self.phases) # Register event handlers self.printer.register_event_handler("klippy:connect", self.phase_calc.lookup_tmc) self.printer.register_event_handler("homing:home_rails_end", self.handle_home_rails_end) self.printer.load_object(config, "endstop_phase") # Read config self.endstop_phase = None trigger_phase = config.get('trigger_phase', None) if trigger_phase is not None: p, ps = config.getintlist('trigger_phase', sep='/', count=2) if p >= ps: raise config.error("Invalid trigger_phase '%s'" % (trigger_phase, )) self.endstop_phase = self.phase_calc.convert_phase(p, ps) self.endstop_align_zero = config.getboolean('endstop_align_zero', False) self.endstop_accuracy = config.getfloat('endstop_accuracy', None, above=0.) # Determine endstop accuracy if self.endstop_accuracy is None: self.endstop_phase_accuracy = self.phases // 2 - 1 elif self.endstop_phase is not None: self.endstop_phase_accuracy = int( math.ceil(self.endstop_accuracy * .5 / self.step_dist)) else: self.endstop_phase_accuracy = int( math.ceil(self.endstop_accuracy / self.step_dist)) if self.endstop_phase_accuracy >= self.phases // 2: raise config.error("Endstop for %s is not accurate enough for" " stepper phase adjustment" % (self.name, )) if self.printer.get_start_args().get('debugoutput') is not None: self.endstop_phase_accuracy = self.phases