Add PID_FAN_SCALING option (#15585)

This commit is contained in:
haschtl
2019-11-26 10:34:43 +01:00
committed by Scott Lahteine
parent 8ccfdaca02
commit ff6518c0a8
112 changed files with 5377 additions and 22 deletions

View File

@ -37,7 +37,7 @@
*/
// Change EEPROM version if the structure changes
#define EEPROM_VERSION "V72"
#define EEPROM_VERSION "V73"
#define EEPROM_OFFSET 100
// Check the integrity of data offsets.
@ -242,7 +242,7 @@ typedef struct SettingsDataStruct {
//
// PIDTEMP
//
PIDC_t hotendPID[HOTENDS]; // M301 En PIDC / M303 En U
PIDCF_t hotendPID[HOTENDS]; // M301 En PIDCF / M303 En U
int16_t lpq_len; // M301 L
//
@ -785,13 +785,14 @@ void MarlinSettings::postprocess() {
{
_FIELD_TEST(hotendPID);
HOTEND_LOOP() {
PIDC_t pidc = {
PIDCF_t pidcf = {
PID_PARAM(Kp, e),
unscalePID_i(PID_PARAM(Ki, e)),
unscalePID_d(PID_PARAM(Kd, e)),
PID_PARAM(Kc, e)
PID_PARAM(Kc, e),
PID_PARAM(Kf, e)
};
EEPROM_WRITE(pidc);
EEPROM_WRITE(pidcf);
}
_FIELD_TEST(lpq_len);
@ -1586,16 +1587,19 @@ void MarlinSettings::postprocess() {
//
{
HOTEND_LOOP() {
PIDC_t pidc;
EEPROM_READ(pidc);
PIDCF_t pidcf;
EEPROM_READ(pidcf);
#if ENABLED(PIDTEMP)
if (!validating && pidc.Kp != DUMMY_PID_VALUE) {
if (!validating && pidcf.Kp != DUMMY_PID_VALUE) {
// Scale PID values since EEPROM values are unscaled
PID_PARAM(Kp, e) = pidc.Kp;
PID_PARAM(Ki, e) = scalePID_i(pidc.Ki);
PID_PARAM(Kd, e) = scalePID_d(pidc.Kd);
PID_PARAM(Kp, e) = pidcf.Kp;
PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki);
PID_PARAM(Kd, e) = scalePID_d(pidcf.Kd);
#if ENABLED(PID_EXTRUSION_SCALING)
PID_PARAM(Kc, e) = pidc.Kc;
PID_PARAM(Kc, e) = pidcf.Kc;
#endif
#if ENABLED(PID_FAN_SCALING)
PID_PARAM(Kf, e) = pidcf.Kf;
#endif
}
#endif
@ -2446,6 +2450,10 @@ void MarlinSettings::reset() {
#if ENABLED(PID_EXTRUSION_SCALING)
PID_PARAM(Kc, e) = DEFAULT_Kc;
#endif
#if ENABLED(PID_FAN_SCALING)
PID_PARAM(Kf, e) = DEFAULT_Kf;
#endif
}
#endif
@ -3003,6 +3011,9 @@ void MarlinSettings::reset() {
SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e));
if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len);
#endif
#if ENABLED(PID_FAN_SCALING)
SERIAL_ECHOPAIR(" F", PID_PARAM(Kf, e));
#endif
SERIAL_EOL();
}
#endif // PIDTEMP

View File

@ -872,6 +872,15 @@ void Temperature::min_temp_error(const heater_ind_t heater) {
}
#endif // PID_EXTRUSION_SCALING
#if ENABLED(PID_FAN_SCALING)
if (thermalManager.fan_speed[active_extruder] > PID_FAN_SCALING_MIN_SPEED) {
work_pid[ee].Kf = PID_PARAM(Kf, ee) + (PID_FAN_SCALING_LIN_FACTOR) * thermalManager.fan_speed[active_extruder];
pid_output += work_pid[ee].Kf;
}
//pid_output -= work_pid[ee].Ki;
//pid_output += work_pid[ee].Ki * work_pid[ee].Kf
#endif // PID_FAN_SCALING
LIMIT(pid_output, 0, PID_MAX);
}
temp_dState[ee] = temp_hotend[ee].celsius;

View File

@ -55,15 +55,23 @@ typedef enum : int8_t {
// PID storage
typedef struct { float Kp, Ki, Kd; } PID_t;
typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t;
#if ENABLED(PID_EXTRUSION_SCALING)
typedef PIDC_t hotend_pid_t;
#if LPQ_MAX_LEN > 255
typedef uint16_t lpq_ptr_t;
typedef struct { float Kp, Ki, Kd, Kf; } PIDF_t;
typedef struct { float Kp, Ki, Kd, Kc, Kf; } PIDCF_t;
typedef
#if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING)
PIDCF_t
#elif ENABLED(PID_EXTRUSION_SCALING)
PIDC_t
#elif ENABLED(PID_FAN_SCALING)
PIDF_t
#else
typedef uint8_t lpq_ptr_t;
PID_t
#endif
#else
typedef PID_t hotend_pid_t;
hotend_pid_t;
#if ENABLED(PID_EXTRUSION_SCALING)
typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t;
#endif
#define DUMMY_PID_VALUE 3000.0f
@ -77,6 +85,12 @@ typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t;
#else
#define _PID_Kc(H) 1
#endif
#if ENABLED(PID_FAN_SCALING)
#define _PID_Kf(H) Temperature::temp_hotend[H].pid.Kf
#else
#define _PID_Kf(H) 0
#endif
#else
#define _PID_Kp(H) DUMMY_PID_VALUE
#define _PID_Ki(H) DUMMY_PID_VALUE