Browse Source

Allow setting PIDTEMP and PIDTEMPBED together or apart

Scott Lahteine 8 years ago
parent
commit
ba84d8d091
5 changed files with 101 additions and 35 deletions
  1. 6
    0
      Marlin/Conditionals.h
  2. 1
    1
      Marlin/Marlin_main.cpp
  3. 1
    1
      Marlin/configuration_store.cpp
  4. 92
    32
      Marlin/temperature.cpp
  5. 1
    1
      Marlin/ultralcd.cpp

+ 6
- 0
Marlin/Conditionals.h View File

506
   #endif
506
   #endif
507
 
507
 
508
   /**
508
   /**
509
+   * Flags for PID handling
510
+   */
511
+  #define HAS_PID_HEATING (ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED))
512
+  #define HAS_PID_FOR_BOTH (ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED))
513
+
514
+  /**
509
    * ARRAY_BY_EXTRUDERS based on EXTRUDERS
515
    * ARRAY_BY_EXTRUDERS based on EXTRUDERS
510
    */
516
    */
511
   #if EXTRUDERS > 3
517
   #if EXTRUDERS > 3

+ 1
- 1
Marlin/Marlin_main.cpp View File

5559
  *       U<bool> with a non-zero value will apply the result to current settings
5559
  *       U<bool> with a non-zero value will apply the result to current settings
5560
  */
5560
  */
