From 8dc81d82d0dbed10336ddc9873d47fd58534b9a3 Mon Sep 17 00:00:00 2001 From: CF3B5 Date: Wed, 1 Dec 2021 18:04:25 +0800 Subject: [PATCH 1/6] add temperature_fan the reverse working mode to some internal circulation heating fans --- klippy/extras/temperature_fan.py | 47 ++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/klippy/extras/temperature_fan.py b/klippy/extras/temperature_fan.py index 61ac5623d..087b70353 100644 --- a/klippy/extras/temperature_fan.py +++ b/klippy/extras/temperature_fan.py @@ -139,15 +139,18 @@ def set_max_speed(self, speed): class ControlBangBang: def __init__(self, temperature_fan, config): self.temperature_fan = temperature_fan - self.max_delta = config.getfloat("max_delta", 2.0, above=0.0) + self.reverse = config.getboolean('reverse', False) + self.max_delta = config.getfloat('max_delta', 2.0, above=0.) self.heating = False def temperature_callback(self, read_time, temp): current_temp, target_temp = self.temperature_fan.get_temp(read_time) - if self.heating and temp >= target_temp + self.max_delta: - self.heating = False - elif not self.heating and temp <= target_temp - self.max_delta: - self.heating = True + if (self.heating != self.reverse + and temp >= target_temp + self.max_delta): + self.heating = self.reverse + elif (not self.heating == self.reverse + and temp <= target_temp - self.max_delta): + self.heating = not self.reverse if self.heating: self.temperature_fan.set_speed(read_time, 0.0) else: @@ -167,13 +170,14 @@ def temperature_callback(self, read_time, temp): class ControlPID: def __init__(self, temperature_fan, config): self.temperature_fan = temperature_fan - self.Kp = config.getfloat("pid_Kp") / PID_PARAM_BASE - self.Ki = config.getfloat("pid_Ki") / PID_PARAM_BASE - self.Kd = config.getfloat("pid_Kd") / PID_PARAM_BASE - self.min_deriv_time = config.getfloat("pid_deriv_time", 2.0, above=0.0) - self.temp_integ_max = 0.0 - if self.Ki: - self.temp_integ_max = self.temperature_fan.get_max_speed() / self.Ki + self.reverse = config.getboolean('reverse', False) + self.Kp = config.getfloat('pid_Kp') / PID_PARAM_BASE + self.Ki = config.getfloat('pid_Ki') / PID_PARAM_BASE + self.Kd = config.getfloat('pid_Kd') / PID_PARAM_BASE + self.min_deriv_time = config.getfloat('pid_deriv_time', 2., above=0.) + imax = config.getfloat('pid_integral_max', + self.temperature_fan.get_max_speed(), minval=0.) + self.temp_integ_max = imax / self.Ki self.prev_temp = AMBIENT_TEMP self.prev_temp_time = 0.0 self.prev_temp_deriv = 0.0 @@ -196,15 +200,16 @@ def temperature_callback(self, read_time, temp): temp_integ = self.prev_temp_integ + temp_err * time_diff temp_integ = max(0.0, min(self.temp_integ_max, temp_integ)) # Calculate output - co = self.Kp * temp_err + self.Ki * temp_integ - self.Kd * temp_deriv - bounded_co = max(0.0, min(self.temperature_fan.get_max_speed(), co)) - self.temperature_fan.set_speed( - read_time, - max( - self.temperature_fan.get_min_speed(), - self.temperature_fan.get_max_speed() - bounded_co, - ), - ) + co = self.Kp*temp_err + self.Ki*temp_integ - self.Kd*temp_deriv + bounded_co = max(0., min(self.temperature_fan.get_max_speed(), co)) + if not self.reverse: + self.temperature_fan.set_speed( + read_time, max(self.temperature_fan.get_min_speed(), + self.temperature_fan.get_max_speed() - bounded_co)) + else: + self.temperature_fan.set_speed( + read_time, max(self.temperature_fan.get_min_speed(), + bounded_co)) # Store state for next measurement self.prev_temp = temp self.prev_temp_time = read_time From f5e9f4085a0ae2e6026c09d6bfb098f88d2a8277 Mon Sep 17 00:00:00 2001 From: CF3B5 Date: Wed, 1 Dec 2021 18:59:37 +0800 Subject: [PATCH 2/6] add temperature_fan the reverse working mode to some internal circulation heating fans(fix line longer) --- klippy/extras/temperature_fan.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/klippy/extras/temperature_fan.py b/klippy/extras/temperature_fan.py index 087b70353..ee7a9a070 100644 --- a/klippy/extras/temperature_fan.py +++ b/klippy/extras/temperature_fan.py @@ -204,8 +204,9 @@ def temperature_callback(self, read_time, temp): bounded_co = max(0., min(self.temperature_fan.get_max_speed(), co)) if not self.reverse: self.temperature_fan.set_speed( - read_time, max(self.temperature_fan.get_min_speed(), - self.temperature_fan.get_max_speed() - bounded_co)) + read_time, max( + self.temperature_fan.get_min_speed(), + self.temperature_fan.get_max_speed() - bounded_co)) else: self.temperature_fan.set_speed( read_time, max(self.temperature_fan.get_min_speed(), From b38e205dc774b17e8d0ee43ea6d25b840bb406b9 Mon Sep 17 00:00:00 2001 From: CF3B5 Date: Wed, 1 Dec 2021 19:52:09 +0800 Subject: [PATCH 3/6] temperature_fan: add reverse working mode --- docs/Config_Reference.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index 6cbd4be37..39bc83892 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -2892,6 +2892,10 @@ information. #gcode_id: # If set, the temperature will be reported in M105 queries using the # given id. The default is to not report the temperature via M105. +#reverse: False +# If true, the working mode of the fan is reversed. If the temperature +# is lower than the target temperature, the fan speed increases; +# otherwise, the fan speed decreases. ``` ### [fan_generic] From 13c50f2a4e25913eccb7f6bd901206b7038ec631 Mon Sep 17 00:00:00 2001 From: CF3B5 Date: Wed, 1 Dec 2021 19:54:24 +0800 Subject: [PATCH 4/6] temperature_fan: add reverse working mode --- docs/Config_Reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index 39bc83892..69f4707b7 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -2894,7 +2894,7 @@ information. # given id. The default is to not report the temperature via M105. #reverse: False # If true, the working mode of the fan is reversed. If the temperature -# is lower than the target temperature, the fan speed increases; +# is lower than the target temperature, the fan speed increases; # otherwise, the fan speed decreases. ``` From 6388036f4ce7ae9acefcfdc7f26b87500c2145e2 Mon Sep 17 00:00:00 2001 From: CF3B5 Date: Sun, 20 Mar 2022 11:48:17 +0800 Subject: [PATCH 5/6] Add default is False in comment --- docs/Config_Reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index 69f4707b7..9916e50ed 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -2896,6 +2896,7 @@ information. # If true, the working mode of the fan is reversed. If the temperature # is lower than the target temperature, the fan speed increases; # otherwise, the fan speed decreases. +# The default is False. ``` ### [fan_generic] From a6c3984df27d4a04b0b03c38408f26a1bcceeaf7 Mon Sep 17 00:00:00 2001 From: Brandon Nance Date: Fri, 1 Sep 2023 15:46:31 -0400 Subject: [PATCH 6/6] black --- README.md | 3 +++ klippy/extras/temperature_fan.py | 46 +++++++++++++++++++------------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 88e2b6cbc..5aa5be666 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ Features merged into the master branch: - [fan: Normalising Fan PWM power](https://github.com/DangerKlippers/danger-klipper/pull/44) ([klipper#6307](https://github.com/Klipper3d/klipper/pull/6307)) +- [fan: Reverse FAN](https://github.com/DangerKlippers/danger-klipper/pull/51) ([klipper#4983](https://github.com/Klipper3d/klipper/pull/4983)) + - [heater: Modify PID without reload](https://github.com/DangerKlippers/danger-klipper/pull/35) - [heater: Velocity PID](https://github.com/DangerKlippers/danger-klipper/pull/47) ([klipper#6272](https://github.com/Klipper3d/klipper/pull/6272)) @@ -22,6 +24,7 @@ Features merged into the master branch: - [probe: Drop the first result](https://github.com/DangerKlippers/danger-klipper/pull/2) ([klipper#3397](https://github.com/Klipper3d/klipper/issues/3397)) + "Dangerous Klipper for dangerous users" [![Klipper](docs/img/klipper-logo-small.png)](https://DangerKlippers.github.io/danger-klipper/) diff --git a/klippy/extras/temperature_fan.py b/klippy/extras/temperature_fan.py index ee7a9a070..2713b3118 100644 --- a/klippy/extras/temperature_fan.py +++ b/klippy/extras/temperature_fan.py @@ -139,17 +139,21 @@ def set_max_speed(self, speed): class ControlBangBang: def __init__(self, temperature_fan, config): self.temperature_fan = temperature_fan - self.reverse = config.getboolean('reverse', False) - self.max_delta = config.getfloat('max_delta', 2.0, above=0.) + self.reverse = config.getboolean("reverse", False) + self.max_delta = config.getfloat("max_delta", 2.0, above=0.0) self.heating = False def temperature_callback(self, read_time, temp): current_temp, target_temp = self.temperature_fan.get_temp(read_time) - if (self.heating != self.reverse - and temp >= target_temp + self.max_delta): + if ( + self.heating != self.reverse + and temp >= target_temp + self.max_delta + ): self.heating = self.reverse - elif (not self.heating == self.reverse - and temp <= target_temp - self.max_delta): + elif ( + not self.heating == self.reverse + and temp <= target_temp - self.max_delta + ): self.heating = not self.reverse if self.heating: self.temperature_fan.set_speed(read_time, 0.0) @@ -170,13 +174,14 @@ def temperature_callback(self, read_time, temp): class ControlPID: def __init__(self, temperature_fan, config): self.temperature_fan = temperature_fan - self.reverse = config.getboolean('reverse', False) - self.Kp = config.getfloat('pid_Kp') / PID_PARAM_BASE - self.Ki = config.getfloat('pid_Ki') / PID_PARAM_BASE - self.Kd = config.getfloat('pid_Kd') / PID_PARAM_BASE - self.min_deriv_time = config.getfloat('pid_deriv_time', 2., above=0.) - imax = config.getfloat('pid_integral_max', - self.temperature_fan.get_max_speed(), minval=0.) + self.reverse = config.getboolean("reverse", False) + self.Kp = config.getfloat("pid_Kp") / PID_PARAM_BASE + self.Ki = config.getfloat("pid_Ki") / PID_PARAM_BASE + self.Kd = config.getfloat("pid_Kd") / PID_PARAM_BASE + self.min_deriv_time = config.getfloat("pid_deriv_time", 2.0, above=0.0) + imax = config.getfloat( + "pid_integral_max", self.temperature_fan.get_max_speed(), minval=0.0 + ) self.temp_integ_max = imax / self.Ki self.prev_temp = AMBIENT_TEMP self.prev_temp_time = 0.0 @@ -200,17 +205,20 @@ def temperature_callback(self, read_time, temp): temp_integ = self.prev_temp_integ + temp_err * time_diff temp_integ = max(0.0, min(self.temp_integ_max, temp_integ)) # Calculate output - co = self.Kp*temp_err + self.Ki*temp_integ - self.Kd*temp_deriv - bounded_co = max(0., min(self.temperature_fan.get_max_speed(), co)) + co = self.Kp * temp_err + self.Ki * temp_integ - self.Kd * temp_deriv + bounded_co = max(0.0, min(self.temperature_fan.get_max_speed(), co)) if not self.reverse: self.temperature_fan.set_speed( - read_time, max( + read_time, + max( self.temperature_fan.get_min_speed(), - self.temperature_fan.get_max_speed() - bounded_co)) + self.temperature_fan.get_max_speed() - bounded_co, + ), + ) else: self.temperature_fan.set_speed( - read_time, max(self.temperature_fan.get_min_speed(), - bounded_co)) + read_time, max(self.temperature_fan.get_min_speed(), bounded_co) + ) # Store state for next measurement self.prev_temp = temp self.prev_temp_time = read_time