Browse Source

🐛 Fix / refactor shared PID (#24673)

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
Giuliano Zaro 2 years ago
parent
commit
094701cc71
No account linked to committer's email address

+ 10
- 12
Marlin/src/gcode/config/M301.cpp View File

57
 
57
 
58
   if (e < HOTENDS) { // catch bad input value
58
   if (e < HOTENDS) { // catch bad input value
59
 
59
 
60
-    if (parser.seenval('P')) PID_PARAM(Kp, e) = parser.value_float();
61
-    if (parser.seenval('I')) PID_PARAM(Ki, e) = scalePID_i(parser.value_float());
62
-    if (parser.seenval('D')) PID_PARAM(Kd, e) = scalePID_d(parser.value_float());
60
+    if (parser.seenval('P')) SET_HOTEND_PID(Kp, e, parser.value_float());
61
+    if (parser.seenval('I')) SET_HOTEND_PID(Ki, e, parser.value_float());
62
+    if (parser.seenval('D')) SET_HOTEND_PID(Kd, e, parser.value_float());
63
 
63
 
64
     #if ENABLED(PID_EXTRUSION_SCALING)
64
     #if ENABLED(PID_EXTRUSION_SCALING)
65
-      if (parser.seenval('C')) PID_PARAM(Kc, e) = parser.value_float();
65
+      if (parser.seenval('C')) SET_HOTEND_PID(Kc, e, parser.value_float());
66
       if (parser.seenval('L')) thermalManager.lpq_len = parser.value_int();
66
       if (parser.seenval('L')) thermalManager.lpq_len = parser.value_int();
67
-      NOMORE(thermalManager.lpq_len, LPQ_MAX_LEN);
68
-      NOLESS(thermalManager.lpq_len, 0);
67
+      LIMIT(thermalManager.lpq_len, 0, LPQ_MAX_LEN);
69
     #endif
68
     #endif
70
 
69
 
71
     #if ENABLED(PID_FAN_SCALING)
70
     #if ENABLED(PID_FAN_SCALING)
72
-      if (parser.seenval('F')) PID_PARAM(Kf, e) = parser.value_float();
71
+      if (parser.seenval('F')) SET_HOTEND_PID(Kf, e, parser.value_float());
73
     #endif
72
     #endif
74
 
73
 
75
     thermalManager.updatePID();
74
     thermalManager.updatePID();
83
   IF_DISABLED(HAS_MULTI_EXTRUDER, constexpr int8_t eindex = -1);
82
   IF_DISABLED(HAS_MULTI_EXTRUDER, constexpr int8_t eindex = -1);
84
   HOTEND_LOOP() {
83
   HOTEND_LOOP() {
85
     if (e == eindex || eindex == -1) {
84
     if (e == eindex || eindex == -1) {
85
+      const hotend_pid_t &pid = thermalManager.temp_hotend[e].pid;
86
       report_echo_start(forReplay);
86
       report_echo_start(forReplay);
87
       SERIAL_ECHOPGM_P(
87
       SERIAL_ECHOPGM_P(
88
         #if ENABLED(PID_PARAMS_PER_HOTEND)
88
         #if ENABLED(PID_PARAMS_PER_HOTEND)
90
         #else
90
         #else
91
           PSTR("  M301 P")
91
           PSTR("  M301 P")
92
         #endif
92
         #endif
93
-        ,                          PID_PARAM(Kp, e)
94
-        , PSTR(" I"), unscalePID_i(PID_PARAM(Ki, e))
95
-        , PSTR(" D"), unscalePID_d(PID_PARAM(Kd, e))
93
+        , pid.p(), PSTR(" I"), pid.i(), PSTR(" D"), pid.d()
96
       );
94
       );
97
       #if ENABLED(PID_EXTRUSION_SCALING)
95
       #if ENABLED(PID_EXTRUSION_SCALING)
98
-        SERIAL_ECHOPGM_P(SP_C_STR, PID_PARAM(Kc, e));
96
+        SERIAL_ECHOPGM_P(SP_C_STR, pid.c());
99
         if (e == 0) SERIAL_ECHOPGM(" L", thermalManager.lpq_len);
97
         if (e == 0) SERIAL_ECHOPGM(" L", thermalManager.lpq_len);
100
       #endif
98
       #endif
101
       #if ENABLED(PID_FAN_SCALING)
99
       #if ENABLED(PID_FAN_SCALING)
102
-        SERIAL_ECHOPGM(" F", PID_PARAM(Kf, e));
100
+        SERIAL_ECHOPGM(" F", pid.f());
103
       #endif
101
       #endif
104
       SERIAL_EOL();
102
       SERIAL_EOL();
105
     }
103
     }

+ 7
- 7
Marlin/src/gcode/config/M304.cpp View File

36
  */
36
  */
37
 void GcodeSuite::M304() {
37
 void GcodeSuite::M304() {
38
   if (!parser.seen("PID")) return M304_report();
38
   if (!parser.seen("PID")) return M304_report();
39
-  if (parser.seenval('P')) thermalManager.temp_bed.pid.Kp = parser.value_float();
40
-  if (parser.seenval('I')) thermalManager.temp_bed.pid.Ki = scalePID_i(parser.value_float());
41
-  if (parser.seenval('D')) thermalManager.temp_bed.pid.Kd = scalePID_d(parser.value_float());
39
+  if (parser.seenval('P')) thermalManager.temp_bed.pid.set_Kp(parser.value_float());
40
+  if (parser.seenval('I')) thermalManager.temp_bed.pid.set_Ki(parser.value_float());
41
+  if (parser.seenval('D')) thermalManager.temp_bed.pid.set_Kd(parser.value_float());
42
 }
42
 }
43
 
43
 
44
 void GcodeSuite::M304_report(const bool forReplay/*=true*/) {
44
 void GcodeSuite::M304_report(const bool forReplay/*=true*/) {
45
   report_heading_etc(forReplay, F(STR_BED_PID));
45
   report_heading_etc(forReplay, F(STR_BED_PID));
46
-  SERIAL_ECHOLNPGM(
47
-      "  M304 P", thermalManager.temp_bed.pid.Kp
48
-    , " I", unscalePID_i(thermalManager.temp_bed.pid.Ki)
49
-    , " D", unscalePID_d(thermalManager.temp_bed.pid.Kd)
46
+  SERIAL_ECHOLNPGM("  M304"
47
+      " P", thermalManager.temp_bed.pid.p()
48
+    , " I", thermalManager.temp_bed.pid.i()
49
+    , " D", thermalManager.temp_bed.pid.d()
50
   );
50
   );
51
 }
51
 }
52
 
52
 

+ 7
- 7
Marlin/src/gcode/config/M309.cpp View File

36
  */
36
  */
37
 void GcodeSuite::M309() {
37
 void GcodeSuite::M309() {
38
   if (!parser.seen("PID")) return M309_report();
38
   if (!parser.seen("PID")) return M309_report();
39
-  if (parser.seen('P')) thermalManager.temp_chamber.pid.Kp = parser.value_float();
40
-  if (parser.seen('I')) thermalManager.temp_chamber.pid.Ki = scalePID_i(parser.value_float());
41
-  if (parser.seen('D')) thermalManager.temp_chamber.pid.Kd = scalePID_d(parser.value_float());
39
+  if (parser.seenval('P')) thermalManager.temp_chamber.pid.set_Kp(parser.value_float());
40
+  if (parser.seenval('I')) thermalManager.temp_chamber.pid.set_Ki(parser.value_float());
41
+  if (parser.seenval('D')) thermalManager.temp_chamber.pid.set_Kd(parser.value_float());
42
 }
42
 }
43
 
43
 
44
 void GcodeSuite::M309_report(const bool forReplay/*=true*/) {
44
 void GcodeSuite::M309_report(const bool forReplay/*=true*/) {
45
   report_heading_etc(forReplay, F(STR_CHAMBER_PID));
45
   report_heading_etc(forReplay, F(STR_CHAMBER_PID));
46
-  SERIAL_ECHOLNPGM(
47
-      "  M309 P", thermalManager.temp_chamber.pid.Kp
48
-    , " I", unscalePID_i(thermalManager.temp_chamber.pid.Ki)
49
-    , " D", unscalePID_d(thermalManager.temp_chamber.pid.Kd)
46
+  SERIAL_ECHOLNPGM("  M309"
47
+      " P", thermalManager.temp_chamber.pid.p()
48
+    , " I", thermalManager.temp_chamber.pid.i()
49
+    , " D", thermalManager.temp_chamber.pid.d()
50
   );
50
   );
51
 }
51
 }
52
 
52
 

+ 6
- 6
Marlin/src/lcd/e3v2/jyersui/dwin.cpp View File

2140
           case HOTENDPID_KP:
2140
           case HOTENDPID_KP:
2141
             if (draw) {
2141
             if (draw) {
2142
               Draw_Menu_Item(row, ICON_Version, F("Kp Value"));
2142
               Draw_Menu_Item(row, ICON_Version, F("Kp Value"));
2143
-              Draw_Float(thermalManager.temp_hotend[0].pid.Kp, row, false, 100);
2143
+              Draw_Float(thermalManager.temp_hotend[0].pid.p(), row, false, 100);
2144
             }
2144
             }
2145
             else
2145
             else
2146
               Modify_Value(thermalManager.temp_hotend[0].pid.Kp, 0, 5000, 100, thermalManager.updatePID);
2146
               Modify_Value(thermalManager.temp_hotend[0].pid.Kp, 0, 5000, 100, thermalManager.updatePID);
2148
           case HOTENDPID_KI:
2148
           case HOTENDPID_KI:
2149
             if (draw) {
2149
             if (draw) {
2150
               Draw_Menu_Item(row, ICON_Version, F("Ki Value"));
2150
               Draw_Menu_Item(row, ICON_Version, F("Ki Value"));
2151
-              Draw_Float(unscalePID_i(thermalManager.temp_hotend[0].pid.Ki), row, false, 100);
2151
+              Draw_Float(thermalManager.temp_hotend[0].pid.i(), row, false, 100);
2152
             }
2152
             }
2153
             else
2153
             else
2154
               Modify_Value(thermalManager.temp_hotend[0].pid.Ki, 0, 5000, 100, thermalManager.updatePID);
2154
               Modify_Value(thermalManager.temp_hotend[0].pid.Ki, 0, 5000, 100, thermalManager.updatePID);
2156
           case HOTENDPID_KD:
2156
           case HOTENDPID_KD:
2157
             if (draw) {
2157
             if (draw) {
2158
               Draw_Menu_Item(row, ICON_Version, F("Kd Value"));
2158
               Draw_Menu_Item(row, ICON_Version, F("Kd Value"));
2159
-              Draw_Float(unscalePID_d(thermalManager.temp_hotend[0].pid.Kd), row, false, 100);
2159
+              Draw_Float(thermalManager.temp_hotend[0].pid.d(), row, false, 100);
2160
             }
2160
             }
2161
             else
2161
             else
2162
               Modify_Value(thermalManager.temp_hotend[0].pid.Kd, 0, 5000, 100, thermalManager.updatePID);
2162
               Modify_Value(thermalManager.temp_hotend[0].pid.Kd, 0, 5000, 100, thermalManager.updatePID);
2207
           case BEDPID_KP:
2207
           case BEDPID_KP:
2208
             if (draw) {
2208
             if (draw) {
2209
               Draw_Menu_Item(row, ICON_Version, F("Kp Value"));
2209
               Draw_Menu_Item(row, ICON_Version, F("Kp Value"));
2210
-              Draw_Float(thermalManager.temp_bed.pid.Kp, row, false, 100);
2210
+              Draw_Float(thermalManager.temp_bed.pid.p(), row, false, 100);
2211
             }
2211
             }
2212
             else {
2212
             else {
2213
               Modify_Value(thermalManager.temp_bed.pid.Kp, 0, 5000, 100, thermalManager.updatePID);
2213
               Modify_Value(thermalManager.temp_bed.pid.Kp, 0, 5000, 100, thermalManager.updatePID);
2216
           case BEDPID_KI:
2216
           case BEDPID_KI:
2217
             if (draw) {
2217
             if (draw) {
2218
               Draw_Menu_Item(row, ICON_Version, F("Ki Value"));
2218
               Draw_Menu_Item(row, ICON_Version, F("Ki Value"));
2219
-              Draw_Float(unscalePID_i(thermalManager.temp_bed.pid.Ki), row, false, 100);
2219
+              Draw_Float(thermalManager.temp_bed.pid.i(), row, false, 100);
2220
             }
2220
             }
2221
             else
2221
             else
2222
               Modify_Value(thermalManager.temp_bed.pid.Ki, 0, 5000, 100, thermalManager.updatePID);
2222
               Modify_Value(thermalManager.temp_bed.pid.Ki, 0, 5000, 100, thermalManager.updatePID);
2224
           case BEDPID_KD:
2224
           case BEDPID_KD:
2225
             if (draw) {
2225
             if (draw) {
2226
               Draw_Menu_Item(row, ICON_Version, F("Kd Value"));
2226
               Draw_Menu_Item(row, ICON_Version, F("Kd Value"));
2227
-              Draw_Float(unscalePID_d(thermalManager.temp_bed.pid.Kd), row, false, 100);
2227
+              Draw_Float(thermalManager.temp_bed.pid.d(), row, false, 100);
2228
             }
2228
             }
2229
             else
2229
             else
2230
               Modify_Value(thermalManager.temp_bed.pid.Kd, 0, 5000, 100, thermalManager.updatePID);
2230
               Modify_Value(thermalManager.temp_bed.pid.Kd, 0, 5000, 100, thermalManager.updatePID);

+ 11
- 9
Marlin/src/lcd/e3v2/proui/dwin.cpp View File

2667
 void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
2667
 void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
2668
 #if HAS_HOTEND
2668
 #if HAS_HOTEND
2669
   void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
2669
   void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
2670
-  void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
2670
+  #if ENABLED(PIDTEMP)
2671
+    void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
2672
+  #endif
2671
 #endif
2673
 #endif
2672
-#if HAS_HEATED_BED
2674
+#if ENABLED(PIDTEMPBED)
2673
   void SetBedPidT() { SetPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); }
2675
   void SetBedPidT() { SetPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); }
2674
 #endif
2676
 #endif
2675
 
2677
 
2676
-#if HAS_HOTEND || HAS_HEATED_BED
2678
+#if EITHER(PIDTEMP, PIDTEMPBED)
2677
   void SetPidCycles() { SetPIntOnClick(3, 50); }
2679
   void SetPidCycles() { SetPIntOnClick(3, 50); }
2678
   void SetKp() { SetPFloatOnClick(0, 1000, 2); }
2680
   void SetKp() { SetPFloatOnClick(0, 1000, 2); }
2679
   void ApplyPIDi() {
2681
   void ApplyPIDi() {
3222
     #if HAS_HOME_OFFSET
3224
     #if HAS_HOME_OFFSET
3223
       MENU_ITEM_F(ICON_HomeOffset, MSG_SET_HOME_OFFSETS, onDrawSubMenu, Draw_HomeOffset_Menu);
3225
       MENU_ITEM_F(ICON_HomeOffset, MSG_SET_HOME_OFFSETS, onDrawSubMenu, Draw_HomeOffset_Menu);
3224
     #endif
3226
     #endif
3225
-    #if HAS_HOTEND
3227
+    #if ENABLED(PIDTEMP)
3226
       MENU_ITEM(ICON_PIDNozzle, F(STR_HOTEND_PID " Settings"), onDrawSubMenu, Draw_HotendPID_Menu);
3228
       MENU_ITEM(ICON_PIDNozzle, F(STR_HOTEND_PID " Settings"), onDrawSubMenu, Draw_HotendPID_Menu);
3227
     #endif
3229
     #endif
3228
-    #if HAS_HEATED_BED
3230
+    #if ENABLED(PIDTEMPBED)
3229
       MENU_ITEM(ICON_PIDbed, F(STR_BED_PID " Settings"), onDrawSubMenu, Draw_BedPID_Menu);
3231
       MENU_ITEM(ICON_PIDbed, F(STR_BED_PID " Settings"), onDrawSubMenu, Draw_BedPID_Menu);
3230
     #endif
3232
     #endif
3231
       MENU_ITEM_F(ICON_FilSet, MSG_FILAMENT_SET, onDrawSubMenu, Draw_FilSet_Menu);
3233
       MENU_ITEM_F(ICON_FilSet, MSG_FILAMENT_SET, onDrawSubMenu, Draw_FilSet_Menu);
3668
   CurrentMenu->draw();
3670
   CurrentMenu->draw();
3669
 }
3671
 }
3670
 
3672
 
3671
-#if HAS_HOTEND
3673
+#if ENABLED(PIDTEMP)
3672
   void Draw_HotendPID_Menu() {
3674
   void Draw_HotendPID_Menu() {
3673
     checkkey = Menu;
3675
     checkkey = Menu;
3674
-    if (SetMenu(HotendPIDMenu, F(STR_HOTEND_PID " Settings"),8)) {
3676
+    if (SetMenu(HotendPIDMenu, F(STR_HOTEND_PID " Settings"), 8)) {
3675
       BACK_ITEM(Draw_AdvancedSettings_Menu);
3677
       BACK_ITEM(Draw_AdvancedSettings_Menu);
3676
       MENU_ITEM(ICON_PIDNozzle, F(STR_HOTEND_PID), onDrawMenuItem, HotendPID);
3678
       MENU_ITEM(ICON_PIDNozzle, F(STR_HOTEND_PID), onDrawMenuItem, HotendPID);
3677
       EDIT_ITEM(ICON_PIDValue, F("Set" STR_KP), onDrawPFloat2Menu, SetKp, &thermalManager.temp_hotend[0].pid.Kp);
3679
       EDIT_ITEM(ICON_PIDValue, F("Set" STR_KP), onDrawPFloat2Menu, SetKp, &thermalManager.temp_hotend[0].pid.Kp);
3687
   }
3689
   }
3688
 #endif
3690
 #endif
3689
 
3691
 
3690
-#if HAS_HEATED_BED
3692
+#if ENABLED(PIDTEMPBED)
3691
   void Draw_BedPID_Menu() {
3693
   void Draw_BedPID_Menu() {
3692
     checkkey = Menu;
3694
     checkkey = Menu;
3693
-    if (SetMenu(BedPIDMenu, F(STR_BED_PID " Settings"),8)) {
3695
+    if (SetMenu(BedPIDMenu, F(STR_BED_PID " Settings"), 8)) {
3694
       BACK_ITEM(Draw_AdvancedSettings_Menu);
3696
       BACK_ITEM(Draw_AdvancedSettings_Menu);
3695
       MENU_ITEM(ICON_PIDNozzle, F(STR_BED_PID), onDrawMenuItem,BedPID);
3697
       MENU_ITEM(ICON_PIDNozzle, F(STR_BED_PID), onDrawMenuItem,BedPID);
3696
       EDIT_ITEM(ICON_PIDValue, F("Set" STR_KP), onDrawPFloat2Menu, SetKp, &thermalManager.temp_bed.pid.Kp);
3698
       EDIT_ITEM(ICON_PIDValue, F("Set" STR_KP), onDrawPFloat2Menu, SetKp, &thermalManager.temp_bed.pid.Kp);

+ 4
- 2
Marlin/src/lcd/e3v2/proui/dwin.h View File

264
   void Draw_Preheat1_Menu();
264
   void Draw_Preheat1_Menu();
265
   void Draw_Preheat2_Menu();
265
   void Draw_Preheat2_Menu();
266
   void Draw_Preheat3_Menu();
266
   void Draw_Preheat3_Menu();
267
-  void Draw_HotendPID_Menu();
267
+  #if ENABLED(PIDTEMP)
268
+    void Draw_HotendPID_Menu();
269
+  #endif
268
 #endif
270
 #endif
269
 void Draw_Temperature_Menu();
271
 void Draw_Temperature_Menu();
270
 void Draw_MaxSpeed_Menu();
272
 void Draw_MaxSpeed_Menu();
273
   void Draw_MaxJerk_Menu();
275
   void Draw_MaxJerk_Menu();
274
 #endif
276
 #endif
275
 void Draw_Steps_Menu();
277
 void Draw_Steps_Menu();
276
-#if HAS_HEATED_BED
278
+#if ENABLED(PIDTEMPBED)
277
   void Draw_BedPID_Menu();
279
   void Draw_BedPID_Menu();
278
 #endif
280
 #endif
279
 #if EITHER(HAS_BED_PROBE, BABYSTEPPING)
281
 #if EITHER(HAS_BED_PROBE, BABYSTEPPING)

+ 9
- 9
Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp View File

421
     default: return;
421
     default: return;
422
     #if ENABLED(PIDTEMPBED)
422
     #if ENABLED(PIDTEMPBED)
423
       case DGUS_Data::Heater::BED:
423
       case DGUS_Data::Heater::BED:
424
-        value = ExtUI::getBedPIDValues_Kp();
424
+        value = ExtUI::getBedPID_Kp();
425
         break;
425
         break;
426
     #endif
426
     #endif
427
     #if ENABLED(PIDTEMP)
427
     #if ENABLED(PIDTEMP)
428
       case DGUS_Data::Heater::H0:
428
       case DGUS_Data::Heater::H0:
429
-        value = ExtUI::getPIDValues_Kp(ExtUI::E0);
429
+        value = ExtUI::getPID_Kp(ExtUI::E0);
430
         break;
430
         break;
431
       #if HAS_MULTI_HOTEND
431
       #if HAS_MULTI_HOTEND
432
         case DGUS_Data::Heater::H1:
432
         case DGUS_Data::Heater::H1:
433
-          value = ExtUI::getPIDValues_Kp(ExtUI::E1);
433
+          value = ExtUI::getPID_Kp(ExtUI::E1);
434
           break;
434
           break;
435
       #endif
435
       #endif
436
     #endif
436
     #endif
447
     default: return;
447
     default: return;
448
     #if ENABLED(PIDTEMPBED)
448
     #if ENABLED(PIDTEMPBED)
449
       case DGUS_Data::Heater::BED:
449
       case DGUS_Data::Heater::BED:
450
-        value = ExtUI::getBedPIDValues_Ki();
450
+        value = ExtUI::getBedPID_Ki();
451
         break;
451
         break;
452
     #endif
452
     #endif
453
     #if ENABLED(PIDTEMP)
453
     #if ENABLED(PIDTEMP)
454
       case DGUS_Data::Heater::H0:
454
       case DGUS_Data::Heater::H0:
455
-        value = ExtUI::getPIDValues_Ki(ExtUI::E0);
455
+        value = ExtUI::getPID_Ki(ExtUI::E0);
456
         break;
456
         break;
457
       #if HAS_MULTI_HOTEND
457
       #if HAS_MULTI_HOTEND
458
         case DGUS_Data::Heater::H1:
458
         case DGUS_Data::Heater::H1:
459
-          value = ExtUI::getPIDValues_Ki(ExtUI::E1);
459
+          value = ExtUI::getPID_Ki(ExtUI::E1);
460
           break;
460
           break;
461
       #endif
461
       #endif
462
     #endif
462
     #endif
473
     default: return;
473
     default: return;
474
     #if ENABLED(PIDTEMPBED)
474
     #if ENABLED(PIDTEMPBED)
475
       case DGUS_Data::Heater::BED:
475
       case DGUS_Data::Heater::BED:
476
-        value = ExtUI::getBedPIDValues_Kd();
476
+        value = ExtUI::getBedPID_Kd();
477
         break;
477
         break;
478
     #endif
478
     #endif
479
     #if ENABLED(PIDTEMP)
479
     #if ENABLED(PIDTEMP)
480
       case DGUS_Data::Heater::H0:
480
       case DGUS_Data::Heater::H0:
481
-        value = ExtUI::getPIDValues_Kd(ExtUI::E0);
481
+        value = ExtUI::getPID_Kd(ExtUI::E0);
482
         break;
482
         break;
483
       #if HAS_MULTI_HOTEND
483
       #if HAS_MULTI_HOTEND
484
         case DGUS_Data::Heater::H1:
484
         case DGUS_Data::Heater::H1:
485
-          value = ExtUI::getPIDValues_Kd(ExtUI::E1);
485
+          value = ExtUI::getPID_Kd(ExtUI::E1);
486
           break;
486
           break;
487
       #endif
487
       #endif
488
     #endif
488
     #endif

+ 3
- 3
Marlin/src/lcd/extui/nextion/nextion_tft.cpp View File

459
 
459
 
460
   case 37: // PID
460
   case 37: // PID
461
     #if ENABLED(PIDTEMP)
461
     #if ENABLED(PIDTEMP)
462
-      #define SEND_PID_INFO_0(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E0))
462
+      #define SEND_PID_INFO_0(A, B) SEND_VALasTXT(A, getPID_K##B(E0))
463
     #else
463
     #else
464
       #define SEND_PID_INFO_0(A, B) SEND_NA(A)
464
       #define SEND_PID_INFO_0(A, B) SEND_NA(A)
465
     #endif
465
     #endif
466
     #if BOTH(PIDTEMP, HAS_MULTI_EXTRUDER)
466
     #if BOTH(PIDTEMP, HAS_MULTI_EXTRUDER)
467
-      #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E1))
467
+      #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPID_K##B(E1))
468
     #else
468
     #else
469
       #define SEND_PID_INFO_1(A, B) SEND_NA(A)
469
       #define SEND_PID_INFO_1(A, B) SEND_NA(A)
470
     #endif
470
     #endif
471
     #if ENABLED(PIDTEMPBED)
471
     #if ENABLED(PIDTEMPBED)
472
-      #define SEND_PID_INFO_BED(A, B) SEND_VALasTXT(A, getBedPIDValues_K##B())
472
+      #define SEND_PID_INFO_BED(A, B) SEND_VALasTXT(A, getBedPID_K##B())
473
     #else
473
     #else
474
       #define SEND_PID_INFO_BED(A, B) SEND_NA(A)
474
       #define SEND_PID_INFO_BED(A, B) SEND_NA(A)
475
     #endif
475
     #endif

+ 13
- 19
Marlin/src/lcd/extui/ui_api.cpp View File

976
   float getFeedrate_percent() { return feedrate_percentage; }
976
   float getFeedrate_percent() { return feedrate_percentage; }
977
 
977
 
978
   #if ENABLED(PIDTEMP)
978
   #if ENABLED(PIDTEMP)
979
-    float getPIDValues_Kp(const extruder_t tool) { return PID_PARAM(Kp, tool); }
980
-    float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); }
981
-    float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); }
982
-
983
-    void setPIDValues(const_float_t p, const_float_t i, const_float_t d, extruder_t tool) {
984
-      thermalManager.temp_hotend[tool].pid.Kp = p;
985
-      thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i);
986
-      thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d);
987
-      thermalManager.updatePID();
979
+    float getPID_Kp(const extruder_t tool) { return thermalManager.temp_hotend[tool].pid.p(); }
980
+    float getPID_Ki(const extruder_t tool) { return thermalManager.temp_hotend[tool].pid.i(); }
981
+    float getPID_Kd(const extruder_t tool) { return thermalManager.temp_hotend[tool].pid.d(); }
982
+
983
+    void setPID(const_float_t p, const_float_t i, const_float_t d, extruder_t tool) {
984
+      thermalManager.setPID(uint8_t(tool), p, i, d);
988
     }
985
     }
989
 
986
 
990
     void startPIDTune(const celsius_t temp, extruder_t tool) {
987
     void startPIDTune(const celsius_t temp, extruder_t tool) {
991
-      thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true);
988
+      thermalManager.PID_autotune(temp, heater_id_t(tool), 8, true);
992
     }
989
     }
993
   #endif
990
   #endif
994
 
991
 
995
   #if ENABLED(PIDTEMPBED)
992
   #if ENABLED(PIDTEMPBED)
996
-    float getBedPIDValues_Kp() { return thermalManager.temp_bed.pid.Kp; }
997
-    float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); }
998
-    float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); }
999
-
1000
-    void setBedPIDValues(const_float_t p, const_float_t i, const_float_t d) {
1001
-      thermalManager.temp_bed.pid.Kp = p;
1002
-      thermalManager.temp_bed.pid.Ki = scalePID_i(i);
1003
-      thermalManager.temp_bed.pid.Kd = scalePID_d(d);
1004
-      thermalManager.updatePID();
993
+    float getBedPID_Kp() { return thermalManager.temp_bed.pid.p(); }
994
+    float getBedPID_Ki() { return thermalManager.temp_bed.pid.i(); }
995
+    float getBedPID_Kd() { return thermalManager.temp_bed.pid.d(); }
996
+
997
+    void setBedPID(const_float_t p, const_float_t i, const_float_t d) {
998
+      thermalManager.temp_bed.pid.set(p, i, d);
1005
     }
999
     }
