Make multiple PID parameters a config option

* Adds config parameter `PID_PARAMS_PER_EXTRUDER` - allows single PID
parameters to be used where this would be preferable (e.g. dual
identical extruders)
* When disabled, will use `float Kp, Ki, Kd, Kc;` as before.
Preprocessor macros used to switch between.
* ultralcd.cpp defines extra menus for extra parameters only where
required
* M301 reports `e:xx` only if independent pid parameters enabled
* EEPROM structure still leaves space for 3 extruders worth, when undef
will save single parameter to all extruder positions, but only read the
first
* Switching off saves approx 330 B with no LCD enabled, 2634B with LCD
(RRD) enabled: this is significant.
* LCD modifications should be tested.
This commit is contained in:
grob6000
2015-01-11 13:50:17 +11:00
parent 0877aa0fe0
commit bf2c923db5
6 changed files with 96 additions and 70 deletions

View File

@ -3209,27 +3209,29 @@ Sigma_Exit:
if (e < EXTRUDERS) // catch bad input value
{
if (code_seen('P')) Kp[e] = code_value();
if (code_seen('I')) Ki[e] = scalePID_i(code_value());
if (code_seen('D')) Kd[e] = scalePID_d(code_value());
if (code_seen('P')) PID_PARAM(Kp,e) = code_value();
if (code_seen('I')) PID_PARAM(Ki,e) = scalePID_i(code_value());
if (code_seen('D')) PID_PARAM(Kd,e) = scalePID_d(code_value());
#ifdef PID_ADD_EXTRUSION_RATE
if (code_seen('C')) Kc[e] = code_value();
if (code_seen('C')) PID_PARAM(Kc,e) = code_value();
#endif
updatePID();
SERIAL_PROTOCOL(MSG_OK);
SERIAL_PROTOCOL(" e:"); // specify extruder in serial output
SERIAL_PROTOCOL(e);
#ifdef PID_PARAMS_PER_EXTRUDER
SERIAL_PROTOCOL(" e:"); // specify extruder in serial output
SERIAL_PROTOCOL(e);
#endif // PID_PARAMS_PER_EXTRUDER
SERIAL_PROTOCOL(" p:");
SERIAL_PROTOCOL(Kp[e]);
SERIAL_PROTOCOL(PID_PARAM(Kp,e));
SERIAL_PROTOCOL(" i:");
SERIAL_PROTOCOL(unscalePID_i(Ki[e]));
SERIAL_PROTOCOL(unscalePID_i(PID_PARAM(Ki,e)));
SERIAL_PROTOCOL(" d:");
SERIAL_PROTOCOL(unscalePID_d(Kd[e]));
SERIAL_PROTOCOL(unscalePID_d(PID_PARAM(Kd,e)));
#ifdef PID_ADD_EXTRUSION_RATE
SERIAL_PROTOCOL(" c:");
//Kc does not have scaling applied above, or in resetting defaults
SERIAL_PROTOCOL(Kc[e]);
SERIAL_PROTOCOL(PID_PARAM(Kc,e));
#endif
SERIAL_PROTOCOLLN("");