diff options
author | Douglas Hammond <wizhippo@gmail.com> | 2019-03-28 14:07:40 -0400 |
---|---|---|
committer | KevinOConnor <kevin@koconnor.net> | 2019-03-28 14:07:40 -0400 |
commit | c105adc80bbcdc7daf5c86ec7ec49511a36a3cbd (patch) | |
tree | 17c16087d03869c589dec51d02b4c8faf7474c7d /klippy/extras/temperature_fan.py | |
parent | 5913170b6ba08c87f63282577b32df0e91c43967 (diff) | |
download | kutter-c105adc80bbcdc7daf5c86ec7ec49511a36a3cbd.tar.gz kutter-c105adc80bbcdc7daf5c86ec7ec49511a36a3cbd.tar.xz kutter-c105adc80bbcdc7daf5c86ec7ec49511a36a3cbd.zip |
temperature_fan: Fix. Temperature fan min speed should be used (#1405)
Signed-off-by: Douglas Hammond <wizhippo@gmail.com>
Diffstat (limited to 'klippy/extras/temperature_fan.py')
-rwxr-xr-x[-rw-r--r--] | klippy/extras/temperature_fan.py | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/klippy/extras/temperature_fan.py b/klippy/extras/temperature_fan.py index f699e4fb..56fe76c9 100644..100755 --- a/klippy/extras/temperature_fan.py +++ b/klippy/extras/temperature_fan.py @@ -15,7 +15,6 @@ class TemperatureFan: self.name = config.get_name().split()[1] self.printer = config.get_printer() self.fan = fan.PrinterFan(config, default_shutdown_speed=1.) - self.mcu = self.fan.mcu_fan.get_mcu() self.min_temp = config.getfloat('min_temp', minval=KELVIN_TO_CELCIUS) self.max_temp = config.getfloat('max_temp', above=self.min_temp) self.sensor = self.printer.lookup_object('heater').setup_sensor(config) @@ -36,8 +35,10 @@ class TemperatureFan: self.next_speed_time = 0. self.last_speed_value = 0. def set_speed(self, read_time, value): - if value < self.min_speed: + if value <= 0.: value = 0. + elif value < self.min_speed: + value = self.min_speed if self.target_temp <= 0.: value = 0. if ((read_time < self.next_speed_time or not self.last_speed_value) @@ -53,6 +54,10 @@ class TemperatureFan: self.control.temperature_callback(read_time, temp) def get_temp(self, eventtime): return self.last_temp, self.target_temp + def get_min_speed(self): + return self.min_speed + def get_max_speed(self): + return self.max_speed ###################################################################### # Bang-bang control algo @@ -64,17 +69,18 @@ class ControlBangBang: 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 >= self.temperature_fan.target_temp+self.max_delta): + and temp >= target_temp+self.max_delta): self.heating = False elif (not self.heating - and temp <= self.temperature_fan.target_temp-self.max_delta): + and temp <= target_temp-self.max_delta): self.heating = True if self.heating: self.temperature_fan.set_speed(read_time, 0.) else: self.temperature_fan.set_speed(read_time, - self.temperature_fan.max_speed) + self.temperature_fan.get_max_speed()) ###################################################################### # Proportional Integral Derivative (PID) control algo @@ -90,14 +96,15 @@ class ControlPID: 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', temperature_fan.max_speed, - minval=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. self.prev_temp_deriv = 0. self.prev_temp_integ = 0. def temperature_callback(self, read_time, temp): + current_temp, target_temp = self.temperature_fan.get_temp(read_time) time_diff = read_time - self.prev_temp_time # Calculate change of temperature temp_diff = temp - self.prev_temp @@ -107,14 +114,15 @@ class ControlPID: temp_deriv = (self.prev_temp_deriv * (self.min_deriv_time-time_diff) + temp_diff) / self.min_deriv_time # Calculate accumulated temperature "error" - temp_err = self.temperature_fan.target_temp - temp + temp_err = target_temp - temp temp_integ = self.prev_temp_integ + temp_err * time_diff temp_integ = max(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.max_speed, co)) + bounded_co = max(0., min(self.temperature_fan.get_max_speed(), co)) self.temperature_fan.set_speed( - read_time, self.temperature_fan.max_speed - bounded_co) + read_time, max(self.temperature_fan.get_min_speed(), + self.temperature_fan.get_max_speed() - bounded_co)) # Store state for next measurement self.prev_temp = temp self.prev_temp_time = read_time |