Merge pull request #4278 from thinkyhead/rc_more_hotends_1

Fixups for PID_ADD_EXTRUSION_RATE and HOTENDS==1
This commit is contained in:
Scott Lahteine 2016-07-12 10:36:13 -07:00 committed by GitHub
commit a1de96d152
2 changed files with 38 additions and 23 deletions

View file

@ -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

View file

@ -76,13 +76,13 @@ class Temperature {
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
#if ENABLED(PID_PARAMS_PER_HOTEND) #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1
static float Kp[HOTENDS], Ki[HOTENDS], Kd[HOTENDS]; static float Kp[HOTENDS], Ki[HOTENDS], Kd[HOTENDS];
#if ENABLED(PID_ADD_EXTRUSION_RATE) #if ENABLED(PID_ADD_EXTRUSION_RATE)
static float Kc[HOTENDS]; static float Kc[HOTENDS];
#endif #endif
#define PID_PARAM(param, e) Temperature::param[e] #define PID_PARAM(param, h) Temperature::param[h]
#else #else
@ -90,7 +90,7 @@ class Temperature {
#if ENABLED(PID_ADD_EXTRUSION_RATE) #if ENABLED(PID_ADD_EXTRUSION_RATE)
static float Kc; static float Kc;
#endif #endif
#define PID_PARAM(param, e) Temperature::param #define PID_PARAM(param, h) Temperature::param
#endif // PID_PARAMS_PER_HOTEND #endif // PID_PARAMS_PER_HOTEND
@ -150,7 +150,7 @@ class Temperature {
#if ENABLED(PID_ADD_EXTRUSION_RATE) #if ENABLED(PID_ADD_EXTRUSION_RATE)
static float cTerm[HOTENDS]; static float cTerm[HOTENDS];
static long last_position[HOTENDS]; static long last_e_position;
static long lpq[LPQ_MAX_LEN]; static long lpq[LPQ_MAX_LEN];
static int lpq_ptr; static int lpq_ptr;
#endif #endif
@ -247,11 +247,24 @@ class Temperature {
* Preheating hotends * Preheating hotends
*/ */
#ifdef MILLISECONDS_PREHEAT_TIME #ifdef MILLISECONDS_PREHEAT_TIME
static bool is_preheating(uint8_t hotend) { static bool is_preheating(uint8_t e) {
return preheat_end_time[hotend] && PENDING(millis(), preheat_end_time[hotend]); #if HOTENDS == 1
UNUSED(e);
#endif
return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]);
}
static void start_preheat_time(uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#endif
preheat_end_time[HOTEND_INDEX] = millis() + MILLISECONDS_PREHEAT_TIME;
}
static void reset_preheat_time(uint8_t e) {
#if HOTENDS == 1
UNUSED(e);
#endif
preheat_end_time[HOTEND_INDEX] = 0;
} }
static void start_preheat_time(uint8_t hotend) { preheat_end_time[hotend] = millis() + MILLISECONDS_PREHEAT_TIME; }
static void reset_preheat_time(uint8_t hotend) { preheat_end_time[hotend] = 0; }
#else #else
#define is_preheating(n) (false) #define is_preheating(n) (false)
#endif #endif
@ -306,9 +319,9 @@ class Temperature {
#endif #endif
#ifdef MILLISECONDS_PREHEAT_TIME #ifdef MILLISECONDS_PREHEAT_TIME
if (celsius == 0.0f) if (celsius == 0.0f)
reset_preheat_time(hotend); reset_preheat_time(HOTEND_INDEX);
else if (target_temperature[hotend] == 0.0f) else if (target_temperature[HOTEND_INDEX] == 0.0f)
start_preheat_time(hotend); start_preheat_time(HOTEND_INDEX);
#endif #endif
target_temperature[HOTEND_INDEX] = celsius; target_temperature[HOTEND_INDEX] = celsius;
#if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0