aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--klippy/chipmisc.py43
1 files changed, 25 insertions, 18 deletions
diff --git a/klippy/chipmisc.py b/klippy/chipmisc.py
index c724f5ef..82ec70d4 100644
--- a/klippy/chipmisc.py
+++ b/klippy/chipmisc.py
@@ -254,8 +254,8 @@ class pca9685_pwm:
self._start_value = max(0., min(1., start_value))
self._shutdown_value = max(0., min(1., shutdown_value))
self._is_static = is_static
- if self._shutdown_value:
- self._replicape.note_enable_on_shutdown()
+ self._replicape.note_pwm_start_value(
+ self._channel, self._start_value, self._shutdown_value)
def build_config(self):
self._pwm_max = self._mcu.get_constant_float("PCA9685_MAX")
cycle_ticks = self._mcu.seconds_to_clock(self._cycle_time)
@@ -281,7 +281,7 @@ class pca9685_pwm:
if self._invert:
value = 1. - value
value = int(max(0., min(1., value)) * self._pwm_max + 0.5)
- self._replicape.note_enable(print_time, self._channel, not not value)
+ self._replicape.note_pwm_enable(print_time, self._channel, value)
msg = self._set_cmd.encode(self._oid, clock, value)
self._mcu.send(msg, minclock=self._last_clock, reqclock=clock
, cq=self._cmd_queue)
@@ -326,10 +326,10 @@ class Replicape:
config.getchoice('revision', revisions)
self.host_mcu = mcu.get_printer_mcu(printer, config.get('host_mcu'))
# Setup enable pin
- self.mcu_enable = pins.setup_pin(
+ self.mcu_pwm_enable = pins.setup_pin(
printer, 'digital_out', config.get('enable_pin', '!P9_41'))
- self.mcu_enable.setup_max_duration(0.)
- self.enabled_channels = {}
+ self.mcu_pwm_enable.setup_max_duration(0.)
+ self.mcu_pwm_start_value = self.mcu_pwm_shutdown_value = False
# Setup power pins
self.pins = {
"power_e": (pca9685_pwm, 5), "power_h": (pca9685_pwm, 3),
@@ -357,22 +357,29 @@ class Replicape:
prefix + 'current', above=0., maxval=REPLICAPE_MAX_CURRENT)
self.stepper_dacs[channel] = cur / REPLICAPE_MAX_CURRENT
self.pins[prefix + 'enable'] = (ReplicapeDACEnable, channel)
+ self.enabled_channels = {ch: False for cl, ch in self.pins.values()}
shift_registers.reverse()
self.host_mcu.add_config_cmd("send_spi bus=%d dev=%d msg=%s" % (
REPLICAPE_SHIFT_REGISTER_BUS, REPLICAPE_SHIFT_REGISTER_DEVICE,
"".join(["%02x" % (x,) for x in shift_registers])))
- def note_enable_on_shutdown(self):
- self.mcu_enable.setup_start_value(0, 1)
- def note_enable(self, print_time, channel, is_enable):
- if is_enable:
- is_off = not self.enabled_channels
- self.enabled_channels[channel] = 1
- if is_off:
- self.mcu_enable.set_digital(print_time, 1)
- elif channel in self.enabled_channels:
- del self.enabled_channels[channel]
- if not self.enabled_channels:
- self.mcu_enable.set_digital(print_time, 0)
+ def note_pwm_start_value(self, channel, start_value, shutdown_value):
+ self.mcu_pwm_start_value |= not not start_value
+ self.mcu_pwm_shutdown_value |= not not shutdown_value
+ self.mcu_pwm_enable.setup_start_value(
+ self.mcu_pwm_start_value, self.mcu_pwm_shutdown_value)
+ self.enabled_channels[channel] = not not start_value
+ def note_pwm_enable(self, print_time, channel, value):
+ is_enable = not not value
+ if self.enabled_channels[channel] == is_enable:
+ # Nothing to do
+ return
+ self.enabled_channels[channel] = is_enable
+ # Check if need to set the pca9685 enable pin
+ on_channels = [1 for c, e in self.enabled_channels.items() if e]
+ if not on_channels:
+ self.mcu_pwm_enable.set_digital(print_time, 0)
+ elif is_enable and len(on_channels) == 1:
+ self.mcu_pwm_enable.set_digital(print_time, 1)
def setup_pin(self, pin_params):
pin = pin_params['pin']
if pin not in self.pins: