pwm_cycle_time: Use mcu.min_schedule_time() and mcu.max_nominal_duration()

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2025-04-21 13:15:54 -04:00
parent ab61b0a435
commit 0dce120a20

View File

@ -1,12 +1,9 @@
# Handle pwm output pins with variable frequency
#
# Copyright (C) 2017-2023 Kevin O'Connor <kevin@koconnor.net>
# Copyright (C) 2017-2025 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
PIN_MIN_TIME = 0.100
MAX_SCHEDULE_TIME = 5.0
class MCU_pwm_cycle:
def __init__(self, pin_params, cycle_time, start_value, shutdown_value):
self._mcu = pin_params['chip']
@ -22,6 +19,8 @@ class MCU_pwm_cycle:
self._shutdown_value = max(0., min(1., shutdown_value))
self._last_clock = self._cycle_ticks = 0
self._set_cmd = self._set_cycle_ticks = None
def get_mcu(self):
return self._mcu
def _build_config(self):
cmd_queue = self._mcu.alloc_command_queue()
curtime = self._mcu.get_printer().get_reactor().monotonic()
@ -77,9 +76,6 @@ class PrinterOutputPWMCycle:
def __init__(self, config):
self.printer = config.get_printer()
self.last_print_time = 0.
cycle_time = config.getfloat('cycle_time', 0.100, above=0.,
maxval=MAX_SCHEDULE_TIME)
self.last_cycle_time = self.default_cycle_time = cycle_time
# Determine start and shutdown values
self.scale = config.getfloat('scale', 1., above=0.)
self.last_value = config.getfloat(
@ -89,8 +85,12 @@ class PrinterOutputPWMCycle:
# Create pwm pin object
ppins = self.printer.lookup_object('pins')
pin_params = ppins.lookup_pin(config.get('pin'), can_invert=True)
max_duration = pin_params['chip'].max_nominal_duration()
cycle_time = config.getfloat('cycle_time', 0.100, above=0.,
maxval=max_duration)
self.mcu_pin = MCU_pwm_cycle(pin_params, cycle_time,
self.last_value, self.shutdown_value)
self.last_cycle_time = self.default_cycle_time = cycle_time
# Register commands
pin_name = config.get_name().split()[1]
gcode = self.printer.lookup_object('gcode')
@ -102,7 +102,8 @@ class PrinterOutputPWMCycle:
def _set_pin(self, print_time, value, cycle_time):
if value == self.last_value and cycle_time == self.last_cycle_time:
return
print_time = max(print_time, self.last_print_time + PIN_MIN_TIME)
min_sched_time = self.mcu_pin.get_mcu().min_schedule_time()
print_time = max(print_time, self.last_print_time + min_sched_time)
self.mcu_pin.set_pwm_cycle(print_time, value, cycle_time)
self.last_value = value
self.last_cycle_time = cycle_time
@ -112,8 +113,9 @@ class PrinterOutputPWMCycle:
# Read requested value
value = gcmd.get_float('VALUE', minval=0., maxval=self.scale)
value /= self.scale
max_duration = self.mcu_pin.get_mcu().max_nominal_duration()
cycle_time = gcmd.get_float('CYCLE_TIME', self.default_cycle_time,
above=0., maxval=MAX_SCHEDULE_TIME)
above=0., maxval=max_duration)
# Obtain print_time and apply requested settings
toolhead = self.printer.lookup_object('toolhead')
toolhead.register_lookahead_callback(