1006
 
1000
 
1007
     void startBedPIDTune(const celsius_t temp) {
1001
     void startBedPIDTune(const celsius_t temp) {

+ 8
- 8
Marlin/src/lcd/extui/ui_api.h View File

324
   #endif
324
   #endif
325
 
325
 
326
   #if ENABLED(PIDTEMP)
326
   #if ENABLED(PIDTEMP)
327
-    float getPIDValues_Kp(const extruder_t);
328
-    float getPIDValues_Ki(const extruder_t);
329
-    float getPIDValues_Kd(const extruder_t);
330
-    void setPIDValues(const_float_t, const_float_t , const_float_t , extruder_t);
327
+    float getPID_Kp(const extruder_t);
328
+    float getPID_Ki(const extruder_t);
329
+    float getPID_Kd(const extruder_t);
330
+    void setPID(const_float_t, const_float_t , const_float_t , extruder_t);
331
     void startPIDTune(const celsius_t, extruder_t);
331
     void startPIDTune(const celsius_t, extruder_t);
332
   #endif
332
   #endif
333
 
333
 
334
   #if ENABLED(PIDTEMPBED)
334
   #if ENABLED(PIDTEMPBED)
335
-    float getBedPIDValues_Kp();
336
-    float getBedPIDValues_Ki();
337
-    float getBedPIDValues_Kd();
338
-    void setBedPIDValues(const_float_t, const_float_t , const_float_t);
335
+    float getBedPID_Kp();
336
+    float getBedPID_Ki();
337
+    float getBedPID_Kd();
338
+    void setBedPID(const_float_t, const_float_t , const_float_t);
339
     void startBedPIDTune(const celsius_t);
339
     void startBedPIDTune(const celsius_t);
340
   #endif
340
   #endif
341
 
341
 

+ 49
- 23
Marlin/src/lcd/menu/menu_advanced.cpp View File

209
 
209
 
210
 #if ENABLED(PID_EDIT_MENU)
210
 #if ENABLED(PID_EDIT_MENU)
211
 
211
 
212
-  float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits
212
+  // Placeholders for PID editing
213
+  float raw_Kp, raw_Ki, raw_Kd;
214
+  #if ENABLED(PID_EXTRUSION_SCALING)
215
+    float raw_Kc;
216
+  #endif
217
+  #if ENABLED(PID_FAN_SCALING)
218
+    float raw_Kf;
219
+  #endif
213
 
220
 
214
-  // Helpers for editing PID Ki & Kd values
215
-  // grab the PID value out of the temp variable; scale it; then update the PID driver
216
-  void copy_and_scalePID_i(const int8_t e) {
221
+  // Helpers for editing PID Kp, Ki and Kd values
222
+  void apply_PID_p(const int8_t e) {
223
+    switch (e) {
224
+      #if ENABLED(PIDTEMPBED)
225
+        case H_BED: thermalManager.temp_bed.pid.set_Ki(raw_Ki); break;
226
+      #endif
227
+      #if ENABLED(PIDTEMPCHAMBER)
228
+        case H_CHAMBER: thermalManager.temp_chamber.pid.set_Ki(raw_Ki); break;
229
+      #endif
230
+      default:
231
+        #if ENABLED(PIDTEMP)
232
+          SET_HOTEND_PID(Kp, e, raw_Kp);
233
+          thermalManager.updatePID();
234
+        #endif
235
+        break;
236
+    }
237
+  }
238
+  void apply_PID_i(const int8_t e) {
217
     switch (e) {
239
     switch (e) {
218
       #if ENABLED(PIDTEMPBED)
240
       #if ENABLED(PIDTEMPBED)
219
-        case H_BED: thermalManager.temp_bed.pid.Ki = scalePID_i(raw_Ki); break;
241
+        case H_BED: thermalManager.temp_bed.pid.set_Ki(raw_Ki); break;
220
       #endif
242
       #endif
221
       #if ENABLED(PIDTEMPCHAMBER)
243
       #if ENABLED(PIDTEMPCHAMBER)
222
-        case H_CHAMBER: thermalManager.temp_chamber.pid.Ki = scalePID_i(raw_Ki); break;
244
+        case H_CHAMBER: thermalManager.temp_chamber.pid.set_Ki(raw_Ki); break;
223
       #endif
245
       #endif
224
       default:
246
       default:
225
         #if ENABLED(PIDTEMP)
247
         #if ENABLED(PIDTEMP)
226
-          PID_PARAM(Ki, e) = scalePID_i(raw_Ki);
248
+          SET_HOTEND_PID(Ki, e, raw_Ki);
227
           thermalManager.updatePID();
249
           thermalManager.updatePID();
228
         #endif
250
         #endif
229
         break;
251
         break;
230
     }
252
     }
231
   }
253
   }
232
-  void copy_and_scalePID_d(const int8_t e) {
254
+  void apply_PID_d(const int8_t e) {
233
     switch (e) {
255
     switch (e) {
234
       #if ENABLED(PIDTEMPBED)
256
       #if ENABLED(PIDTEMPBED)
235
-        case H_BED: thermalManager.temp_bed.pid.Kd = scalePID_d(raw_Kd); break;
257
+        case H_BED: thermalManager.temp_bed.pid.set_Kd(raw_Kd); break;
236
       #endif
258
       #endif
237
       #if ENABLED(PIDTEMPCHAMBER)
259
       #if ENABLED(PIDTEMPCHAMBER)
238
-        case H_CHAMBER: thermalManager.temp_chamber.pid.Kd = scalePID_d(raw_Kd); break;
260
+        case H_CHAMBER: thermalManager.temp_chamber.pid.set_Kd(raw_Kd); break;
239
       #endif
261
       #endif
240
       default:
262
       default:
241
         #if ENABLED(PIDTEMP)
263
         #if ENABLED(PIDTEMP)
242
-          PID_PARAM(Kd, e) = scalePID_d(raw_Kd);
264
+          SET_HOTEND_PID(Kd, e, raw_Kd);
243
           thermalManager.updatePID();
265
           thermalManager.updatePID();
244
         #endif
266
         #endif
245
         break;
267
         break;
291
 
313
 
292
     #if BOTH(PIDTEMP, PID_EDIT_MENU)
314
     #if BOTH(PIDTEMP, PID_EDIT_MENU)
293
       #define __PID_HOTEND_MENU_ITEMS(N) \
315
       #define __PID_HOTEND_MENU_ITEMS(N) \
294
-        raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \
295
-        raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \
296
-        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &PID_PARAM(Kp, N), 1, 9990); \
297
-        EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
298
-        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
316
+        raw_Kp = thermalManager.temp_hotend[N].pid.p(); \
317
+        raw_Ki = thermalManager.temp_hotend[N].pid.i(); \
318
+        raw_Kd = thermalManager.temp_hotend[N].pid.d(); \
319
+        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &raw_Kp, 1, 9990, []{ apply_PID_p(N); }); \
320
+        EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ apply_PID_i(N); }); \
321
+        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ apply_PID_d(N); })
299
 
