Skip to content

Commit

Permalink
PID Tyreus-Lyben autotune method
Browse files Browse the repository at this point in the history
  • Loading branch information
Nibbels committed Oct 30, 2017
1 parent a6678ca commit fe1597f
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 43 deletions.
13 changes: 7 additions & 6 deletions README.de_DE.md
Expand Up @@ -29,11 +29,11 @@ Prozessor: `ATMega 2560 (Mega 2560)`,
Port: Der Port des Druckers, wie `COM3`, wenn er korrekt verbunden ist.
- **Prüfen** and **Hochladen** der Firmware zum Drucker.
## Wenn du von Version from 1.37r oder früher updatest, mache bitte einen neuen M303 PID-Autotune bei allen Heizelementen!
- RF2000/RF1000 Extruder 1: `M303 P0 X0 S230 R10 J1`
- RF2000 Extruder 2: `M303 P1 X0 S230 R10 J1`
- RF2000 Heizbett: `M303 P2 X0 S70 R15 J3`
- RF1000 Heizbett: `M303 P1 X0 S70 R15 J3`
Starte mit EEPROM-Werten `PID drive min = 5` and `PID drive max = 100`
- RF2000/RF1000 Extruder 1: `M303 P0 X0 S230 R10 J1`
- RF2000 Extruder 2: `M303 P1 X0 S230 R10 J1`
- RF2000 Heizbett: `M303 P2 X0 S70 R15 J4`
- RF1000 Heizbett: `M303 P1 X0 S70 R15 J4`
Starte mit EEPROM-Werten `PID I drive min = 30` and `PID I drive max = 100`
Oder setze #define PID_CONTROL_DRIVE_MIN_LIMIT_FACTOR zu 10.0f in der configuration.h um die alte Version des PID Reglers zu nutzen.

## Version RF 1.37mod - wichtige Threads im Forum
Expand Down Expand Up @@ -203,7 +203,8 @@ Erweiterter GCode M303:
[J1] Pessen Integral Rule (empfohlen für Hotend)
[J2] Some Overshoot
[J3] No Overshoot (empfohlen für Heizbett)
[J4] bis [J6] sind PD, PI, P-Profile for regelungstechnik experten bzw. spezielle Anwendungsfälle.
[J4] Tyreus-Luyben (empfohlen für Heizbett)
[J5] bis [J7] sind PD, PI, P-Profile for regelungstechnik experten bzw. spezielle Anwendungsfälle.
[Rn] Configurable Autotune cycles
Autotune support über das Druckermenü am Display.
Siehe auch http://www.rf1000.de/viewtopic.php?f=7&t=1963
Expand Down
13 changes: 7 additions & 6 deletions README.md
Expand Up @@ -29,11 +29,11 @@ Processor: `ATMega 2560 (Mega 2560)`,
Port: Your printers Port like `COM3`, if successfully connected.
- **Check** and **Upload** the Firmware to your Printer.
## If you upgrade to this Version from 1.37r or earlier please do a fresh M303 PID-Autotune on all heaters!
- RF2000/RF1000 extruder 1: `M303 P0 X0 S230 R10 J1`
- RF2000 extruder 2: `M303 P1 X0 S230 R10 J1`
- RF2000 heated bed: `M303 P2 X0 S70 R15 J3`
- RF1000 heated bed: `M303 P1 X0 S70 R15 J3`
And start with EEPROM-values `PID drive min = 5` and `PID drive max = 100`
- RF2000/RF1000 extruder 1: `M303 P0 X0 S230 R10 J1`
- RF2000 extruder 2: `M303 P1 X0 S230 R10 J1`
- RF2000 heated bed: `M303 P2 X0 S70 R15 J4`
- RF1000 heated bed: `M303 P1 X0 S70 R15 J4`
And start with EEPROM-values `PID I drive min = 30` and `PID I drive max = 120`
Or set #define PID_CONTROL_DRIVE_MIN_LIMIT_FACTOR to 10.0f in configuration.h to use the old version PID-control.

