|
@ -128,7 +128,7 @@ volatile bool Temperature::temp_meas_ready = false; |
|
|
|
|
|
|
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
float Temperature::cTerm[HOTENDS]; |
|
|
float Temperature::cTerm[HOTENDS]; |
|
|
long Temperature::last_position[HOTENDS]; |
|
|
long Temperature::last_e_position; |
|
|
long Temperature::lpq[LPQ_MAX_LEN]; |
|
|
long Temperature::lpq[LPQ_MAX_LEN]; |
|
|
int Temperature::lpq_ptr = 0; |
|
|
int Temperature::lpq_ptr = 0; |
|
|
#endif |
|
|
#endif |
|
@ -444,11 +444,11 @@ Temperature::Temperature() { } |
|
|
|
|
|
|
|
|
void Temperature::updatePID() { |
|
|
void Temperature::updatePID() { |
|
|
#if ENABLED(PIDTEMP) |
|
|
#if ENABLED(PIDTEMP) |
|
|
|
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
|
|
|
last_e_position = 0; |
|
|
|
|
|
#endif |
|
|
HOTEND_LOOP() { |
|
|
HOTEND_LOOP() { |
|
|
temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki, e); |
|
|
temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki, e); |
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
|
|
|
last_position[e] = 0; |
|
|
|
|
|
#endif |
|
|
|
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
#if ENABLED(PIDTEMPBED) |
|
|
#if ENABLED(PIDTEMPBED) |
|
@ -531,10 +531,8 @@ float Temperature::get_pid_output(int e) { |
|
|
#if HOTENDS == 1 |
|
|
#if HOTENDS == 1 |
|
|
UNUSED(e); |
|
|
UNUSED(e); |
|
|
#define _HOTEND_TEST true |
|
|
#define _HOTEND_TEST true |
|
|
#define _HOTEND_EXTRUDER active_extruder |
|
|
|
|
|
#else |
|
|
#else |
|
|
#define _HOTEND_TEST e == active_extruder |
|
|
#define _HOTEND_TEST e == active_extruder |
|
|
#define _HOTEND_EXTRUDER e |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
float pid_output; |
|
|
float pid_output; |
|
|
#if ENABLED(PIDTEMP) |
|
|
#if ENABLED(PIDTEMP) |
|
@ -566,14 +564,14 @@ float Temperature::get_pid_output(int e) { |
|
|
cTerm[HOTEND_INDEX] = 0; |
|
|
cTerm[HOTEND_INDEX] = 0; |
|
|
if (_HOTEND_TEST) { |
|
|
if (_HOTEND_TEST) { |
|
|
long e_position = stepper.position(E_AXIS); |
|
|
long e_position = stepper.position(E_AXIS); |
|
|
if (e_position > last_position[_HOTEND_EXTRUDER]) { |
|
|
if (e_position > last_e_position) { |
|
|
lpq[lpq_ptr++] = e_position - last_position[_HOTEND_EXTRUDER]; |
|
|
lpq[lpq_ptr] = e_position - last_e_position; |
|
|
last_position[_HOTEND_EXTRUDER] = e_position; |
|
|
last_e_position = e_position; |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
lpq[lpq_ptr++] = 0; |
|
|
lpq[lpq_ptr] = 0; |
|
|
} |
|
|
} |
|
|
if (lpq_ptr >= lpq_len) lpq_ptr = 0; |
|
|
if (++lpq_ptr >= lpq_len) lpq_ptr = 0; |
|
|
cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] / planner.axis_steps_per_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX); |
|
|
cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] / planner.axis_steps_per_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX); |
|
|
pid_output += cTerm[HOTEND_INDEX]; |
|
|
pid_output += cTerm[HOTEND_INDEX]; |
|
|
} |
|
|
} |
|
@ -952,7 +950,7 @@ void Temperature::init() { |
|
|
temp_iState_min[e] = 0.0; |
|
|
temp_iState_min[e] = 0.0; |
|
|
temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki, e); |
|
|
temp_iState_max[e] = (PID_INTEGRAL_DRIVE_MAX) / PID_PARAM(Ki, e); |
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
#if ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
last_position[e] = 0; |
|
|
last_e_position = 0; |
|
|
#endif |
|
|
#endif |
|
|
#endif //PIDTEMP
|
|
|
#endif //PIDTEMP
|
|
|
#if ENABLED(PIDTEMPBED) |
|
|
#if ENABLED(PIDTEMPBED) |
|
@ -961,6 +959,10 @@ void Temperature::init() { |
|
|
#endif //PIDTEMPBED
|
|
|
#endif //PIDTEMPBED
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(PIDTEMP) && ENABLED(PID_ADD_EXTRUSION_RATE) |
|
|
|
|
|
last_e_position = 0; |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#if HAS_HEATER_0 |
|
|
#if HAS_HEATER_0 |
|
|
SET_OUTPUT(HEATER_0_PIN); |
|
|
SET_OUTPUT(HEATER_0_PIN); |
|
|
#endif |
|
|
#endif |
|
|