322
 
300
       #if ENABLED(PID_EXTRUSION_SCALING)
323
       #if ENABLED(PID_EXTRUSION_SCALING)
301
         #define _PID_HOTEND_MENU_ITEMS(N) \
324
         #define _PID_HOTEND_MENU_ITEMS(N) \
302
           __PID_HOTEND_MENU_ITEMS(N); \
325
           __PID_HOTEND_MENU_ITEMS(N); \
303
-          EDIT_ITEM_N(float4, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990)
326
+          raw_Kc = thermalManager.temp_hotend[N].pid.c(); \
327
+          EDIT_ITEM_N(float4, N, MSG_PID_C_E, &raw_Kc, 1, 9990, []{ SET_HOTEND_PID(Kc, N, raw_Kc); thermalManager.updatePID(); });
304
       #else
328
       #else
305
         #define _PID_HOTEND_MENU_ITEMS(N) __PID_HOTEND_MENU_ITEMS(N)
329
         #define _PID_HOTEND_MENU_ITEMS(N) __PID_HOTEND_MENU_ITEMS(N)
306
       #endif
330
       #endif
308
       #if ENABLED(PID_FAN_SCALING)
332
       #if ENABLED(PID_FAN_SCALING)
309
         #define _HOTEND_PID_EDIT_MENU_ITEMS(N) \
