Version 1.3.21T

- M301 set PID Parameter, After PID values change use M500 to store to EEPROM
- If no PID is used, deaktivate Variables for PID settings
This commit is contained in:
midopple 2012-07-18 20:06:12 +02:00
parent 9fe56bac47
commit eb9de32b30
5 changed files with 82 additions and 27 deletions

View file

@ -127,7 +127,16 @@
- Extra Parameter for Max Extruder Jerk
- New Parameter (max_e_jerk) in EEPROM --> Default settings after update !
Version 1.3.20T
- fix a few typos and correct english usage
- reimplement homing routine as an inline function
- refactor eeprom routines to make it possible to modify the value of a single parameter
- calculate eeprom parameter addresses based on previous param address plus sizeof(type)
- add 0 C point in Thermistortable 7
Version 1.3.21T
- M301 set PID Parameter, and Store to EEPROM
- If no PID is used, deaktivate Variables for PID settings
*/
@ -219,6 +228,7 @@ void __cxa_pure_virtual(){};
// M220 - set speed factor override percentage S=factor in percent
// M221 - set extruder multiply factor S100 --> original Extrude Speed
// M301 - Set PID parameters P I and D
// M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C)
// M400 - Finish all moves
@ -234,7 +244,7 @@ void __cxa_pure_virtual(){};
// M603 - Show Free Ram
#define _VERSION_TEXT "1.3.19T / 11.06.2012"
#define _VERSION_TEXT "1.3.21T / 17.07.2012"
//Stepper Movement Variables
char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'};
@ -250,7 +260,9 @@ float max_xy_jerk = _MAX_XY_JERK;
float max_z_jerk = _MAX_Z_JERK;
float max_e_jerk = _MAX_E_JERK;
unsigned long min_seg_time = _MIN_SEG_TIME;
unsigned int Kp = PID_PGAIN, Ki = PID_IGAIN, Kd = PID_DGAIN;
#ifdef PIDTEMP
unsigned int PID_Kp = PID_PGAIN, PID_Ki = PID_IGAIN, PID_Kd = PID_DGAIN;
#endif
long max_acceleration_units_per_sq_second[4] = _MAX_ACCELERATION_UNITS_PER_SQ_SECOND; // X, Y, Z and E max acceleration in mm/s^2 for printing moves or retracts
@ -851,6 +863,10 @@ void setup()
//second value --> Print settings to UART
EEPROM_RetrieveSettings(false,false);
#endif
#ifdef PIDTEMP
updatePID();
#endif
//Free Ram
showString(PSTR("Free Ram: "));
@ -1817,6 +1833,16 @@ FORCE_INLINE void process_commands()
}
}
break;
#ifdef PIDTEMP
case 301: // M301
{
if(code_seen('P')) PID_Kp = code_value();
if(code_seen('I')) PID_Ki = code_value();
if(code_seen('D')) PID_Kd = code_value();
updatePID();
}
break;
#endif //PIDTEMP
#ifdef PID_AUTOTUNE
case 303: // M303 PID autotune
{

View file

@ -66,8 +66,8 @@ unsigned long previous_millis_heater, previous_millis_bed_heater, previous_milli
//int output;
int error;
int heater_duty = 0;
const int temp_iState_min = 256L * -PID_INTEGRAL_DRIVE_MAX / PID_IGAIN;
const int temp_iState_max = 256L * PID_INTEGRAL_DRIVE_MAX / PID_IGAIN;
int temp_iState_min = 256L * -PID_INTEGRAL_DRIVE_MAX / PID_IGAIN;
int temp_iState_max = 256L * PID_INTEGRAL_DRIVE_MAX / PID_IGAIN;
#endif
@ -496,6 +496,14 @@ void PID_autotune(int PIDAT_test_temp)
}
#endif
//---------------- END AUTOTUNE PID ------------------------------
void updatePID()
{
#ifdef PIDTEMP
temp_iState_min = (256L * -PID_INTEGRAL_DRIVE_MAX) / PID_Ki;
temp_iState_max = (256L * PID_INTEGRAL_DRIVE_MAX) / PID_Ki;
#endif
}
void manage_heater()
{
@ -637,7 +645,7 @@ void PID_autotune(int PIDAT_test_temp)
int delta_temp = current_temp - prev_temp;
prev_temp = current_temp;
pTerm = ((long)PID_PGAIN * error) / 256;
pTerm = ((long)PID_Kp * error) / 256;
const int H0 = min(HEATER_DUTY_FOR_SETPOINT(target_temp),HEATER_CURRENT);
heater_duty = H0 + pTerm;
@ -645,7 +653,7 @@ void PID_autotune(int PIDAT_test_temp)
{
temp_iState += error;
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
iTerm = ((long)PID_IGAIN * temp_iState) / 256;
iTerm = ((long)PID_Ki * temp_iState) / 256;
heater_duty += iTerm;
}
@ -656,7 +664,7 @@ void PID_autotune(int PIDAT_test_temp)
if(prev_error > 9){ prev_error /= 9; log3 += 2; }
if(prev_error > 3){ prev_error /= 3; log3 ++; }
dTerm = ((long)PID_DGAIN * delta_temp) / (256*log3);
dTerm = ((long)PID_Kd * delta_temp) / (256*log3);
heater_duty += dTerm;
heater_duty = constrain(heater_duty, 0, HEATER_CURRENT);

View file

@ -88,6 +88,8 @@ extern unsigned char manage_monitor;
extern int dTerm;
extern int error;
extern int heater_duty;
extern unsigned int PID_Kp, PID_Ki, PID_Kd;
#endif
#if defined(FAN_SOFT_PWM) && (FAN_PIN > -1)
@ -123,4 +125,8 @@ extern unsigned char manage_monitor;
void PID_autotune(int PIDAT_test_temp);
#endif
#ifdef PIDTEMP
void updatePID();
#endif
void manage_heater();

View file

@ -23,6 +23,9 @@
#include "store_eeprom.h"
#include "Configuration.h"
#ifdef PIDTEMP
extern unsigned int PID_Kp, PID_Ki, PID_Kd;
#endif
#ifdef USE_EEPROM_SETTINGS
@ -65,10 +68,17 @@ void EEPROM_StoreSettings()
EEPROM_write_setting(max_z_jerk_address, max_z_jerk);
EEPROM_write_setting(max_e_jerk_address, max_e_jerk);
//PID Settings, not used yet --> placeholder
EEPROM_write_setting(Kp_address, Kp); //Kp
EEPROM_write_setting(Ki_address, Ki); //Ki
EEPROM_write_setting(Kd_address, Kd); //Kd
//PID Settings
#ifdef PIDTEMP
EEPROM_write_setting(Kp_address, PID_Kp); //Kp
EEPROM_write_setting(Ki_address, PID_Ki); //Ki
EEPROM_write_setting(Kd_address, PID_Kd); //Kd
#else
EEPROM_write_setting(Kp_address, 2048); //Kp
EEPROM_write_setting(Ki_address, 32); //Ki
EEPROM_write_setting(Kd_address, 2048); //Kd
#endif
char ver2[4]=EEPROM_VERSION;
EEPROM_write_setting(EEPROM_OFFSET, ver2); // validate data
@ -123,7 +133,7 @@ void EEPROM_printSettings()
showString(PSTR(" T" ));
Serial.print(mintravelfeedrate );
// showString(PSTR(" B"));
// Serial.print(minsegmenttime );
// Serial.print(min_seg_time );
showString(PSTR(" X"));
Serial.print(max_xy_jerk );
showString(PSTR(" Z"));
@ -133,15 +143,15 @@ void EEPROM_printSettings()
#ifdef PIDTEMP
/*
showString(PSTR("PID settings:");
showString(PSTR(" M301 P"));
Serial.print(Kp);
showString(PSTR("PID settings:\r\n"));
showString(PSTR(" M301 P"));
Serial.print(PID_Kp);
showString(PSTR(" I"));
Serial.print(Ki);
SshowString(PSTR(" D"));
Serial.print(Kd);
*/
Serial.print(PID_Ki);
showString(PSTR(" D"));
Serial.println(PID_Kd);
#endif
#endif
@ -169,9 +179,12 @@ void EEPROM_RetrieveSettings(bool def, bool printout)
EEPROM_read_setting(max_xy_jerk_address, max_xy_jerk);
EEPROM_read_setting(max_z_jerk_address, max_z_jerk);
EEPROM_read_setting(max_e_jerk_address, max_e_jerk);
EEPROM_read_setting(Kp_address, Kp);
EEPROM_read_setting(Ki_address, Ki);
EEPROM_read_setting(Kd_address, Kd);
#ifdef PIDTEMP
EEPROM_read_setting(Kp_address, PID_Kp);
EEPROM_read_setting(Ki_address, PID_Ki);
EEPROM_read_setting(Kd_address, PID_Kd);
#endif
showString(PSTR("Stored settings retreived\r\n"));
}
@ -195,9 +208,12 @@ void EEPROM_RetrieveSettings(bool def, bool printout)
max_z_jerk=_MAX_Z_JERK;
max_e_jerk=_MAX_E_JERK;
min_seg_time=_MIN_SEG_TIME;
Kp = PID_PGAIN;
Ki = PID_IGAIN;
Kd = PID_DGAIN;
#ifdef PIDTEMP
PID_Kp = PID_PGAIN;
PID_Ki = PID_IGAIN;
PID_Kd = PID_DGAIN;
#endif
showString(PSTR("Using Default settings\r\n"));
}

View file

@ -41,7 +41,6 @@ extern float max_xy_jerk;
extern float max_z_jerk;
extern float max_e_jerk;
extern unsigned long min_seg_time;
extern unsigned int Kp, Ki, Kd;
#define axis_steps_per_unit_address (EEPROM_OFFSET + 4*sizeof(char))
#define max_feedrate_address (axis_steps_per_unit_address + 4*sizeof(float))