## Version RF.01.37mod
Expand Down Expand Up @@ -197,7 +197,8 @@ Additions to GCode M303:
[J1] Pessen Integral Rule (suggested for Hotend)
[J2] Some Overshoot
[J3] No Overshoot (suggested for Heated Bed)
[J4] until [J6] are PD, PI, P-Profiles for control experts and special cases.
[J4] Tyreus-Luyben (suggested for Heated Bed)
[J5] until [J7] are PD, PI, P-Profiles for control experts and special cases.
[Rn] Configurable Autotune cycles
Easy autotune support via printers menu.
Siehe auch http://www.rf1000.de/viewtopic.php?f=7&t=1963
Expand Down
1 change: 1 addition & 0 deletions Repetier/Communication.cpp
Expand Up @@ -145,6 +145,7 @@ FSTRINGVALUE(Com::tAPIDClassic," Classic Ziegler-Nichols PID")
FSTRINGVALUE(Com::tAPIDPessen," Pessen Integral Rule PID")
FSTRINGVALUE(Com::tAPIDSome," Some-Overshoot PID")
FSTRINGVALUE(Com::tAPIDNone," No-Overshoot PID")
FSTRINGVALUE(Com::tAPIDTyreusLyben," Tyreus-Lyben PID")
FSTRINGVALUE(Com::tAPIDsimplePD," PD")
FSTRINGVALUE(Com::tAPIDsimplePI," PI")
FSTRINGVALUE(Com::tAPIDsimpleP," P")
Expand Down
1 change: 1 addition & 0 deletions Repetier/Communication.h
Expand Up @@ -145,6 +145,7 @@ class Com
FSTRINGVAR(tAPIDPessen)
FSTRINGVAR(tAPIDSome)
FSTRINGVAR(tAPIDNone)
FSTRINGVAR(tAPIDTyreusLyben)
FSTRINGVAR(tAPIDsimplePD)
FSTRINGVAR(tAPIDsimplePI)
FSTRINGVAR(tAPIDsimpleP)
Expand Down
2 changes: 1 addition & 1 deletion Repetier/Constants.h
Expand Up @@ -20,7 +20,7 @@
#define CONSTANTS_H


#define REPETIER_VERSION "RF.01.37w7.Mod"
#define REPETIER_VERSION "RF.01.37w8.Mod"
#define UI_PRINTER_COMPANY "Conrad Community"
#define UI_VERSION_STRING "V " REPETIER_VERSION