333
         #define _HOTEND_PID_EDIT_MENU_ITEMS(N) \
310
           _PID_HOTEND_MENU_ITEMS(N); \
334
           _PID_HOTEND_MENU_ITEMS(N); \
311
-          EDIT_ITEM_N(float4, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990)
335
+          raw_Kf = thermalManager.temp_hotend[N].pid.f(); \
336
+          EDIT_ITEM_N(float4, N, MSG_PID_F_E, &raw_Kf, 1, 9990, []{ SET_HOTEND_PID(Kf, N, raw_Kf); thermalManager.updatePID(); });
312
       #else
337
       #else
313
         #define _HOTEND_PID_EDIT_MENU_ITEMS(N) _PID_HOTEND_MENU_ITEMS(N)
338
         #define _HOTEND_PID_EDIT_MENU_ITEMS(N) _PID_HOTEND_MENU_ITEMS(N)
314
       #endif
339
       #endif
321
 
346
 
322
     #if ENABLED(PID_EDIT_MENU) && EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
347
     #if ENABLED(PID_EDIT_MENU) && EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
323
       #define _PID_EDIT_ITEMS_TMPL(N,T) \
348
       #define _PID_EDIT_ITEMS_TMPL(N,T) \
324
-        raw_Ki = unscalePID_i(T.pid.Ki); \
325
-        raw_Kd = unscalePID_d(T.pid.Kd); \
326
-        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \
327
-        EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
328
-        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
349
+        raw_Kp = T.pid.p(); \
350
+        raw_Ki = T.pid.i(); \
351
+        raw_Kd = T.pid.d(); \
352
+        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &raw_Kp, 1, 9990, []{ apply_PID_p(N); }); \
353
+        EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ apply_PID_i(N); }); \
354
+        EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ apply_PID_d(N); })
329
     #endif
