aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2018-01-29 12:54:06 -0500
committerKevin O'Connor <kevin@koconnor.net>2018-01-29 13:08:15 -0500
commit21df21b7af2759aa577eb8d39d8215471956c25c (patch)
tree8d36f02176a2d1b817e2e2159791035d91e4282f
parentb7b216af7f49995f816f326c08f721b3814c9685 (diff)
downloadkutter-21df21b7af2759aa577eb8d39d8215471956c25c.tar.gz
kutter-21df21b7af2759aa577eb8d39d8215471956c25c.tar.xz
kutter-21df21b7af2759aa577eb8d39d8215471956c25c.zip
fan: Clarify hardware_pwm and allow cycle_time to be set on software pwm
Specify hardware pwm cycle times using the same method as software pwm (in seconds, not clock ticks). Allow the fan code to be configured with an explicit cycle time even when using software pwm. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--config/example-extras.cfg15
-rw-r--r--config/example.cfg13
-rw-r--r--config/generic-mini-rambo.cfg9
-rw-r--r--config/makergear-m2-2012.cfg3
-rw-r--r--klippy/chipmisc.py9
-rw-r--r--klippy/extras/fan.py8
-rw-r--r--klippy/extras/multi_pin.py7
-rw-r--r--klippy/extras/replicape.py12
-rw-r--r--klippy/mcu.py21
9 files changed, 46 insertions, 51 deletions
diff --git a/config/example-extras.cfg b/config/example-extras.cfg
index 37a3ca0b..787a4a29 100644
--- a/config/example-extras.cfg
+++ b/config/example-extras.cfg
@@ -209,14 +209,13 @@
#shutdown_value:
# The value to set the pin to on an MCU shutdown event. The default
# is 0.
-#hard_pwm:
-# Set this value to force hardware PWM instead of software PWM. Set
-# to 1 to force a hardware PWM at the fastest rate; set to a higher
-# number to force hardware PWM with the given cycle time in clock
-# ticks. The default is to use software PWM.
#cycle_time: 0.100
-# The amount of time (in seconds) per PWM cycle when using software
-# based PWM. The default is 0.100 seconds.
+# The amount of time (in seconds) per PWM cycle. It is recommended
+# this be 10 milliseconds or greater when using software based
+# PWM. The default is 0.100 seconds.
+#hardware_pwm: False
+# Enable this to use hardware PWM instead of software PWM. The
+# default is False.
#scale:
# This parameter can be used to alter how the 'value' and
# 'shutdown_value' parameters are interpreted. If provided, then the
@@ -234,8 +233,8 @@
#[static_pwm_output my_output_pwm]
#pin:
#value:
-#hard_pwm:
#cycle_time:
+#hardware_pwm:
#scale:
# See the 'pwm_output' section for details on these parameters.
diff --git a/config/example.cfg b/config/example.cfg
index bc71d46c..567b162d 100644
--- a/config/example.cfg
+++ b/config/example.cfg
@@ -245,12 +245,13 @@ pin: ar9
# pin to be enabled for no more than half the time. This setting may
# be used to limit the total power output (over extended periods) to
# the fan. The default is 1.0.
-#hard_pwm: 0
-# Set this value to force hardware PWM instead of software PWM. Set
-# to 1 to force a hardware PWM at the fastest rate; set to a higher
-# number to force hardware PWM with the given cycle time in clock
-# ticks. The default is 0 which enables software PWM with a cycle
-# time of 10ms.
+#cycle_time: 0.010
+# The amount of time (in seconds) for each PWM power cycle to the
+# fan. It is recommended this be 10 milliseconds or greater when
+# using software based PWM. The default is 0.010 seconds.
+#hardware_pwm: False
+# Enable this to use hardware PWM instead of software PWM. The
+# default is False.
#kick_start_time: 0.100
# Time (in seconds) to run the fan at full speed when first enabling
# it (helps get the fan spinning). The default is 0.100 seconds.
diff --git a/config/generic-mini-rambo.cfg b/config/generic-mini-rambo.cfg
index c04857e6..31e4af76 100644
--- a/config/generic-mini-rambo.cfg
+++ b/config/generic-mini-rambo.cfg
@@ -78,19 +78,22 @@ max_z_accel: 100
pin: PL3
scale: 2.0
value: 1.3
-hard_pwm: 32640
+cycle_time: .002
+hardware_pwm: True
[static_pwm_output stepper_z_current]
pin: PL4
scale: 2.0
value: 1.3
-hard_pwm: 32640
+cycle_time: .002
+hardware_pwm: True
[static_pwm_output stepper_e_current]
pin: PL5
scale: 2.0
value: 1.25
-hard_pwm: 32640
+cycle_time: .002
+hardware_pwm: True
[static_digital_output stepper_config]
pins:
diff --git a/config/makergear-m2-2012.cfg b/config/makergear-m2-2012.cfg
index eec52640..67df1537 100644
--- a/config/makergear-m2-2012.cfg
+++ b/config/makergear-m2-2012.cfg
@@ -72,7 +72,8 @@ pin: PH5
[heater_fan nozzle_fan]
pin: PH3
max_power: 0.61
-hard_pwm: 1
+cycle_time: .000030
+hardware_pwm: True
[mcu]
serial: /dev/ttyACM0
diff --git a/klippy/chipmisc.py b/klippy/chipmisc.py
index 611823ec..575f0664 100644
--- a/klippy/chipmisc.py
+++ b/klippy/chipmisc.py
@@ -25,12 +25,9 @@ class PrinterPin:
self.is_pwm = 'pwm' in config.get_name().split()[0]
if self.is_pwm:
self.mcu_pin = pins.setup_pin(printer, 'pwm', config.get('pin'))
- hard_pwm = config.getint('hard_pwm', None, minval=1)
- if hard_pwm is None:
- self.mcu_pin.setup_cycle_time(config.getfloat(
- 'cycle_time', 0.100, above=0.))
- else:
- self.mcu_pin.setup_hard_pwm(hard_pwm)
+ cycle_time = config.getfloat('cycle_time', 0.100, above=0.)
+ hardware_pwm = config.getboolean('hardware_pwm', False)
+ self.mcu_pin.setup_cycle_time(cycle_time, hardware_pwm)
self.scale = config.getfloat('scale', 1., above=0.)
else:
self.mcu_pin = pins.setup_pin(
diff --git a/klippy/extras/fan.py b/klippy/extras/fan.py
index c7434ca5..7bc4a26d 100644
--- a/klippy/extras/fan.py
+++ b/klippy/extras/fan.py
@@ -5,8 +5,7 @@
# This file may be distributed under the terms of the GNU GPLv3 license.
import pins
-FAN_MIN_TIME = 0.1
-PWM_CYCLE_TIME = 0.010
+FAN_MIN_TIME = 0.100
class PrinterFan:
def __init__(self, config):
@@ -17,8 +16,9 @@ class PrinterFan:
printer = config.get_printer()
self.mcu_fan = pins.setup_pin(printer, 'pwm', config.get('pin'))
self.mcu_fan.setup_max_duration(0.)
- self.mcu_fan.setup_cycle_time(PWM_CYCLE_TIME)
- self.mcu_fan.setup_hard_pwm(config.getint('hard_pwm', 0))
+ cycle_time = config.getfloat('cycle_time', 0.010, above=0.)
+ hardware_pwm = config.getboolean('hardware_pwm', False)
+ self.mcu_fan.setup_cycle_time(cycle_time, hardware_pwm)
def set_speed(self, print_time, value):
value = max(0., min(self.max_power, value))
if value == self.last_fan_value:
diff --git a/klippy/extras/multi_pin.py b/klippy/extras/multi_pin.py
index 3e033a86..5ffaed80 100644
--- a/klippy/extras/multi_pin.py
+++ b/klippy/extras/multi_pin.py
@@ -40,12 +40,9 @@ class PrinterMultiPin:
def setup_start_value(self, start_value, shutdown_value):
for mcu_pin in self.mcu_pins:
mcu_pin.setup_start_value(start_value, shutdown_value)
- def setup_cycle_time(self, cycle_time):
+ def setup_cycle_time(self, cycle_time, hardware_pwm=False):
for mcu_pin in self.mcu_pins:
- mcu_pin.setup_cycle_time(cycle_time)
- def setup_hard_pwm(self, hard_cycle_ticks):
- for mcu_pin in self.mcu_pins:
- mcu_pin.setup_hard_pwm(hard_cycle_ticks)
+ mcu_pin.setup_cycle_time(cycle_time, hardware_pwm)
def set_digital(self, print_time, value):
for mcu_pin in self.mcu_pins:
mcu_pin.set_digital(print_time, value)
diff --git a/klippy/extras/replicape.py b/klippy/extras/replicape.py
index 72ab45e9..742607c5 100644
--- a/klippy/extras/replicape.py
+++ b/klippy/extras/replicape.py
@@ -3,6 +3,7 @@
# Copyright (C) 2017,2018 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
+import logging
import pins, mcu
REPLICAPE_MAX_CURRENT = 3.84
@@ -37,11 +38,12 @@ class pca9685_pwm:
return self._mcu
def setup_max_duration(self, max_duration):
self._max_duration = max_duration
- def setup_cycle_time(self, cycle_time):
- pass
- def setup_hard_pwm(self, hard_cycle_ticks):
- if hard_cycle_ticks:
- raise pins.error("pca9685 does not support hard_pwm parameter")
+ def setup_cycle_time(self, cycle_time, hardware_pwm=False):
+ if hardware_pwm:
+ raise pins.error("pca9685 does not support hardware_pwm parameter")
+ if cycle_time != self._cycle_time:
+ logging.info("Ignoring pca9685 cycle time of %.6f (using %.6f)",
+ cycle_time, self._cycle_time)
def setup_start_value(self, start_value, shutdown_value, is_static=False):
if is_static and start_value != shutdown_value:
raise pins.error("Static pin can not have shutdown value")
diff --git a/klippy/mcu.py b/klippy/mcu.py
index d91e6314..87c590a8 100644
--- a/klippy/mcu.py
+++ b/klippy/mcu.py
@@ -275,7 +275,7 @@ class MCU_digital_out:
class MCU_pwm:
def __init__(self, mcu, pin_params):
self._mcu = mcu
- self._hard_pwm = False
+ self._hardware_pwm = False
self._cycle_time = 0.100
self._max_duration = 2.
self._oid = None
@@ -291,14 +291,9 @@ class MCU_pwm:
return self._mcu
def setup_max_duration(self, max_duration):
self._max_duration = max_duration
- def setup_cycle_time(self, cycle_time):
+ def setup_cycle_time(self, cycle_time, hardware_pwm=False):
self._cycle_time = cycle_time
- self._hard_pwm = False
- def setup_hard_pwm(self, hard_cycle_ticks):
- if not hard_cycle_ticks:
- return
- self._cycle_time = hard_cycle_ticks
- self._hard_pwm = True
+ self._hardware_pwm = hardware_pwm
def setup_start_value(self, start_value, shutdown_value, is_static=False):
if is_static and start_value != shutdown_value:
raise pins.error("Static pin can not have shutdown value")
@@ -309,19 +304,20 @@ class MCU_pwm:
self._shutdown_value = max(0., min(1., shutdown_value))
self._is_static = is_static
def build_config(self):
- if self._hard_pwm:
+ cycle_ticks = self._mcu.seconds_to_clock(self._cycle_time)
+ if self._hardware_pwm:
self._pwm_max = self._mcu.get_constant_float("PWM_MAX")
if self._is_static:
self._mcu.add_config_cmd(
"set_pwm_out pin=%s cycle_ticks=%d value=%d" % (
- self._pin, self._cycle_time,
+ self._pin, cycle_ticks,
self._static_value * self._pwm_max))
return
self._oid = self._mcu.create_oid()
self._mcu.add_config_cmd(
"config_pwm_out oid=%d pin=%s cycle_ticks=%d value=%d"
" default_value=%d max_duration=%d" % (
- self._oid, self._pin, self._cycle_time,
+ self._oid, self._pin, cycle_ticks,
self._start_value * self._pwm_max,
self._shutdown_value * self._pwm_max,
self._mcu.seconds_to_clock(self._max_duration)))
@@ -341,8 +337,7 @@ class MCU_pwm:
self._mcu.add_config_cmd(
"config_soft_pwm_out oid=%d pin=%s cycle_ticks=%d value=%d"
" default_value=%d max_duration=%d" % (
- self._oid, self._pin,
- self._mcu.seconds_to_clock(self._cycle_time),
+ self._oid, self._pin, cycle_ticks,
self._start_value >= 0.5, self._shutdown_value >= 0.5,
self._mcu.seconds_to_clock(self._max_duration)))
self._set_cmd = self._mcu.lookup_command(