Expand Down
22 changes: 15 additions & 7 deletions Repetier/Extruder.cpp
Expand Up @@ -1347,15 +1347,18 @@ void TemperatureController::autotunePID(float temp, uint8_t controllerId, int ma
Com::printInfoFLN(Com::tPIDAutotuneStart);
Com::printF( PSTR("Ruleset: "), (int)method );
switch(method){
case 6: //P
case 7: //P
Com::printFLN(Com::tAPIDsimpleP);
break;
case 5: //PI
case 6: //PI
Com::printFLN(Com::tAPIDsimplePI);
break;
case 4: //PD
case 5: //PD
Com::printFLN(Com::tAPIDsimplePD);
break;
case 4: //Tyreus-Lyben
Com::printFLN(Com::tAPIDTyreusLyben);
break;
case 3: //PID no overshoot
Com::printFLN(Com::tAPIDNone);
break;
Expand Down Expand Up @@ -1438,24 +1441,29 @@ KP = Ku * Maßzahl lt. Tabelle
see also: http://www.mstarlabs.com/control/znrule.html
*/
switch(method){
case 6: //P
case 7: //P
Kp = 0.5f*Ku; //0.5 KRkrit
Ki = 0;
Kd = 0;
Com::printFLN(Com::tAPIDsimpleP);
break;
case 5: //PI
case 6: //PI
Kp = 0.45f*Ku; //0.45 KRkrit
Ki = 1.2f*Kp/Tu; //0.833 Tkrit
Kd = 0;
Com::printFLN(Com::tAPIDsimplePI);
break;
case 4: //PD
case 5: //PD
Kp = 0.8f*Ku; //0.8 KRkrit
Ki = 0;
Kd = Kp*Tu/8.0f; //0.125 Tkrit
Com::printFLN(Com::tAPIDsimplePD);
break;
break;
case 4: //Tyreus-Lyben
Kp = 0.4545f*Ku; //1/2.2 KRkrit
Ki = Kp/Tu/2.2f; //2.2 Tkrit
Kd = Kp*Tu/6.3f; //1/6.3 Tkrit[/code]
Com::printFLN(Com::tAPIDTyreusLyben);
case 3: //PID no overshoot
Kp = 0.2f*Ku; //0.2 KRkrit
Ki = 2.0f*Kp/Tu; //0.5 Tkrit
Expand Down
25 changes: 7 additions & 18 deletions Repetier/ui.cpp
Expand Up @@ -3908,11 +3908,13 @@ void UIDisplay::nextPreviousAction(int8_t next)
#endif // FEATURE_HEAT_BED_Z_COMPENSATION

case UI_ACTION_RF_RESET_ACK:
{
INCREMENT_MIN_MAX(g_nYesNo,1,0,1);
break;
}
case UI_ACTION_SD_STOP_ACK:
case UI_ACTION_RESTORE_DEFAULTS:
case UI_ACTION_CHOOSE_CLASSICPID:
case UI_ACTION_CHOOSE_LESSERINTEGRAL:
case UI_ACTION_CHOOSE_SOME:
case UI_ACTION_CHOOSE_NO:
case UI_ACTION_CHOOSE_TYREUS_LYBEN:
{
INCREMENT_MIN_MAX(g_nYesNo,1,0,1);
break;
Expand Down Expand Up @@ -3960,20 +3962,6 @@ void UIDisplay::nextPreviousAction(int8_t next)
}
#endif //FEATURE_EMERGENCY_STOP_ALL

case UI_ACTION_RESTORE_DEFAULTS:
{
INCREMENT_MIN_MAX(g_nYesNo,1,0,1);
break;
}

case UI_ACTION_CHOOSE_CLASSICPID:
case UI_ACTION_CHOOSE_LESSERINTEGRAL:
case UI_ACTION_CHOOSE_SOME:
case UI_ACTION_CHOOSE_NO:
{
INCREMENT_MIN_MAX(g_nYesNo,1,0,1);
break;
}
case UI_ACTION_CHOOSE_DMIN:
{
if(uid.menuLevel == 4){ //identifikation des temperaturzyklus anhand der position im menü. Das ist nicht 100% sauber, aber funktioniert.
Expand Down Expand Up @@ -4217,6 +4205,7 @@ void UIDisplay::finishAction(int action)
case UI_ACTION_CHOOSE_LESSERINTEGRAL:
case UI_ACTION_CHOOSE_SOME:
case UI_ACTION_CHOOSE_NO:
case UI_ACTION_CHOOSE_TYREUS_LYBEN:
{
if( g_nYesNo != 1 )
{
Expand Down
10 changes: 6 additions & 4 deletions Repetier/ui.h
Expand Up @@ -160,10 +160,10 @@
#define UI_ACTION_EMERGENCY_ZSTOP_MIN 1672
#define UI_ACTION_EMERGENCY_ZSTOP_MAX 1673

#define UI_ACTION_CHOOSE_CLASSICPID 1674
#define UI_ACTION_CHOOSE_LESSERINTEGRAL 1675
#define UI_ACTION_CHOOSE_SOME 1676
#define UI_ACTION_CHOOSE_NO 1677
#define UI_ACTION_CHOOSE_CLASSICPID 1674 //pid kram
#define UI_ACTION_CHOOSE_LESSERINTEGRAL 1675 //pid kram
#define UI_ACTION_CHOOSE_SOME 1676 //pid kram
#define UI_ACTION_CHOOSE_NO 1677 //pid kram
#define UI_ACTION_CHOOSE_DMIN 1678
#define UI_ACTION_CHOOSE_DMAX 1679
#define UI_ACTION_CHOOSE_PIDMAX 1680
Expand Down Expand Up @@ -192,6 +192,8 @@
#define UI_ACTION_FEATURE_ZERO_DIGITS 1699
#define UI_ACTION_DIGIT_COMPENSATION 1700

#define UI_ACTION_CHOOSE_TYREUS_LYBEN 1701 //pid kram

#define UI_ACTION_FET1_OUTPUT 2001
#define UI_ACTION_FET2_OUTPUT 2002

Expand Down
2 changes: 2 additions & 0 deletions Repetier/uilang.h
Expand Up @@ -385,6 +385,7 @@
#define UI_ACTION_TEXT_PESSEN "PID Pessen-Rule"
#define UI_ACTION_TEXT_SOME "PID Some-Overshoot"
#define UI_ACTION_TEXT_NO "PID No-Overshoot"
#define UI_ACTION_TEXT_TYREUS_LYBEN "PID Tyreus-Lyben"

#define UI_TEXT_MOTOR_X "I_x: %MX"
#define UI_TEXT_MOTOR_Y "I_y: %MY"
Expand Down Expand Up @@ -745,6 +746,7 @@
#define UI_ACTION_TEXT_PESSEN "PID Pessen-Rule"
#define UI_ACTION_TEXT_SOME "PID Some-Overshoot"
#define UI_ACTION_TEXT_NO "PID No-Overshoot"
#define UI_ACTION_TEXT_TYREUS_LYBEN "PID Tyreus-Lyben"

#define UI_TEXT_MOTOR_X "I_x: %MX"
#define UI_TEXT_MOTOR_Y "I_y: %MY"
Expand Down
4 changes: 3 additions & 1 deletion Repetier/uimenu.h
Expand Up @@ -901,12 +901,14 @@ UI_MENU_ACTION4C(ui_menu_pid_choose_some_ack,UI_ACTION_CHOOSE_SOME,UI_TEXT_PID_A
UI_MENU_ACTIONSELECTOR(ui_menu_pid_choose_some,UI_ACTION_TEXT_SOME,ui_menu_pid_choose_some_ack)
UI_MENU_ACTION4C(ui_menu_pid_choose_no_ack,UI_ACTION_CHOOSE_NO,UI_TEXT_PID_ACK)
UI_MENU_ACTIONSELECTOR(ui_menu_pid_choose_no,UI_ACTION_TEXT_NO,ui_menu_pid_choose_no_ack)
UI_MENU_ACTION4C(ui_menu_pid_choose_tyreus_lyben_ack,UI_ACTION_CHOOSE_TYREUS_LYBEN,UI_TEXT_PID_ACK)
UI_MENU_ACTIONSELECTOR(ui_menu_pid_choose_tyreus_lyben,UI_ACTION_TEXT_TYREUS_LYBEN,ui_menu_pid_choose_tyreus_lyben_ack)
UI_MENU_CHANGEACTION(ui_menu_pid_choose_drivemin,UI_TEXT_EXTR_DMIN,UI_ACTION_CHOOSE_DMIN)
UI_MENU_CHANGEACTION(ui_menu_pid_choose_drivemax,UI_TEXT_EXTR_DMAX,UI_ACTION_CHOOSE_DMAX)
UI_MENU_CHANGEACTION(ui_menu_pid_choose_PIDmax,UI_TEXT_EXTR_PMAX,UI_ACTION_CHOOSE_PIDMAX)
UI_MENU_CHANGEACTION(ui_menu_pid_choose_sensor,UI_TEXT_EXTR_SENSOR_TYPE,UI_ACTION_CHOOSE_SENSOR)

#define UI_MENU_PID_CHOOSE {UI_MENU_ADDCONDBACK &ui_menu_pid_choose_classicpid ,&ui_menu_pid_choose_lesserintegral, &ui_menu_pid_choose_some, &ui_menu_pid_choose_no, &ui_menu_pid_choose_drivemin, &ui_menu_pid_choose_drivemax, &ui_menu_pid_choose_PIDmax, &ui_menu_pid_choose_sensor}
#define UI_MENU_PID_CHOOSE {UI_MENU_ADDCONDBACK &ui_menu_pid_choose_classicpid ,&ui_menu_pid_choose_lesserintegral, &ui_menu_pid_choose_some, &ui_menu_pid_choose_no, &ui_menu_pid_choose_tyreus_lyben, &ui_menu_pid_choose_drivemin, &ui_menu_pid_choose_drivemax, &ui_menu_pid_choose_PIDmax, &ui_menu_pid_choose_sensor}
UI_MENU(ui_menu_pid_choose,UI_MENU_PID_CHOOSE,8) //8 ??? mit 9 gabs probleme. ???

UI_MENU_SUBMENU(ui_menu_pid_ext0_cond, UI_TEXT_EXTRUDER " 0", ui_menu_pid_choose)
Expand Down
4 changes: 4 additions & 0 deletions changelog.txt
@@ -1,6 +1,10 @@
TODO: Z-Lift-Bug seems to be still present! Avoid Z-Lift: Todo @Conrad -> Has this possibly been fixed by removing halfstepping in 1.37u4?
TODO: Testing, testing ..

V RF.01.37w8.Mod (2017-10-30)
- Included PID autotune method Tyreus-Lyben
- fixed readme

V RF.01.37w7.Mod (2017-10-30)
- Fix GT-2 (Sensor 8 / E3D) Temptable 222 -> 244

Expand Down

0 comments on commit fe1597f

Please sign in to comment.