355
     #endif
330
 
356
 
331
     #if ENABLED(PIDTEMP)
357
     #if ENABLED(PIDTEMP)

+ 49
- 83
Marlin/src/module/settings.cpp View File

364
   //
364
   //
365
   // PIDTEMP
365
   // PIDTEMP
366
   //
366
   //
367
-  PIDCF_t hotendPID[HOTENDS];                           // M301 En PIDCF / M303 En U
367
+  raw_pidcf_t hotendPID[HOTENDS];                       // M301 En PIDCF / M303 En U
368
   int16_t lpq_len;                                      // M301 L
368
   int16_t lpq_len;                                      // M301 L
369
 
369
 
370
   //
370
   //
371
   // PIDTEMPBED
371
   // PIDTEMPBED
372
   //
372
   //
373
-  PID_t bedPID;                                         // M304 PID / M303 E-1 U
373
+  raw_pid_t bedPID;                                     // M304 PID / M303 E-1 U
374
 
374
 
375
   //
375
   //
376
   // PIDTEMPCHAMBER
376
   // PIDTEMPCHAMBER
377
   //
377
   //
378
-  PID_t chamberPID;                                     // M309 PID / M303 E-2 U
378
+  raw_pid_t chamberPID;                                 // M309 PID / M303 E-2 U
379
 
379
 
380
   //
380
   //
381
   // User-defined Thermistors
381
   // User-defined Thermistors
1052
     //
1052
     //
1053
     {
1053
     {
1054
       _FIELD_TEST(hotendPID);
1054
       _FIELD_TEST(hotendPID);
1055
+      #if DISABLED(PIDTEMP)
1056
+        raw_pidcf_t pidcf = { NAN, NAN, NAN, NAN, NAN };
1057
+      #endif
1055
       HOTEND_LOOP() {
1058
       HOTEND_LOOP() {
1056
-        PIDCF_t pidcf = {
1057
-          #if DISABLED(PIDTEMP)
1058
-            NAN, NAN, NAN,
1059
-            NAN, NAN
1060
-          #else
1061
-                         PID_PARAM(Kp, e),
1062
-            unscalePID_i(PID_PARAM(Ki, e)),
1063
-            unscalePID_d(PID_PARAM(Kd, e)),
1064
-                         PID_PARAM(Kc, e),
1065
-                         PID_PARAM(Kf, e)
1066
-          #endif
1067
-        };
1059
+        #if ENABLED(PIDTEMP)
1060
+          const hotend_pid_t &pid = thermalManager.temp_hotend[e].pid;
1061
+          raw_pidcf_t pidcf = { pid.p(), pid.i(), pid.d(), pid.c(), pid.f() };
1062
+        #endif
1068
         EEPROM_WRITE(pidcf);
1063
         EEPROM_WRITE(pidcf);
1069
       }
1064
       }
1070
 
1065
 
1071
       _FIELD_TEST(lpq_len);
1066
       _FIELD_TEST(lpq_len);
1072
-      #if DISABLED(PID_EXTRUSION_SCALING)
1073
-        const int16_t lpq_len = 20;
1074
-      #endif
1075
-      EEPROM_WRITE(TERN(PID_EXTRUSION_SCALING, thermalManager.lpq_len, lpq_len));
1067
+      const int16_t lpq_len = TERN(PID_EXTRUSION_SCALING, thermalManager.lpq_len, 20);
1068
+      EEPROM_WRITE(lpq_len);
1076
     }
1069
     }
1077
 
1070
 
1078
     //
1071
     //
1080
     //
1073
     //
1081
     {
1074
     {
1082
       _FIELD_TEST(bedPID);
1075
       _FIELD_TEST(bedPID);
1083
-
1084
-      const PID_t bed_pid = {
1085
-        #if DISABLED(PIDTEMPBED)
1086
-          NAN, NAN, NAN
1087
-        #else
1088
-          // Store the unscaled PID values
1089
-          thermalManager.temp_bed.pid.Kp,
1090
-          unscalePID_i(thermalManager.temp_bed.pid.Ki),
1091
-          unscalePID_d(thermalManager.temp_bed.pid.Kd)
1092
-        #endif
1093
-      };
1076
+      #if ENABLED(PIDTEMPBED)
1077
+        const PID_t &pid = thermalManager.temp_bed.pid;
1078
+        const raw_pid_t bed_pid = { pid.p(), pid.i(), pid.d() };
1079
+      #else
1080
+        const raw_pid_t bed_pid = { NAN, NAN, NAN };
1081
+      #endif
1094
       EEPROM_WRITE(bed_pid);
1082
       EEPROM_WRITE(bed_pid);
1095
     }
1083
     }
1096
 
1084
 
1099
     //
1087
     //
1100
     {
1088
     {
1101
       _FIELD_TEST(chamberPID);
1089
       _FIELD_TEST(chamberPID);
1102
-
1103
-      const PID_t chamber_pid = {
1104
-        #if DISABLED(PIDTEMPCHAMBER)
1105
-          NAN, NAN, NAN
1106
-        #else
1107
-          // Store the unscaled PID values
1108
-          thermalManager.temp_chamber.pid.Kp,
1109
-          unscalePID_i(thermalManager.temp_chamber.pid.Ki),
1110
-          unscalePID_d(thermalManager.temp_chamber.pid.Kd)
1111
-        #endif
1112
-      };
1090
+      #if ENABLED(PIDTEMPCHAMBER)
1091
+        const PID_t &pid = thermalManager.temp_chamber.pid;
1092
+        const raw_pid_t chamber_pid = { pid.p(), pid.i(), pid.d() };
1093
+      #else
1094
+        const raw_pid_t chamber_pid = { NAN, NAN, NAN };
1095
+      #endif
1113
       EEPROM_WRITE(chamber_pid);
1096
       EEPROM_WRITE(chamber_pid);
1114
     }
1097
     }
1115
 
1098
 
1117
     // User-defined Thermistors
1100
     // User-defined Thermistors
1118
     //
1101
     //
1119
     #if HAS_USER_THERMISTORS
1102
     #if HAS_USER_THERMISTORS
1120
-    {
1121
       _FIELD_TEST(user_thermistor);
1103
       _FIELD_TEST(user_thermistor);
1122
       EEPROM_WRITE(thermalManager.user_thermistor);
1104
       EEPROM_WRITE(thermalManager.user_thermistor);
1123
-    }
1124
     #endif
1105
     #endif
1125
 
1106
 
1126
     //
