コード例 #1
0
 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
コード例 #2
0
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)
コード例 #3
0
ファイル: endstop_phase.py プロジェクト: zyonee/klipper
 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