diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 740c7bc79..f05e23211 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -448,10 +448,6 @@ void report_current_position(); filament_change_load_length[EXTRUDERS]; #endif -#if ENABLED(PID_EXTRUSION_SCALING) - extern int lpq_len; -#endif - #if HAS_POWER_SWITCH extern bool powersupply_on; #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PS_ON_AWAKE); powersupply_on = true; }while(0) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index d7c6ccc0d..e590c73d5 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -696,10 +696,6 @@ static bool send_ok[BUFSIZE]; bool chdkActive = false; #endif -#if ENABLED(PID_EXTRUSION_SCALING) - int lpq_len = 20; -#endif - #if ENABLED(HOST_KEEPALIVE_FEATURE) MarlinBusyState busy_state = NOT_BUSY; static millis_t next_busy_signal_ms = 0; @@ -9598,7 +9594,7 @@ inline void gcode_M226() { * With PID_EXTRUSION_SCALING: * * C[float] Kc term - * L[float] LPQ length + * L[int] LPQ length */ inline void gcode_M301() { @@ -9612,8 +9608,9 @@ inline void gcode_M226() { if (parser.seen('D')) PID_PARAM(Kd, e) = scalePID_d(parser.value_float()); #if ENABLED(PID_EXTRUSION_SCALING) if (parser.seen('C')) PID_PARAM(Kc, e) = parser.value_float(); - if (parser.seen('L')) lpq_len = parser.value_float(); - NOMORE(lpq_len, LPQ_MAX_LEN); + if (parser.seen('L')) thermalManager.lpq_len = parser.value_float(); + NOMORE(thermalManager.lpq_len, LPQ_MAX_LEN); + NOLESS(thermalManager.lpq_len, 0); #endif thermalManager.updatePID(); diff --git a/Marlin/configuration_store.cpp b/Marlin/configuration_store.cpp index b78b53aa5..09d753966 100644 --- a/Marlin/configuration_store.cpp +++ b/Marlin/configuration_store.cpp @@ -73,6 +73,10 @@ #include "fwretract.h" #endif +#if ENABLED(PID_EXTRUSION_SCALING) + #define LPQ_LEN thermalManager.lpq_len +#endif + #pragma pack(push, 1) // No padding between variables typedef struct PID { float Kp, Ki, Kd; } PID; @@ -183,7 +187,7 @@ typedef struct SettingsDataStruct { // PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U - int lpq_len; // M301 L + int16_t lpq_len; // M301 L // // PIDTEMPBED @@ -609,9 +613,9 @@ void MarlinSettings::postprocess() { _FIELD_TEST(lpq_len); #if DISABLED(PID_EXTRUSION_SCALING) - int lpq_len = 20; + const int16_t LPQ_LEN = 20; #endif - EEPROM_WRITE(lpq_len); + EEPROM_WRITE(LPQ_LEN); #if DISABLED(PIDTEMPBED) dummy = DUMMY_PID_VALUE; @@ -1213,9 +1217,9 @@ void MarlinSettings::postprocess() { _FIELD_TEST(lpq_len); #if DISABLED(PID_EXTRUSION_SCALING) - int lpq_len; + int16_t LPQ_LEN; #endif - EEPROM_READ(lpq_len); + EEPROM_READ(LPQ_LEN); // // Heated Bed PID @@ -1808,7 +1812,7 @@ void MarlinSettings::reset() { #endif } #if ENABLED(PID_EXTRUSION_SCALING) - lpq_len = 20; // default last-position-queue size + thermalManager.lpq_len = 20; // default last-position-queue size #endif #endif // PIDTEMP @@ -2271,7 +2275,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, e))); #if ENABLED(PID_EXTRUSION_SCALING) SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e)); - if (e == 0) SERIAL_ECHOPAIR(" L", lpq_len); + if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); #endif SERIAL_EOL(); } @@ -2286,7 +2290,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, 0))); #if ENABLED(PID_EXTRUSION_SCALING) SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, 0)); - SERIAL_ECHOPAIR(" L", lpq_len); + SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); #endif SERIAL_EOL(); } diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 6a1ae0855..4ee0ed3ac 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -237,6 +237,10 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS]; uint8_t Temperature::ADCKey_count = 0; #endif +#if ENABLED(PID_EXTRUSION_SCALING) + int16_t Temperature::lpq_len; // Initialized in configuration_store +#endif + #if HAS_PID_HEATING /** @@ -666,14 +670,14 @@ float Temperature::get_pid_output(const int8_t e) { #if ENABLED(PID_EXTRUSION_SCALING) cTerm[HOTEND_INDEX] = 0; if (_HOTEND_TEST) { - long e_position = stepper.position(E_AXIS); + const long e_position = stepper.position(E_AXIS); if (e_position > last_e_position) { lpq[lpq_ptr] = e_position - last_e_position; last_e_position = e_position; } - else { + else lpq[lpq_ptr] = 0; - } + if (++lpq_ptr >= lpq_len) lpq_ptr = 0; cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX); pid_output += cTerm[HOTEND_INDEX]; diff --git a/Marlin/temperature.h b/Marlin/temperature.h index 27358bac6..247f27338 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -304,6 +304,10 @@ class Temperature { static uint8_t ADCKey_count; #endif + #if ENABLED(PID_EXTRUSION_SCALING) + static int16_t lpq_len; + #endif + /** * Instance Methods */