1107
     //
2003
       //
1984
       //
2004
       {
1985
       {
2005
         HOTEND_LOOP() {
1986
         HOTEND_LOOP() {
2006
-          PIDCF_t pidcf;
1987
+          raw_pidcf_t pidcf;
2007
           EEPROM_READ(pidcf);
1988
           EEPROM_READ(pidcf);
2008
           #if ENABLED(PIDTEMP)
1989
           #if ENABLED(PIDTEMP)
2009
-            if (!validating && !isnan(pidcf.Kp)) {
2010
-              // Scale PID values since EEPROM values are unscaled
2011
-              PID_PARAM(Kp, e) = pidcf.Kp;
2012
-              PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki);
2013
-              PID_PARAM(Kd, e) = scalePID_d(pidcf.Kd);
2014
-              TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = pidcf.Kc);
2015
-              TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = pidcf.Kf);
2016
-            }
1990
+            if (!validating && !isnan(pidcf.p))
1991
+              thermalManager.temp_hotend[e].pid.set(pidcf);
2017
           #endif
1992
           #endif
2018
         }
1993
         }
2019
       }
1994
       }
2035
       // Heated Bed PID
2010
       // Heated Bed PID
2036
       //
2011
       //
2037
       {
2012
       {
2038
-        PID_t pid;
2013
+        raw_pid_t pid;
2039
         EEPROM_READ(pid);
2014
         EEPROM_READ(pid);
2040
         #if ENABLED(PIDTEMPBED)
2015
         #if ENABLED(PIDTEMPBED)
2041
-          if (!validating && !isnan(pid.Kp)) {
2042
-            // Scale PID values since EEPROM values are unscaled
2043
-            thermalManager.temp_bed.pid.Kp = pid.Kp;
2044
-            thermalManager.temp_bed.pid.Ki = scalePID_i(pid.Ki);
2045
-            thermalManager.temp_bed.pid.Kd = scalePID_d(pid.Kd);
2046
-          }
2016
+          if (!validating && !isnan(pid.p))
2017
+            thermalManager.temp_bed.pid.set(pid);
2047
         #endif
2018
         #endif
2048
       }
2019
       }
2049
 
2020
 
2051
       // Heated Chamber PID
2022
       // Heated Chamber PID
2052
       //
2023
       //
2053
       {
2024
       {
2054
-        PID_t pid;
2025
+        raw_pid_t pid;
2055
         EEPROM_READ(pid);
2026
         EEPROM_READ(pid);
2056
         #if ENABLED(PIDTEMPCHAMBER)
2027
         #if ENABLED(PIDTEMPCHAMBER)
2057
-          if (!validating && !isnan(pid.Kp)) {
2058
-            // Scale PID values since EEPROM values are unscaled
2059
-            thermalManager.temp_chamber.pid.Kp = pid.Kp;
2060
-            thermalManager.temp_chamber.pid.Ki = scalePID_i(pid.Ki);
2061
-            thermalManager.temp_chamber.pid.Kd = scalePID_d(pid.Kd);
2062
-          }
2028
+          if (!validating && !isnan(pid.p))
2029
+            thermalManager.temp_chamber.pid.set(pid);
2063
         #endif
2030
         #endif
2064
       }
2031
       }
2065
 
2032
 
3142
       #define PID_DEFAULT(N,E) DEFAULT_##N
3109
       #define PID_DEFAULT(N,E) DEFAULT_##N
3143
     #endif
3110
     #endif
3144
     HOTEND_LOOP() {
3111
     HOTEND_LOOP() {
3145
-      PID_PARAM(Kp, e) =      float(PID_DEFAULT(Kp, ALIM(e, defKp)));
3146
-      PID_PARAM(Ki, e) = scalePID_i(PID_DEFAULT(Ki, ALIM(e, defKi)));
3147
-      PID_PARAM(Kd, e) = scalePID_d(PID_DEFAULT(Kd, ALIM(e, defKd)));
3148
-      TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = float(PID_DEFAULT(Kc, ALIM(e, defKc))));
3149
-      TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = float(PID_DEFAULT(Kf, ALIM(e, defKf))));
3112
+      thermalManager.temp_hotend[e].pid.set(
3113
+        PID_DEFAULT(Kp, ALIM(e, defKp)),
3114
+        PID_DEFAULT(Ki, ALIM(e, defKi)),
3115
+        PID_DEFAULT(Kd, ALIM(e, defKd))
3116
+        OPTARG(PID_EXTRUSION_SCALING, PID_DEFAULT(Kc, ALIM(e, defKc)))
3117
+        OPTARG(PID_FAN_SCALING, PID_DEFAULT(Kf, ALIM(e, defKf)))
3118
+      );
3150
     }
3119
     }
3151
   #endif
3120
   #endif
3152
 
3121
 
3160
   //
3129
   //
3161
 
3130
 
3162
   #if ENABLED(PIDTEMPBED)
3131
   #if ENABLED(PIDTEMPBED)
3163
-    thermalManager.temp_bed.pid.Kp = DEFAULT_bedKp;
3164
-    thermalManager.temp_bed.pid.Ki = scalePID_i(DEFAULT_bedKi);
3165
-    thermalManager.temp_bed.pid.Kd = scalePID_d(DEFAULT_bedKd);
3132
+    thermalManager.temp_bed.pid.set(DEFAULT_bedKp, DEFAULT_bedKi, DEFAULT_bedKd);
3166
   #endif
3133
   #endif
3167
 
3134
 
3168
   //
3135
   //
3170
   //
3137
   //
3171
 
3138
 
3172
   #if ENABLED(PIDTEMPCHAMBER)
3139
   #if ENABLED(PIDTEMPCHAMBER)
3173
-    thermalManager.temp_chamber.pid.Kp = DEFAULT_chamberKp;
3174
-    thermalManager.temp_chamber.pid.Ki = scalePID_i(DEFAULT_chamberKi);
3175
-    thermalManager.temp_chamber.pid.Kd = scalePID_d(DEFAULT_chamberKd);
3140
+    thermalManager.temp_chamber.pid.set(DEFAULT_chamberKp, DEFAULT_chamberKi, DEFAULT_chamberKd);
3176
   #endif
3141
   #endif
3177
 
3142
 
3178
   //
3143
   //
3342
     static_assert(COUNT(_filament_heat_capacity_permm) == HOTENDS, "FILAMENT_HEAT_CAPACITY_PERMM must have HOTENDS items.");
3307
     static_assert(COUNT(_filament_heat_capacity_permm) == HOTENDS, "FILAMENT_HEAT_CAPACITY_PERMM must have HOTENDS items.");
3343
 
3308
 
3344
     HOTEND_LOOP() {
3309
     HOTEND_LOOP() {
3345
-      thermalManager.temp_hotend[e].constants.heater_power = _mpc_heater_power[e];
3346
-      thermalManager.temp_hotend[e].constants.block_heat_capacity = _mpc_block_heat_capacity[e];
3347
-      thermalManager.temp_hotend[e].constants.sensor_responsiveness = _mpc_sensor_responsiveness[e];
3348
-      thermalManager.temp_hotend[e].constants.ambient_xfer_coeff_fan0 = _mpc_ambient_xfer_coeff[e];
3310
+      MPC_t &constants = thermalManager.temp_hotend[e].constants;
3311
+      constants.heater_power = _mpc_heater_power[e];
3312
+      constants.block_heat_capacity = _mpc_block_heat_capacity[e];
3313
+      constants.sensor_responsiveness = _mpc_sensor_responsiveness[e];
3314
+      constants.ambient_xfer_coeff_fan0 = _mpc_ambient_xfer_coeff[e];
3349
       #if ENABLED(MPC_INCLUDE_FAN)
3315
       #if ENABLED(MPC_INCLUDE_FAN)
3350
-        thermalManager.temp_hotend[e].constants.fan255_adjustment = _mpc_ambient_xfer_coeff_fan255[e] - _mpc_ambient_xfer_coeff[e];
3316
+        constants.fan255_adjustment = _mpc_ambient_xfer_coeff_fan255[e] - _mpc_ambient_xfer_coeff[e];
3351
       #endif
3317
       #endif
3352
-      thermalManager.temp_hotend[e].constants.filament_heat_capacity_permm = _filament_heat_capacity_permm[e];
3318
+      constants.filament_heat_capacity_permm = _filament_heat_capacity_permm[e];
3353
     }
3319
     }
3354
   #endif
3320
   #endif
3355
 
3321
 

+ 22
- 25
Marlin/src/module/temperature.cpp View File

597
     millis_t next_temp_ms = millis(), t1 = next_temp_ms, t2 = next_temp_ms;
597
     millis_t next_temp_ms = millis(), t1 = next_temp_ms, t2 = next_temp_ms;
598
     long t_high = 0, t_low = 0;
598
     long t_high = 0, t_low = 0;
599
 
599
 
600
-    PID_t tune_pid = { 0, 0, 0 };
600
+    raw_pid_t tune_pid = { 0, 0, 0 };
601
     celsius_float_t maxT = 0, minT = 10000;
601
     celsius_float_t maxT = 0, minT = 10000;
602
 
602
 