5561
 inline void gcode_M303() {
5561
 inline void gcode_M303() {
5562
-  #if ENABLED(PIDTEMP)
5562
+  #if HAS_PID_HEATING
5563
     int e = code_seen('E') ? code_value_short() : 0;
5563
     int e = code_seen('E') ? code_value_short() : 0;
5564
     int c = code_seen('C') ? code_value_short() : 5;
5564
     int c = code_seen('C') ? code_value_short() : 5;
5565
     bool u = code_seen('U') && code_value_short() != 0;
5565
     bool u = code_seen('U') && code_value_short() != 0;

+ 1
- 1
Marlin/configuration_store.cpp View File

794
     SERIAL_EOL;
794
     SERIAL_EOL;
795
   #endif // ULTIPANEL
795
   #endif // ULTIPANEL
796
 
796
 
797
-  #if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)
797
+  #if HAS_PID_HEATING
798
 
798
 
799
     CONFIG_ECHO_START;
799
     CONFIG_ECHO_START;
800
     if (!forReplay) {
800
     if (!forReplay) {

+ 92
- 32
Marlin/temperature.cpp View File

221
 //================================ Functions ================================
221
 //================================ Functions ================================
222
 //===========================================================================
222
 //===========================================================================
223
 
223
 
224
-#if ENABLED(PIDTEMP)
224
+#if HAS_PID_HEATING
225
 
225
 
226
   void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false*/) {
226
   void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false*/) {
227
     float input = 0.0;
227
     float input = 0.0;
240
       millis_t next_auto_fan_check_ms = temp_ms + 2500UL;
240
       millis_t next_auto_fan_check_ms = temp_ms + 2500UL;
241
     #endif
241
     #endif
242
 
242
 
243
-    if (extruder >= EXTRUDERS
244
-      #if !HAS_TEMP_BED
243
+    if (false
244
+      #if ENABLED(PIDTEMP)
245
+         || extruder >= EXTRUDERS
246
+      #else
247
+         || extruder >= 0
248
+      #endif
249
+      #if DISABLED(PIDTEMPBED)
245
          || extruder < 0
250
          || extruder < 0
246
       #endif
251
       #endif
247
     ) {
252
     ) {
253
 
258
 
254
     disable_all_heaters(); // switch off all heaters.
259
     disable_all_heaters(); // switch off all heaters.
255
 
260
 
256
-    if (extruder < 0)
257
-      soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
258
-    else
261
+    #if HAS_PID_FOR_BOTH
262
+      if (extruder < 0)
263
+        soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
264
+      else
265
+        soft_pwm[extruder] = bias = d = (PID_MAX) / 2;
266
+    #elif ENABLED(PIDTEMP)
259
       soft_pwm[extruder] = bias = d = (PID_MAX) / 2;
267
       soft_pwm[extruder] = bias = d = (PID_MAX) / 2;
268
+    #else
269
+      soft_pwm_bed = bias = d = (MAX_BED_POWER) / 2;
270
+    #endif
260
 
271
 
261
     // PID Tuning loop
272
     // PID Tuning loop
262
     for (;;) {
273
     for (;;) {
266
       if (temp_meas_ready) { // temp sample ready
277
       if (temp_meas_ready) { // temp sample ready
267
         updateTemperaturesFromRawValues();
278
         updateTemperaturesFromRawValues();
268
 
279
 
269
-        input = (extruder < 0) ? current_temperature_bed : current_temperature[extruder];
280
+        input =
281
+          #if HAS_PID_FOR_BOTH
282
+            extruder < 0 ? current_temperature_bed : current_temperature[extruder]
283
+          #elif ENABLED(PIDTEMP)
284
+            current_temperature[extruder]
285
+          #else
286
+            current_temperature_bed
287
+          #endif
288
+        ;
270
 
289
 
271
         max = max(max, input);
290
         max = max(max, input);
272
         min = min(min, input);
291
         min = min(min, input);
281
         if (heating && input > temp) {
300
         if (heating && input > temp) {
282
           if (ELAPSED(ms, t2 + 5000UL)) {
301
           if (ELAPSED(ms, t2 + 5000UL)) {
283
             heating = false;
302
             heating = false;
284
-            if (extruder < 0)
285
-              soft_pwm_bed = (bias - d) >> 1;
286
-            else
303
+            #if HAS_PID_FOR_BOTH
304
+              if (extruder < 0)
305
+                soft_pwm_bed = (bias - d) >> 1;
306
+              else
307
+                soft_pwm[extruder] = (bias - d) >> 1;
308
+            #elif ENABLED(PIDTEMP)
287
               soft_pwm[extruder] = (bias - d) >> 1;
309
               soft_pwm[extruder] = (bias - d) >> 1;
310
+            #elif ENABLED(PIDTEMPBED)
311
+              soft_pwm_bed = (bias - d) >> 1;
312
+            #endif
288
             t1 = ms;
313
             t1 = ms;
289
             t_high = t1 - t2;
314
             t_high = t1 - t2;
290
             max = temp;
315
             max = temp;
297
             t2 = ms;
322
             t2 = ms;
298
             t_low = t2 - t1;
323
             t_low = t2 - t1;
299
             if (cycles > 0) {
324
             if (cycles > 0) {
300
-              long max_pow = extruder < 0 ? MAX_BED_POWER : PID_MAX;
325
+              long max_pow =
326
+                #if HAS_PID_FOR_BOTH
327
+                  extruder < 0 ? MAX_BED_POWER : PID_MAX
328
+                #elif ENABLED(PIDTEMP)
329
+                  PID_MAX
330
+                #else
331
+                  MAX_BED_POWER
332
+                #endif
333
+              ;
301
               bias += (d * (t_high - t_low)) / (t_low + t_high);
334
               bias += (d * (t_high - t_low)) / (t_low + t_high);
302
               bias = constrain(bias, 20, max_pow - 20);
335
               bias = constrain(bias, 20, max_pow - 20);
303
               d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias;
336
               d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias;
336
                 */
369
                 */
337
               }
370
               }
338
             }
371
             }
339
-            if (extruder < 0)
340
-              soft_pwm_bed = (bias + d) >> 1;
341
-            else
372
+            #if HAS_PID_FOR_BOTH
373
+              if (extruder < 0)
374
+                soft_pwm_bed = (bias + d) >> 1;
375
+              else
376
+                soft_pwm[extruder] = (bias + d) >> 1;
377
+            #elif ENABLED(PIDTEMP)
342
               soft_pwm[extruder] = (bias + d) >> 1;
378
               soft_pwm[extruder] = (bias + d) >> 1;
379
+            #else
380
+              soft_pwm_bed = (bias + d) >> 1;
381
+            #endif
343
             cycles++;
382
             cycles++;
344
             min = temp;
383
             min = temp;
345
           }
384
           }
366
       }
405
       }
367
       if (cycles > ncycles) {
406
       if (cycles > ncycles) {
368
         SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
407
         SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
369
-        const char* estring = extruder < 0 ? "bed" : "";
370
-        SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(workKp);
371
-        SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(workKi);
372
-        SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(workKd);
408
+
409
+        #if HAS_PID_FOR_BOTH
410
+          const char* estring = extruder < 0 ? "bed" : "";
411
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kp "); SERIAL_PROTOCOLLN(workKp);
412
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Ki "); SERIAL_PROTOCOLLN(workKi);
413
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_"); SERIAL_PROTOCOL(estring); SERIAL_PROTOCOLPGM("Kd "); SERIAL_PROTOCOLLN(workKd);
414
+        #elif ENABLED(PIDTEMP)
415
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_Kp "); SERIAL_PROTOCOLLN(workKp);
416
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_Ki "); SERIAL_PROTOCOLLN(workKi);
417
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_Kd "); SERIAL_PROTOCOLLN(workKd);
418
+        #else
419
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_bedKp "); SERIAL_PROTOCOLLN(workKp);
420
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_bedKi "); SERIAL_PROTOCOLLN(workKi);
421
+          SERIAL_PROTOCOLPGM("#define  DEFAULT_bedKd "); SERIAL_PROTOCOLLN(workKd);
422
+        #endif
423
+
424
+        #define _SET_BED_PID() \
425
+          bedKp = workKp; \
426
+          bedKi = scalePID_i(workKi); \
427
+          bedKd = scalePID_d(workKd); \
428
+          updatePID()
429
+
430
+        #define _SET_EXTRUDER_PID() \
431
+          PID_PARAM(Kp, extruder) = workKp; \
432
+          PID_PARAM(Ki, extruder) = scalePID_i(workKi); \
433
+          PID_PARAM(Kd, extruder) = scalePID_d(workKd); \
434
+          updatePID()
373
 
435
 
374
         // Use the result? (As with "M303 U1")
436
         // Use the result? (As with "M303 U1")
375
         if (set_result) {
437
         if (set_result) {
376
-          if (extruder < 0) {
377
-            #if ENABLED(PIDTEMPBED)
378
-              bedKp = workKp;
379
-              bedKi = scalePID_i(workKi);
380
-              bedKd = scalePID_d(workKd);
381
-              updatePID();
382
-            #endif
383
-          }
384
-          else {
385
-            PID_PARAM(Kp, extruder) = workKp;
386
-            PID_PARAM(Ki, extruder) = scalePID_i(workKi);
387
-            PID_PARAM(Kd, extruder) = scalePID_d(workKd);
388
-            updatePID();
389
-          }
438
+          #if HAS_PID_FOR_BOTH
439
+            if (extruder < 0) {
440
+              _SET_BED_PID();
441
+            }
442
+            else {
443
+              _SET_EXTRUDER_PID();
444
+            }
445
+          #elif ENABLED(PIDTEMP)
446
+            _SET_EXTRUDER_PID();
447
+          #else
448
+            _SET_BED_PID();
449
+          #endif
390
         }
450
         }
391
         return;
451
         return;
392
       }
452
       }

+ 1
- 1
Marlin/ultralcd.cpp View File

1343
   static void _lcd_autotune(int e) {
1343
   static void _lcd_autotune(int e) {
1344
     char cmd[30];
1344
     char cmd[30];
1345
     sprintf_P(cmd, PSTR("M303 U1 E%d S%d"), e,
1345
     sprintf_P(cmd, PSTR("M303 U1 E%d S%d"), e,
1346
-      #if ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED)
1346
+      #if HAS_PID_FOR_BOTH
1347
         e < 0 ? autotune_temp_bed : autotune_temp[e]
1347
         e < 0 ? autotune_temp_bed : autotune_temp[e]
1348
       #elif ENABLED(PIDTEMPBED)
1348
       #elif ENABLED(PIDTEMPBED)
1349
         autotune_temp_bed
1349
         autotune_temp_bed

Loading…
Cancel
Save