603
     const bool isbed = (heater_id == H_BED),
603
     const bool isbed = (heater_id == H_BED),
716
                           pf = (ischamber || isbed) ? 0.2f : 0.6f,
716
                           pf = (ischamber || isbed) ? 0.2f : 0.6f,
717
                           df = (ischamber || isbed) ? 1.0f / 3.0f : 1.0f / 8.0f;
717
                           df = (ischamber || isbed) ? 1.0f / 3.0f : 1.0f / 8.0f;
718
 
718
 
719
-              tune_pid.Kp = Ku * pf;
720
-              tune_pid.Ki = tune_pid.Kp * 2.0f / Tu;
721
-              tune_pid.Kd = tune_pid.Kp * Tu * df;
719
+              tune_pid.p = Ku * pf;
720
+              tune_pid.i = tune_pid.p * 2.0f / Tu;
721
+              tune_pid.d = tune_pid.p * Tu * df;
722
 
722
 
723
               SERIAL_ECHOLNPGM(STR_KU, Ku, STR_TU, Tu);
723
               SERIAL_ECHOLNPGM(STR_KU, Ku, STR_TU, Tu);
724
               if (ischamber || isbed)
724
               if (ischamber || isbed)
725
                 SERIAL_ECHOLNPGM(" No overshoot");
725
                 SERIAL_ECHOLNPGM(" No overshoot");
726
               else
726
               else
727
                 SERIAL_ECHOLNPGM(STR_CLASSIC_PID);
727
                 SERIAL_ECHOLNPGM(STR_CLASSIC_PID);
728
-              SERIAL_ECHOLNPGM(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd);
728
+              SERIAL_ECHOLNPGM(STR_KP, tune_pid.p, STR_KI, tune_pid.i, STR_KD, tune_pid.d);
729
             }
729
             }
730
           }
730
           }
731
           SHV((bias + d) >> 1);
731
           SHV((bias + d) >> 1);
795
 
795
 
796
         #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
796
         #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
797
           FSTR_P const estring = GHV(F("chamber"), F("bed"), FPSTR(NUL_STR));
797
           FSTR_P const estring = GHV(F("chamber"), F("bed"), FPSTR(NUL_STR));
798
-          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kp ", tune_pid.Kp);
799
-          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Ki ", tune_pid.Ki);
800
-          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kd ", tune_pid.Kd);
798
+          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kp ", tune_pid.p);
799
+          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Ki ", tune_pid.i);
800
+          say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kd ", tune_pid.d);
801
         #else
801
         #else
802
-          say_default_(); SERIAL_ECHOLNPGM("Kp ", tune_pid.Kp);
803
-          say_default_(); SERIAL_ECHOLNPGM("Ki ", tune_pid.Ki);
804
-          say_default_(); SERIAL_ECHOLNPGM("Kd ", tune_pid.Kd);
802
+          say_default_(); SERIAL_ECHOLNPGM("Kp ", tune_pid.p);
803
+          say_default_(); SERIAL_ECHOLNPGM("Ki ", tune_pid.i);
804
+          say_default_(); SERIAL_ECHOLNPGM("Kd ", tune_pid.d);
805
         #endif
805
         #endif
806
 
806
 
807
-        auto _set_hotend_pid = [](const uint8_t e, const PID_t &in_pid) {
807
+        auto _set_hotend_pid = [](const uint8_t tool, const raw_pid_t &in_pid) {
808
           #if ENABLED(PIDTEMP)
808
           #if ENABLED(PIDTEMP)
809
-            PID_PARAM(Kp, e) = in_pid.Kp;
810
-            PID_PARAM(Ki, e) = scalePID_i(in_pid.Ki);
811
-            PID_PARAM(Kd, e) = scalePID_d(in_pid.Kd);
809
+            #if ENABLED(PID_PARAMS_PER_HOTEND)
810
+              thermalManager.temp_hotend[tool].pid.set(in_pid);
811
+            #else
812
+              HOTEND_LOOP() thermalManager.temp_hotend[e].pid.set(in_pid);
813
+            #endif
812
             updatePID();
814
             updatePID();
813
-          #else
814
-            UNUSED(e); UNUSED(in_pid);
815
           #endif
815
           #endif
816
+          UNUSED(tool); UNUSED(in_pid);
816
         };
817
         };
817
 
818
 
818
         #if ENABLED(PIDTEMPBED)
819
         #if ENABLED(PIDTEMPBED)
819
-          auto _set_bed_pid = [](const PID_t &in_pid) {
820
-            temp_bed.pid.Kp = in_pid.Kp;
821
-            temp_bed.pid.Ki = scalePID_i(in_pid.Ki);
822
-            temp_bed.pid.Kd = scalePID_d(in_pid.Kd);
820
+          auto _set_bed_pid = [](const raw_pid_t &in_pid) {
821
+            temp_bed.pid.set(in_pid);
823
           };
822
           };
824
         #endif
823
         #endif
825
 
824
 
826
         #if ENABLED(PIDTEMPCHAMBER)
825
         #if ENABLED(PIDTEMPCHAMBER)
827
-          auto _set_chamber_pid = [](const PID_t &in_pid) {
828
-            temp_chamber.pid.Kp = in_pid.Kp;
829
-            temp_chamber.pid.Ki = scalePID_i(in_pid.Ki);
830
-            temp_chamber.pid.Kd = scalePID_d(in_pid.Kd);
826
+          auto _set_chamber_pid = [](const raw_pid_t &in_pid) {
827
+            temp_chamber.pid.set(in_pid);
831
           };
828
           };
832
         #endif
829
         #endif
833
 
830
 

+ 126
- 54
Marlin/src/module/temperature.h View File

60
   H_NONE = -128
60
   H_NONE = -128
61
 } heater_id_t;
61
 } heater_id_t;
62
 
62
 
63
-// PID storage
64
-typedef struct { float Kp, Ki, Kd;     } PID_t;
65
-typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t;
66
-typedef struct { float Kp, Ki, Kd, Kf; } PIDF_t;
67
-typedef struct { float Kp, Ki, Kd, Kc, Kf; } PIDCF_t;
68
-
69
-typedef
70
-  #if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING)
71
-    PIDCF_t
72
-  #elif ENABLED(PID_EXTRUSION_SCALING)
73
-    PIDC_t
74
-  #elif ENABLED(PID_FAN_SCALING)
75
-    PIDF_t
76
-  #else
77
-    PID_t
78
-  #endif
79
-hotend_pid_t;
80
-
81
-#if ENABLED(PID_EXTRUSION_SCALING)
82
-  typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t;
83
-#endif
84
-
85
-#define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0 & H)) // Always use 'H' to suppress warning
86
-#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN)
87
-#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN)
88
-#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN)
89
-#if ENABLED(PIDTEMP)
90
-  #define _PID_Kc(H) TERN(PID_EXTRUSION_SCALING, Temperature::temp_hotend[H].pid.Kc, 1)
91
-  #define _PID_Kf(H) TERN(PID_FAN_SCALING,       Temperature::temp_hotend[H].pid.Kf, 0)
92
-#else
93
-  #define _PID_Kc(H) 1
94
-  #define _PID_Kf(H) 0
95
-#endif
96
-
97
-#if ENABLED(MPCTEMP)
98
-  typedef struct {
99
-    float heater_power;                 // M306 P
100
-    float block_heat_capacity;          // M306 C
101
-    float sensor_responsiveness;        // M306 R
102
-    float ambient_xfer_coeff_fan0;      // M306 A
103
-    #if ENABLED(MPC_INCLUDE_FAN)
104
-      float fan255_adjustment;          // M306 F
105
-    #endif
106
-    float filament_heat_capacity_permm; // M306 H
107
-  } MPC_t;
108
-#endif
109
-
110
 /**
63
 /**
111
  * States for ADC reading in the ISR
64
  * States for ADC reading in the ISR
112
  */
65
  */
188
 
141
 
189
 #define ACTUAL_ADC_SAMPLES _MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady))
142
 #define ACTUAL_ADC_SAMPLES _MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady))
190
 
143
 
144
+//
145
+// PID
146
+//
147
+
148
+typedef struct { float p, i, d; } raw_pid_t;
149
+typedef struct { float p, i, d, c, f; } raw_pidcf_t;
150
+
191
 #if HAS_PID_HEATING
151
 #if HAS_PID_HEATING
152
+
192
   #define PID_K2 (1-float(PID_K1))
153
   #define PID_K2 (1-float(PID_K1))
193
   #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (TEMP_TIMER_FREQUENCY))
154
   #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (TEMP_TIMER_FREQUENCY))
194
 
155
 
197
   #define unscalePID_i(i) ( float(i) / PID_dT )
158
   #define unscalePID_i(i) ( float(i) / PID_dT )
198
   #define scalePID_d(d)   ( float(d) / PID_dT )
159
   #define scalePID_d(d)   ( float(d) / PID_dT )
199
   #define unscalePID_d(d) ( float(d) * PID_dT )
160
   #define unscalePID_d(d) ( float(d) * PID_dT )
161
+
162
+  typedef struct {
163
+    float Kp, Ki, Kd;
164
+    float p() const { return Kp; }
165
+    float i() const { return unscalePID_i(Ki); }
166
+    float d() const { return unscalePID_d(Kd); }
167
+    float c() const { return 1; }
168
+    float f() const { return 0; }
169
+    void set_Kp(float p) { Kp = p; }
170
+    void set_Ki(float i) { Ki = scalePID_i(i); }
171
+    void set_Kd(float d) { Kd = scalePID_d(d); }
172
+    void set_Kc(float) {}
173
+    void set_Kf(float) {}
174
+    void set(float p, float i, float d, float c=1, float f=0) { set_Kp(p); set_Ki(i); set_Kd(d); UNUSED(c); UNUSED(f); }
175
+    void set(const raw_pid_t &raw) { set(raw.p, raw.i, raw.d); }
176
+    void set(const raw_pidcf_t &raw) { set(raw.p, raw.i, raw.d); }
177
+  } PID_t;
178
+
200
 #endif
179
 #endif
201
 
180
 
202
-#if ENABLED(MPCTEMP)
181
+#if ENABLED(PIDTEMP)
182
+
183
+  typedef struct {
184
+    float Kp, Ki, Kd, Kc;
185
+    float p() const { return Kp; }
186
+    float i() const { return unscalePID_i(Ki); }
187
+    float d() const { return unscalePID_d(Kd); }
188
+    float c() const { return Kc; }
189
+    float f() const { return 0; }
190
+    void set_Kp(float p) { Kp = p; }
191
+    void set_Ki(float i) { Ki = scalePID_i(i); }
192
+    void set_Kd(float d) { Kd = scalePID_d(d); }
193
+    void set_Kc(float c) { Kc = c; }
194
+    void set_Kf(float) {}
195
+    void set(float p, float i, float d, float c=1, float f=0) { set_Kp(p); set_Ki(i); set_Kd(d); set_Kc(c); set_Kf(f); }
196
+    void set(const raw_pid_t &raw) { set(raw.p, raw.i, raw.d); }
197
+    void set(const raw_pidcf_t &raw) { set(raw.p, raw.i, raw.d, raw.c); }
198
+  } PIDC_t;
199
+
200
+  typedef struct {
201
+    float Kp, Ki, Kd, Kf;
202
+    float p() const { return Kp; }
203
+    float i() const { return unscalePID_i(Ki); }
204
+    float d() const { return unscalePID_d(Kd); }
205
+    float c() const { return 1; }
206
+    float f() const { return Kf; }
207
+    void set_Kp(float p) { Kp = p; }
208
+    void set_Ki(float i) { Ki = scalePID_i(i); }
209
+    void set_Kd(float d) { Kd = scalePID_d(d); }
210
+    void set_Kc(float) {}
211
+    void set_Kf(float f) { Kf = f; }
212
+    void set(float p, float i, float d, float c=1, float f=0) { set_Kp(p); set_Ki(i); set_Kd(d); set_Kf(f); }
213
+    void set(const raw_pid_t &raw) { set(raw.p, raw.i, raw.d); }
214
+    void set(const raw_pidcf_t &raw) { set(raw.p, raw.i, raw.d, raw.f); }
215
+  } PIDF_t;
216
+
217
+  typedef struct {
218
+    float Kp, Ki, Kd, Kc, Kf;
219
+    float p() const { return Kp; }
220
+    float i() const { return unscalePID_i(Ki); }
221
+    float d() const { return unscalePID_d(Kd); }
222
+    float c() const { return Kc; }
223
+    float f() const { return Kf; }
224
+    void set_Kp(float p) { Kp = p; }
225
+    void set_Ki(float i) { Ki = scalePID_i(i); }
226
+    void set_Kd(float d) { Kd = scalePID_d(d); }
227
+    void set_Kc(float c) { Kc = c; }
228
+    void set_Kf(float f) { Kf = f; }
229
+    void set(float p, float i, float d, float c=1, float f=0) { set_Kp(p); set_Ki(i); set_Kd(d); set_Kc(c); set_Kf(f); }
230
+    void set(const raw_pid_t &raw) { set(raw.p, raw.i, raw.d); }
231
+    void set(const raw_pidcf_t &raw) { set(raw.p, raw.i, raw.d, raw.c, raw.f); }
232
+  } PIDCF_t;
233
+
234
+  typedef
235
+    #if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING)
236
+      PIDCF_t
237
+    #elif ENABLED(PID_EXTRUSION_SCALING)
238
+      PIDC_t
239
+    #elif ENABLED(PID_FAN_SCALING)
240
+      PIDF_t
241
+    #else
242
+      PID_t
243
+    #endif
244
+  hotend_pid_t;
245
+
246
+  #if ENABLED(PID_EXTRUSION_SCALING)
247
+    typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t;
248
+  #endif
249
+
250
+  #if ENABLED(PID_PARAMS_PER_HOTEND)
251
+    #define SET_HOTEND_PID(F,H,V) thermalManager.temp_hotend[H].pid.set_##F(V)
252
+  #else
253
+    #define SET_HOTEND_PID(F,_,V) do{ HOTEND_LOOP() thermalManager.temp_hotend[e].pid.set_##F(V); }while(0)
254
+  #endif
255
+
256
+#elif ENABLED(MPCTEMP)
257
+
258
+  typedef struct {
259
+    float heater_power;                 // M306 P
260
+    float block_heat_capacity;          // M306 C
261
+    float sensor_responsiveness;        // M306 R
262
+    float ambient_xfer_coeff_fan0;      // M306 A
263
+    #if ENABLED(MPC_INCLUDE_FAN)
264
+      float fan255_adjustment;          // M306 F
265
+    #endif
266
+    float filament_heat_capacity_permm; // M306 H
267
+  } MPC_t;
268
+
203
   #define MPC_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (TEMP_TIMER_FREQUENCY))
269
   #define MPC_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (TEMP_TIMER_FREQUENCY))
270
+
204
 #endif
271
 #endif
205
 
272
 
206
 #if ENABLED(G26_MESH_VALIDATION) && EITHER(HAS_MARLINUI_MENU, EXTENSIBLE_UI)
273
 #if ENABLED(G26_MESH_VALIDATION) && EITHER(HAS_MARLINUI_MENU, EXTENSIBLE_UI)
218
   inline void sample(const raw_adc_t s) { acc += s; }
285
   inline void sample(const raw_adc_t s) { acc += s; }
219
   inline void update() { raw = acc; }
286
   inline void update() { raw = acc; }
220
   void setraw(const raw_adc_t r) { raw = r; }
287
   void setraw(const raw_adc_t r) { raw = r; }
221
-  raw_adc_t getraw() { return raw; }
288
+  raw_adc_t getraw() const { return raw; }
222
 } temp_info_t;
289
 } temp_info_t;
223
 
290
 
224
 #if HAS_TEMP_REDUNDANT
291
 #if HAS_TEMP_REDUNDANT
393
       static const celsius_t hotend_maxtemp[HOTENDS];
460
       static const celsius_t hotend_maxtemp[HOTENDS];
394
       static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); }
461
       static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); }
395
     #endif
462
     #endif
463
+
396
     #if HAS_HEATED_BED
464
     #if HAS_HEATED_BED
397
       static bed_info_t temp_bed;
465
       static bed_info_t temp_bed;
398
     #endif
466
     #endif
965
         static constexpr bool adaptive_fan_slowing = true;
1033
         static constexpr bool adaptive_fan_slowing = true;
966
       #endif
1034
       #endif
967
 
1035
 
968
-      /**
969
-       * Update the temp manager when PID values change
970
-       */
1036
+      // Update the temp manager when PID values change
971
       #if ENABLED(PIDTEMP)
1037
       #if ENABLED(PIDTEMP)
972
-        static void updatePID() {
973
-          TERN_(PID_EXTRUSION_SCALING, pes_e_position = 0);
1038
+        static void updatePID() { TERN_(PID_EXTRUSION_SCALING, pes_e_position = 0); }
1039
+        static void setPID(const uint8_t hotend, const_float_t p, const_float_t i, const_float_t d) {
1040
+          #if ENABLED(PID_PARAMS_PER_HOTEND)
1041
+            temp_hotend[hotend].pid.set(p, i, d);
1042
+          #else
1043
+            HOTEND_LOOP() temp_hotend[e].pid.set(p, i, d);
1044
+          #endif
1045
+          updatePID();
974
         }
1046
         }
975
       #endif
1047
       #endif
976
 
1048
 

+ 1
- 1
buildroot/tests/rambo View File

23
            EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \
23
            EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \
24
            BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \
24
            BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \
25
            NEOPIXEL_LED NEOPIXEL_PIN CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \
25
            NEOPIXEL_LED NEOPIXEL_PIN CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \
26
-           PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU LCD_SHOW_E_TOTAL \
26
+           PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU PID_EXTRUSION_SCALING LCD_SHOW_E_TOTAL \
27
            PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LCD_BED_TRAMMING BED_TRAMMING_INCLUDE_CENTER \
27
            PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LCD_BED_TRAMMING BED_TRAMMING_INCLUDE_CENTER \
28
            NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \
28
            NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \
29
            ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \
29
            ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \

Loading…
Cancel
Save