Bläddra i källkod

✨ Add TEMP_SENSOR_BOARD (#22279)

Katelyn Schiesser 3 år sedan
förälder
incheckning
2f6c8e1176
Inget konto är kopplat till bidragsgivarens mejladress

+ 5
- 10
Marlin/Configuration.h Visa fil

@@ -474,7 +474,7 @@
474 474
  *                NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
475 475
  *   201 : Pt100  with circuit in Overlord, similar to Ultimainboard V2.x
476 476
  *
477
- *  Custom/Dummy/Other Thermos
477
+ *  Custom/Dummy/Other Thermal Sensors
478 478
  *  ------
479 479
  *     0 : not used
480 480
  *  1000 : Custom - Specify parameters in Configuration_adv.h
@@ -496,6 +496,7 @@
496 496
 #define TEMP_SENSOR_PROBE 0
497 497
 #define TEMP_SENSOR_CHAMBER 0
498 498
 #define TEMP_SENSOR_COOLER 0
499
+#define TEMP_SENSOR_BOARD 0
499 500
 #define TEMP_SENSOR_REDUNDANT 0
500 501
 
501 502
 // Dummy thermistor constant temperature readings, for use with 998 and 999
@@ -528,17 +529,11 @@
528 529
  * the print will be aborted. Whichever sensor is selected will have its normal functions disabled; i.e. selecting
529 530
  * the Bed sensor (-1) will disable bed heating/monitoring.
530 531
  *
531
- * Use the following to select temp sensors:
532
- *    -5 : Cooler
533
- *    -4 : Probe
534
- *    -3 : not used
535
- *    -2 : Chamber
536
- *    -1 : Bed
537
- *   0-7 : E0 through E7
532
+ * For selecting source/target use: COOLER, PROBE, BOARD, CHAMBER, BED, E0, E1, E2, E3, E4, E5, E6, E7
538 533
  */
539 534
 #if TEMP_SENSOR_REDUNDANT
540
-  #define TEMP_SENSOR_REDUNDANT_SOURCE     1  // The sensor that will provide the redundant reading.
541
-  #define TEMP_SENSOR_REDUNDANT_TARGET     0  // The sensor that we are providing a redundant reading for.
535
+  #define TEMP_SENSOR_REDUNDANT_SOURCE    E1  // The sensor that will provide the redundant reading.
536
+  #define TEMP_SENSOR_REDUNDANT_TARGET    E0  // The sensor that we are providing a redundant reading for.
542 537
   #define TEMP_SENSOR_REDUNDANT_MAX_DIFF  10  // (°C) Temperature difference that will trigger a print abort.
543 538
 #endif
544 539
 

+ 31
- 9
Marlin/Configuration_adv.h Visa fil

@@ -125,6 +125,12 @@
125 125
   #define PROBE_BETA                   3950    // Beta value
126 126
 #endif
127 127
 
128
+#if TEMP_SENSOR_BOARD == 1000
129
+  #define BOARD_PULLUP_RESISTOR_OHMS   4700    // Pullup resistor
130
+  #define BOARD_RESISTANCE_25C_OHMS    100000  // Resistance at 25C
131
+  #define BOARD_BETA                   3950    // Beta value
132
+#endif
133
+
128 134
 #if TEMP_SENSOR_REDUNDANT == 1000
129 135
   #define REDUNDANT_PULLUP_RESISTOR_OHMS   4700    // Pullup resistor
130 136
   #define REDUNDANT_RESISTANCE_25C_OHMS    100000  // Resistance at 25C
@@ -225,6 +231,18 @@
225 231
 #endif
226 232
 
227 233
 //
234
+// Motherboard Sensor options
235
+//
236
+#if TEMP_SENSOR_BOARD
237
+  #define THERMAL_PROTECTION_BOARD   // Halt the printer if the board sensor leaves the temp range below.
238
+  #define BOARD_MINTEMP           8  // (°C)
239
+  #define BOARD_MAXTEMP          70  // (°C)
240
+  #ifndef TEMP_BOARD_PIN
241
+    //#define TEMP_BOARD_PIN -1      // Board temp sensor pin, if not set in pins file.
242
+  #endif
243
+#endif
244
+
245
+//
228 246
 // Laser Coolant Flow Meter
229 247
 //
230 248
 //#define LASER_COOLANT_FLOW_METER
@@ -480,16 +498,20 @@
480 498
  */
481 499
 //#define USE_CONTROLLER_FAN
482 500
 #if ENABLED(USE_CONTROLLER_FAN)
483
-  //#define CONTROLLER_FAN_PIN -1        // Set a custom pin for the controller fan
484
-  //#define CONTROLLER_FAN_USE_Z_ONLY    // With this option only the Z axis is considered
485
-  //#define CONTROLLER_FAN_IGNORE_Z      // Ignore Z stepper. Useful when stepper timeout is disabled.
486
-  #define CONTROLLERFAN_SPEED_MIN      0 // (0-255) Minimum speed. (If set below this value the fan is turned off.)
487
-  #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled
488
-  #define CONTROLLERFAN_SPEED_IDLE     0 // (0-255) Idle speed, used when motors are disabled
489
-  #define CONTROLLERFAN_IDLE_TIME     60 // (seconds) Extra time to keep the fan running after disabling motors
490
-  //#define CONTROLLER_FAN_EDITABLE      // Enable M710 configurable settings
501
+  //#define CONTROLLER_FAN_PIN -1           // Set a custom pin for the controller fan
502
+  //#define CONTROLLER_FAN_USE_Z_ONLY       // With this option only the Z axis is considered
503
+  //#define CONTROLLER_FAN_IGNORE_Z         // Ignore Z stepper. Useful when stepper timeout is disabled.
504
+  #define CONTROLLERFAN_SPEED_MIN         0 // (0-255) Minimum speed. (If set below this value the fan is turned off.)
505
+  #define CONTROLLERFAN_SPEED_ACTIVE    255 // (0-255) Active speed, used when any motor is enabled
506
+  #define CONTROLLERFAN_SPEED_IDLE        0 // (0-255) Idle speed, used when motors are disabled
507
+  #define CONTROLLERFAN_IDLE_TIME        60 // (seconds) Extra time to keep the fan running after disabling motors
508
+
509
+  // Use TEMP_SENSOR_BOARD as a trigger for enabling the controller fan
510
+  //#define CONTROLLER_FAN_MIN_BOARD_TEMP 40  // (°C) Turn on the fan if the board reaches this temperature
511
+
512
+  //#define CONTROLLER_FAN_EDITABLE         // Enable M710 configurable settings
491 513
   #if ENABLED(CONTROLLER_FAN_EDITABLE)
492
-    #define CONTROLLER_FAN_MENU          // Enable the Controller Fan submenu
514
+    #define CONTROLLER_FAN_MENU             // Enable the Controller Fan submenu
493 515
   #endif
494 516
 #endif
495 517
 

+ 2
- 2
Marlin/src/MarlinCore.cpp Visa fil

@@ -1168,10 +1168,10 @@ void setup() {
1168 1168
   SETUP_RUN(HAL_init());
1169 1169
 
1170 1170
   // Init and disable SPI thermocouples; this is still needed
1171
-  #if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0)
1171
+  #if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E0))
1172 1172
     OUT_WRITE(TEMP_0_CS_PIN, HIGH);  // Disable
1173 1173
   #endif
1174
-  #if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
1174
+  #if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E1))
1175 1175
     OUT_WRITE(TEMP_1_CS_PIN, HIGH);
1176 1176
   #endif
1177 1177
 

+ 3
- 0
Marlin/src/core/language.h Visa fil

@@ -231,6 +231,9 @@
231 231
 #define STR_HEATER_BED                      "bed"
232 232
 #define STR_HEATER_CHAMBER                  "chamber"
233 233
 #define STR_COOLER                          "cooler"
234
+#define STR_MOTHERBOARD                     "motherboard"
235
+#define STR_PROBE                           "probe"
236
+#define STR_REDUNDANT                       "redundant "
234 237
 #define STR_LASER_TEMP                      "laser temperature"
235 238
 
236 239
 #define STR_STOPPED_HEATER                  ", system stopped! Heater_ID: "

+ 8
- 3
Marlin/src/feature/controllerfan.cpp Visa fil

@@ -76,9 +76,14 @@ void ControllerFan::update() {
76 76
       )
77 77
     );
78 78
 
79
-    // If any of the drivers or the heated bed are enabled...
80
-    if (motor_on || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0))
81
-      lastMotorOn = ms; //... set time to NOW so the fan will turn on
79
+    // If any triggers for the controller fan are true...
80
+    //   - At least one stepper driver is enabled
81
+    //   - The heated bed is enabled
82
+    //   - TEMP_SENSOR_BOARD is reporting >= CONTROLLER_FAN_MIN_BOARD_TEMP
83
+    if ( motor_on
84
+      || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0)
85
+      || TERN0(HAS_CONTROLLER_FAN_MIN_BOARD_TEMP, thermalManager.wholeDegBoard() >= CONTROLLER_FAN_MIN_BOARD_TEMP)
86
+    ) lastMotorOn = ms; //... set time to NOW so the fan will turn on
82 87
 
83 88
     // Fan Settings. Set fan > 0:
84 89
     //  - If AutoMode is on and steppers have been enabled for CONTROLLERFAN_IDLE_TIME seconds.

+ 23
- 0
Marlin/src/inc/Conditionals_adv.h Visa fil

@@ -125,6 +125,29 @@
125 125
   #undef THERMAL_PROTECTION_COOLER
126 126
 #endif
127 127
 
128
+// Usurp a sensor to do redundant readings
129
+#if TEMP_SENSOR_REDUNDANT
130
+  #define REDUNDANT_TEMP_MATCH(M,N) (TEMP_SENSOR_REDUNDANT_##M == HID_##N)
131
+#else
132
+  #define REDUNDANT_TEMP_MATCH(...) 0
133
+#endif
134
+
135
+// Temperature sensor IDs
136
+#define HID_REDUNDANT -6
137
+#define HID_COOLER    -5
138
+#define HID_PROBE     -4
139
+#define HID_BOARD     -3
140
+#define HID_CHAMBER   -2
141
+#define HID_BED       -1
142
+#define HID_E0         0
143
+#define HID_E1         1
144
+#define HID_E2         2
145
+#define HID_E3         3
146
+#define HID_E4         4
147
+#define HID_E5         5
148
+#define HID_E6         6
149
+#define HID_E7         7
150
+
128 151
 #if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS))
129 152
   #define HAS_MIXER_SYNC_CHANNEL 1
130 153
 #endif

+ 58
- 33
Marlin/src/inc/Conditionals_post.h Visa fil

@@ -532,84 +532,84 @@
532 532
 // Usurp a sensor to do redundant readings
533 533
 #if TEMP_SENSOR_REDUNDANT
534 534
   #ifndef TEMP_SENSOR_REDUNDANT_SOURCE
535
-    #define TEMP_SENSOR_REDUNDANT_SOURCE 1
535
+    #define TEMP_SENSOR_REDUNDANT_SOURCE E1
536 536
   #endif
537 537
   #ifndef TEMP_SENSOR_REDUNDANT_TARGET
538
-    #define TEMP_SENSOR_REDUNDANT_TARGET 0
538
+    #define TEMP_SENSOR_REDUNDANT_TARGET E0
539 539
   #endif
540 540
   #if !PIN_EXISTS(TEMP_REDUNDANT)
541 541
     #ifndef TEMP_SENSOR_REDUNDANT_MAX_DIFF
542 542
       #define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10
543 543
     #endif
544
-    #if TEMP_SENSOR_REDUNDANT_SOURCE == -5
544
+    #if REDUNDANT_TEMP_MATCH(SOURCE, COOLER)
545 545
       #if !PIN_EXISTS(TEMP_COOLER)
546 546
         #error "TEMP_SENSOR_REDUNDANT_SOURCE set to COOLER requires TEMP_COOLER_PIN."
547 547
       #else
548 548
         #define TEMP_REDUNDANT_PIN TEMP_COOLER_PIN
549 549
       #endif
550
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == -4
550
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, PROBE)
551 551
       #if !PIN_EXISTS(TEMP_PROBE)
552 552
         #error "TEMP_SENSOR_REDUNDANT_SOURCE set to PROBE requires TEMP_PROBE_PIN."
553 553
       #else
554 554
         #define TEMP_REDUNDANT_PIN TEMP_PROBE_PIN
555 555
       #endif
556
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == -2
556
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, CHAMBER)
557 557
       #if !PIN_EXISTS(TEMP_CHAMBER)
558 558
         #error "TEMP_SENSOR_REDUNDANT_SOURCE set to CHAMBER requires TEMP_CHAMBER_PIN."
559 559
       #else
560 560
         #define TEMP_REDUNDANT_PIN TEMP_CHAMBER_PIN
561 561
       #endif
562
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == -1
562
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, BED)
563 563
       #if !PIN_EXISTS(TEMP_BED)
564 564
         #error "TEMP_SENSOR_REDUNDANT_SOURCE set to BED requires TEMP_BED_PIN."
565 565
       #else
566 566
         #define TEMP_REDUNDANT_PIN TEMP_BED_PIN
567 567
       #endif
568
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 0
568
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E0)
569 569
       #if !PIN_EXISTS(TEMP_0)
570
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 0 requires TEMP_0_PIN."
570
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E0 requires TEMP_0_PIN."
571 571
       #else
572 572
         #define TEMP_REDUNDANT_PIN TEMP_0_PIN
573 573
       #endif
574
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
574
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E1)
575 575
       #if !PIN_EXISTS(TEMP_1)
576
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 1 requires TEMP_1_PIN."
576
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E1 requires TEMP_1_PIN."
577 577
       #else
578 578
         #define TEMP_REDUNDANT_PIN TEMP_1_PIN
579 579
       #endif
580
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 2
580
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E2)
581 581
       #if !PIN_EXISTS(TEMP_2)
582
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 2 requires TEMP_2_PIN."
582
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E2 requires TEMP_2_PIN."
583 583
       #else
584 584
         #define TEMP_REDUNDANT_PIN TEMP_2_PIN
585 585
       #endif
586
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 3
586
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E3)
587 587
       #if !PIN_EXISTS(TEMP_3)
588
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 3 requires TEMP_3_PIN."
588
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E3 requires TEMP_3_PIN."
589 589
       #else
590 590
         #define TEMP_REDUNDANT_PIN TEMP_3_PIN
591 591
       #endif
592
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 4
592
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E4)
593 593
       #if !PIN_EXISTS(TEMP_4)
594
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 4 requires TEMP_4_PIN."
594
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E4 requires TEMP_4_PIN."
595 595
       #else
596 596
         #define TEMP_REDUNDANT_PIN TEMP_4_PIN
597 597
       #endif
598
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 5
598
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E5)
599 599
       #if !PIN_EXISTS(TEMP_5)
600
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 5 requires TEMP_5_PIN."
600
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E5 requires TEMP_5_PIN."
601 601
       #else
602 602
         #define TEMP_REDUNDANT_PIN TEMP_5_PIN
603 603
       #endif
604
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 6
604
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E6)
605 605
       #if !PIN_EXISTS(TEMP_6)
606
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 6 requires TEMP_6_PIN."
606
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E6 requires TEMP_6_PIN."
607 607
       #else
608 608
         #define TEMP_REDUNDANT_PIN TEMP_6_PIN
609 609
       #endif
610
-    #elif TEMP_SENSOR_REDUNDANT_SOURCE == 7
610
+    #elif REDUNDANT_TEMP_MATCH(SOURCE, E7)
611 611
       #if !PIN_EXISTS(TEMP_7)
612
-        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to 7 requires TEMP_7_PIN."
612
+        #error "TEMP_SENSOR_REDUNDANT_SOURCE set to E7 requires TEMP_7_PIN."
613 613
       #else
614 614
         #define TEMP_REDUNDANT_PIN TEMP_7_PIN
615 615
       #endif
@@ -699,7 +699,7 @@
699 699
   #define TEMP_SENSOR_REDUNDANT_IS_MAX_TC 1
700 700
 
701 701
   #if TEMP_SENSOR_REDUNDANT == -5
702
-    #if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
702
+    #if !REDUNDANT_TEMP_MATCH(SOURCE, E0) && !REDUNDANT_TEMP_MATCH(SOURCE, E1)
703 703
       #error "MAX31865 Thermocouples (-5) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
704 704
     #endif
705 705
 
@@ -707,7 +707,7 @@
707 707
     #define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN    0
708 708
     #define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1024
709 709
   #elif TEMP_SENSOR_REDUNDANT == -3
710
-    #if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
710
+    #if !REDUNDANT_TEMP_MATCH(SOURCE, E0) && !REDUNDANT_TEMP_MATCH(SOURCE, E1)
711 711
       #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
712 712
     #endif
713 713
 
@@ -715,7 +715,7 @@
715 715
     #define TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN -270
716 716
     #define TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX 1800
717 717
   #elif TEMP_SENSOR_REDUNDANT == -2
718
-    #if TEMP_SENSOR_REDUNDANT_SOURCE != 0 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
718
+    #if !REDUNDANT_TEMP_MATCH(SOURCE, E0) && !REDUNDANT_TEMP_MATCH(SOURCE, E1)
719 719
       #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_REDUNDANT_SOURCE other than TEMP_SENSOR_0/TEMP_SENSOR_1 (0/1)."
720 720
     #endif
721 721
 
@@ -725,13 +725,13 @@
725 725
   #endif
726 726
 
727 727
   // mimic setting up the source TEMP_SENSOR
728
-  #if TEMP_SENSOR_REDUNDANT_SOURCE == 0
728
+  #if REDUNDANT_TEMP_MATCH(SOURCE, E0)
729 729
     #define TEMP_SENSOR_0_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
730 730
     #define TEMP_SENSOR_0_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
731 731
     #ifndef MAX31865_SENSOR_WIRES_0
732 732
       #define MAX31865_SENSOR_WIRES_0 2
733 733
     #endif
734
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == 1
734
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, E1)
735 735
     #define TEMP_SENSOR_1_MAX_TC_TMIN TEMP_SENSOR_REDUNDANT_MAX_TC_TMIN
736 736
     #define TEMP_SENSOR_1_MAX_TC_TMAX TEMP_SENSOR_REDUNDANT_MAX_TC_TMAX
737 737
     #ifndef MAX31865_SENSOR_WIRES_1
@@ -780,7 +780,7 @@
780 780
 #if HAS_MAX_TC
781 781
 
782 782
   // Translate old _SS, _CS, _SCK, _DO, _DI, _MISO, and _MOSI PIN defines.
783
-  #if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
783
+  #if TEMP_SENSOR_0_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E1))
784 784
 
785 785
     #if !PIN_EXISTS(TEMP_0_CS) // SS, CS
786 786
       #if PIN_EXISTS(MAX6675_SS)
@@ -849,7 +849,7 @@
849 849
 
850 850
   #endif // TEMP_SENSOR_0_IS_MAX_TC
851 851
 
852
-  #if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
852
+  #if TEMP_SENSOR_1_IS_MAX_TC || (TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E1))
853 853
 
854 854
     #if !PIN_EXISTS(TEMP_1_CS) // SS2, CS2
855 855
       #if PIN_EXISTS(MAX6675_SS2)
@@ -2584,6 +2584,9 @@
2584 2584
 #if HAS_ADC_TEST(COOLER)
2585 2585
   #define HAS_TEMP_ADC_COOLER 1
2586 2586
 #endif
2587
+#if HAS_ADC_TEST(BOARD)
2588
+  #define HAS_TEMP_ADC_BOARD 1
2589
+#endif
2587 2590
 #if HAS_ADC_TEST(REDUNDANT)
2588 2591
   #define HAS_TEMP_ADC_REDUNDANT 1
2589 2592
 #endif
@@ -2604,6 +2607,9 @@
2604 2607
 #if HAS_TEMP(COOLER)
2605 2608
   #define HAS_TEMP_COOLER 1
2606 2609
 #endif
2610
+#if HAS_TEMP(BOARD)
2611
+  #define HAS_TEMP_BOARD 1
2612
+#endif
2607 2613
 #if HAS_TEMP(REDUNDANT)
2608 2614
   #define HAS_TEMP_REDUNDANT 1
2609 2615
 #endif
@@ -2675,7 +2681,8 @@
2675 2681
 #if HAS_HEATED_BED || HAS_TEMP_CHAMBER
2676 2682
   #define BED_OR_CHAMBER 1
2677 2683
 #endif
2678
-#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER
2684
+
2685
+#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER || HAS_TEMP_BOARD
2679 2686
   #define HAS_TEMP_SENSOR 1
2680 2687
 #endif
2681 2688
 
@@ -2813,9 +2820,6 @@
2813 2820
 #endif
2814 2821
 #undef _NOT_E_AUTO
2815 2822
 #undef _HAS_FAN
2816
-#if PIN_EXISTS(CONTROLLER_FAN)
2817
-  #define HAS_CONTROLLER_FAN 1
2818
-#endif
2819 2823
 
2820 2824
 #if BED_OR_CHAMBER || HAS_FAN0
2821 2825
   #define BED_OR_CHAMBER_OR_FAN 1
@@ -2892,6 +2896,27 @@
2892 2896
   #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default
2893 2897
 #endif
2894 2898
 
2899
+/**
2900
+ * Controller Fan Settings
2901
+ */
2902
+#if PIN_EXISTS(CONTROLLER_FAN)
2903
+  #define HAS_CONTROLLER_FAN 1
2904
+  #if CONTROLLER_FAN_MIN_BOARD_TEMP
2905
+    #define HAS_CONTROLLER_FAN_MIN_BOARD_TEMP 1
2906
+  #endif
2907
+#endif
2908
+
2909
+#if HAS_CONTROLLER_FAN
2910
+  #if ENABLED(CONTROLLER_FAN_USE_BOARD_TEMP)
2911
+    #define HAS_CONTROLLER_FAN_BOARD_TEMP_TRIGGER 1
2912
+    #ifndef CONTROLLER_FAN_TRIGGER_TEMP
2913
+      #define CONTROLLER_FAN_TRIGGER_TEMP 30
2914
+    #endif
2915
+  #else
2916
+    #undef CONTROLLER_FAN_TRIGGER_TEMP
2917
+  #endif
2918
+#endif
2919
+
2895 2920
 // Servos
2896 2921
 #if PIN_EXISTS(SERVO0) && NUM_SERVOS > 0
2897 2922
   #define HAS_SERVO_0 1

+ 80
- 56
Marlin/src/inc/SanityCheck.h Visa fil

@@ -583,6 +583,10 @@
583 583
   #error "TEMP_SENSOR_1_AS_REDUNDANT is now TEMP_SENSOR_REDUNDANT, with associated TEMP_SENSOR_REDUNDANT_* config."
584 584
 #elif defined(MAX_REDUNDANT_TEMP_SENSOR_DIFF)
585 585
   #error "MAX_REDUNDANT_TEMP_SENSOR_DIFF is now TEMP_SENSOR_REDUNDANT_MAX_DIFF"
586
+#elif MOTHERBOARD == BOARD_DUE3DOM_MINI && PIN_EXISTS(TEMP_2) && DISABLED(TEMP_SENSOR_BOARD)
587
+  #warning "Onboard temperature sensor for BOARD_DUE3DOM_MINI has moved from TEMP_SENSOR_2 (TEMP_2_PIN) to TEMP_SENSOR_BOARD (TEMP_BOARD_PIN)."
588
+#elif MOTHERBOARD == BOARD_BTT_SKR_E3_TURBO && PIN_EXISTS(TEMP_2) && DISABLED(TEMP_SENSOR_BOARD)
589
+  #warning "Onboard temperature sensor for BOARD_BTT_SKR_E3_TURBO has moved from TEMP_SENSOR_2 (TEMP_2_PIN) to TEMP_SENSOR_BOARD (TEMP_BOARD_PIN)."
586 590
 #endif
587 591
 
588 592
 constexpr float arm[] = AXIS_RELATIVE_MODES;
@@ -1959,6 +1963,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1959 1963
   #error "TEMP_SENSOR_CHAMBER 1000 requires CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS and CHAMBER_BETA in Configuration_adv.h."
1960 1964
 #elif TEMP_SENSOR_PROBE_IS_CUSTOM && !(defined(PROBE_PULLUP_RESISTOR_OHMS) && defined(PROBE_RESISTANCE_25C_OHMS) && defined(PROBE_BETA))
1961 1965
   #error "TEMP_SENSOR_PROBE 1000 requires PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS and PROBE_BETA in Configuration_adv.h."
1966
+#elif TEMP_SENSOR_BOARD_IS_CUSTOM && !(defined(BOARD_PULLUP_RESISTOR_OHMS) && defined(BOARD_RESISTANCE_25C_OHMS) && defined(BOARD_BETA))
1967
+  #error "TEMP_SENSOR_BOARD 1000 requires BOARD_PULLUP_RESISTOR_OHMS, BOARD_RESISTANCE_25C_OHMS and BOARD_BETA in Configuration_adv.h."
1962 1968
 #elif TEMP_SENSOR_REDUNDANT_IS_CUSTOM && !(defined(REDUNDANT_PULLUP_RESISTOR_OHMS) && defined(REDUNDANT_RESISTANCE_25C_OHMS) && defined(REDUNDANT_BETA))
1963 1969
   #error "TEMP_SENSOR_REDUNDANT 1000 requires REDUNDANT_PULLUP_RESISTOR_OHMS, REDUNDANT_RESISTANCE_25C_OHMS and REDUNDANT_BETA in Configuration_adv.h."
1964 1970
 #endif
@@ -1966,14 +1972,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1966 1972
 /**
1967 1973
  * Required MAX31865 settings
1968 1974
  */
1969
-#if TEMP_SENSOR_0_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && TEMP_SENSOR_REDUNDANT_SOURCE == 0)
1975
+#if TEMP_SENSOR_0_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && REDUNDANT_TEMP_MATCH(SOURCE, E0))
1970 1976
   #if !defined(MAX31865_SENSOR_WIRES_0) || !WITHIN(MAX31865_SENSOR_WIRES_0, 2, 4)
1971 1977
     #error "MAX31865_SENSOR_WIRES_0 must be defined as an integer between 2 and 4."
1972 1978
   #elif !defined(MAX31865_SENSOR_OHMS_0) || !defined(MAX31865_CALIBRATION_OHMS_0)
1973 1979
     #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set if TEMP_SENSOR_0/TEMP_SENSOR_REDUNDANT is MAX31865."
1974 1980
   #endif
1975 1981
 #endif
1976
-#if TEMP_SENSOR_1_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && TEMP_SENSOR_REDUNDANT_SOURCE == 1)
1982
+#if TEMP_SENSOR_1_IS_MAX31865 || (TEMP_SENSOR_REDUNDANT_IS_MAX31865 && REDUNDANT_TEMP_MATCH(SOURCE, E1))
1977 1983
   #if !defined(MAX31865_SENSOR_WIRES_1) || !WITHIN(MAX31865_SENSOR_WIRES_1, 2, 4)
1978 1984
     #error "MAX31865_SENSOR_WIRES_1 must be defined as an integer between 2 and 4."
1979 1985
   #elif !defined(MAX31865_SENSOR_OHMS_1) || !defined(MAX31865_CALIBRATION_OHMS_1)
@@ -1989,62 +1995,58 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
1989 1995
     #error "TEMP_SENSOR_REDUNDANT requires TEMP_SENSOR_REDUNDANT_SOURCE."
1990 1996
   #elif !defined(TEMP_SENSOR_REDUNDANT_TARGET)
1991 1997
     #error "TEMP_SENSOR_REDUNDANT requires TEMP_SENSOR_REDUNDANT_TARGET."
1992
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == TEMP_SENSOR_REDUNDANT_TARGET
1998
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, TEMP_SENSOR_REDUNDANT_TARGET)
1993 1999
     #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be the same as TEMP_SENSOR_REDUNDANT_TARGET."
1994
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE < -5 || TEMP_SENSOR_REDUNDANT_SOURCE > 7
1995
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE must be between -5 and 7."
1996
-  #elif TEMP_SENSOR_REDUNDANT_TARGET < -5 || TEMP_SENSOR_REDUNDANT_TARGET > 7
1997
-    #error "TEMP_SENSOR_REDUNDANT_TARGET must be between -5 and 7."
1998
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == -3
1999
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be -3 (not used)."
2000
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == -3
2001
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be -3 (not used)."
2002 2000
   #elif HAS_MULTI_HOTEND && TEMP_SENSOR_REDUNDANT_SOURCE < HOTENDS
2003
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE must be after the last TEMP_SENSOR used with a hotend; you can't use a sensor in the middle of two hotends."
2004
-  #endif
2005
-
2006
-  #if TEMP_SENSOR_REDUNDANT_SOURCE == 0 && HAS_HOTEND
2007
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can not be 0 if a hotend is used. E0 always uses TEMP_SENSOR_0."
2008
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == -5 && HAS_TEMP_COOLER
2009
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be Cooler (-5): TEMP_SENSOR_COOLER has already defined the sensor."
2010
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == -4 && HAS_TEMP_PROBE
2011
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be Probe (-4): TEMP_SENSOR_PROBE has already defined the sensor."
2012
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == -2 && HAS_TEMP_CHAMBER
2013
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be Chamber (-2): TEMP_SENSOR_CHAMBER has already defined the sensor."
2014
-  #elif TEMP_SENSOR_REDUNDANT_SOURCE == -1 && HAS_TEMP_BED
2015
-    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be Bed (-1): TEMP_SENSOR_BED has already defined the sensor."
2016
-  #endif
2017
-
2018
-  #if TEMP_SENSOR_REDUNDANT_TARGET == 0 && !PIN_EXISTS(TEMP_0)
2019
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E0 (0): requires TEMP_0_PIN"
2020
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 1 && !PIN_EXISTS(TEMP_1)
2021
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E1 (1): requires TEMP_1_PIN"
2022
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 2 && !PIN_EXISTS(TEMP_2)
2023
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E2 (2): requires TEMP_2_PIN"
2024
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 3 && !PIN_EXISTS(TEMP_3)
2025
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E3 (3): requires TEMP_3_PIN"
2026
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 4 && !PIN_EXISTS(TEMP_4)
2027
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E4 (4): requires TEMP_4_PIN"
2028
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 5 && !PIN_EXISTS(TEMP_5)
2029
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E5 (5): requires TEMP_5_PIN"
2030
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 6 && !PIN_EXISTS(TEMP_6)
2031
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E6 (6): requires TEMP_6_PIN"
2032
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == 7 && !PIN_EXISTS(TEMP_7)
2033
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E7 (7): requires TEMP_7_PIN"
2034
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == -1 && !PIN_EXISTS(TEMP_BED)
2035
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be Bed (-1): requires TEMP_BED_PIN"
2036
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == -2 && !PIN_EXISTS(TEMP_CHAMBER)
2037
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be Chamber (-2): requires TEMP_CHAMBER_PIN"
2038
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == -4 && !PIN_EXISTS(TEMP_PROBE)
2039
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be Probe (-4): requires TEMP_PROBE_PIN"
2040
-  #elif TEMP_SENSOR_REDUNDANT_TARGET == -5 && !PIN_EXISTS(TEMP_COOLER)
2041
-    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be Cooler (-5): requires TEMP_COOLER_PIN"
2042
-  #endif
2043
-
2044
-  #if TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0 && !PIN_EXISTS(TEMP_0_CS)
2045
-    #error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 0 requires TEMP_0_CS_PIN."
2046
-  #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1 && !PIN_EXISTS(TEMP_1_CS)
2047
-    #error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE 1 requires TEMP_1_CS_PIN."
2001
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE must be after the last used hotend TEMP_SENSOR."
2002
+  #endif
2003
+
2004
+  #if REDUNDANT_TEMP_MATCH(SOURCE, E0) && HAS_HOTEND
2005
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be 0 if a hotend is used. E0 always uses TEMP_SENSOR_0."
2006
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, COOLER) && HAS_TEMP_COOLER
2007
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be COOLER. TEMP_SENSOR_COOLER is in use."
2008
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, PROBE) && HAS_TEMP_PROBE
2009
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be PROBE. TEMP_SENSOR_PROBE is in use."
2010
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, BOARD) && HAS_TEMP_BOARD
2011
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be BOARD. TEMP_SENSOR_BOARD is in use."
2012
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, CHAMBER) && HAS_TEMP_CHAMBER
2013
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be CHAMBER. TEMP_SENSOR_CHAMBER is in use."
2014
+  #elif REDUNDANT_TEMP_MATCH(SOURCE, BED) && HAS_TEMP_BED
2015
+    #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be BED. TEMP_SENSOR_BED is in use."
2016
+  #endif
2017
+
2018
+  #if REDUNDANT_TEMP_MATCH(TARGET, E0) && !PIN_EXISTS(TEMP_0)
2019
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E0 without TEMP_0_PIN defined."
2020
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E1) && !PIN_EXISTS(TEMP_1)
2021
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E1 without TEMP_1_PIN defined."
2022
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E2) && !PIN_EXISTS(TEMP_2)
2023
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E2 without TEMP_2_PIN defined."
2024
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E3) && !PIN_EXISTS(TEMP_3)
2025
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E3 without TEMP_3_PIN defined."
2026
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E4) && !PIN_EXISTS(TEMP_4)
2027
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E4 without TEMP_4_PIN defined."
2028
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E5) && !PIN_EXISTS(TEMP_5)
2029
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E5 without TEMP_5_PIN defined."
2030
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E6) && !PIN_EXISTS(TEMP_6)
2031
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E6 without TEMP_6_PIN defined."
2032
+  #elif REDUNDANT_TEMP_MATCH(TARGET, E7) && !PIN_EXISTS(TEMP_7)
2033
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be E7 without TEMP_7_PIN defined."
2034
+  #elif REDUNDANT_TEMP_MATCH(TARGET, BED) && !PIN_EXISTS(TEMP_BED)
2035
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be BED without TEMP_BED_PIN defined."
2036
+  #elif REDUNDANT_TEMP_MATCH(TARGET, CHAMBER) && !PIN_EXISTS(TEMP_CHAMBER)
2037
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be CHAMBER without TEMP_CHAMBER_PIN defined."
2038
+  #elif REDUNDANT_TEMP_MATCH(TARGET, BOARD) && !PIN_EXISTS(TEMP_BOARD)
2039
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be BOARD without TEMP_BOARD_PIN defined."
2040
+  #elif REDUNDANT_TEMP_MATCH(TARGET, PROBE) && !PIN_EXISTS(TEMP_PROBE)
2041
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be PROBE without TEMP_PROBE_PIN defined."
2042
+  #elif REDUNDANT_TEMP_MATCH(TARGET, COOLER) && !PIN_EXISTS(TEMP_COOLER)
2043
+    #error "TEMP_SENSOR_REDUNDANT_TARGET can't be COOLER without TEMP_COOLER_PIN defined."
2044
+  #endif
2045
+
2046
+  #if TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E0) && !PIN_EXISTS(TEMP_0_CS)
2047
+    #error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE E0 requires TEMP_0_CS_PIN."
2048
+  #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E1) && !PIN_EXISTS(TEMP_1_CS)
2049
+    #error "TEMP_SENSOR_REDUNDANT MAX Thermocouple with TEMP_SENSOR_REDUNDANT_SOURCE E1 requires TEMP_1_CS_PIN."
2048 2050
   #endif
2049 2051
 #endif
2050 2052
 
@@ -2209,6 +2211,28 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
2209 2211
   #endif
2210 2212
 #endif
2211 2213
 
2214
+#if TEMP_SENSOR_PROBE
2215
+  #if !PIN_EXISTS(TEMP_PROBE)
2216
+    #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN."
2217
+  #elif !HAS_TEMP_ADC_PROBE
2218
+    #error "TEMP_PROBE_PIN must be an ADC pin."
2219
+  #elif DISABLED(FIX_MOUNTED_PROBE)
2220
+    #error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE."
2221
+  #endif
2222
+#endif
2223
+
2224
+#if TEMP_SENSOR_BOARD
2225
+  #if !PIN_EXISTS(TEMP_BOARD)
2226
+    #error "TEMP_SENSOR_BOARD requires TEMP_BOARD_PIN."
2227
+  #elif !HAS_TEMP_ADC_BOARD
2228
+    #error "TEMP_BOARD_PIN must be an ADC pin."
2229
+  #elif ENABLED(THERMAL_PROTECTION_BOARD) && (!defined(BOARD_MINTEMP) || !defined(BOARD_MAXTEMP))
2230
+    #error "THERMAL_PROTECTION_BOARD requires BOARD_MINTEMP and BOARD_MAXTEMP."
2231
+  #endif
2232
+#elif CONTROLLER_FAN_MIN_BOARD_TEMP
2233
+  #error "CONTROLLER_FAN_MIN_BOARD_TEMP requires TEMP_SENSOR_BOARD."
2234
+#endif
2235
+
2212 2236
 #if ENABLED(LASER_COOLANT_FLOW_METER) && !(PIN_EXISTS(FLOWMETER) && ENABLED(LASER_FEATURE))
2213 2237
   #error "LASER_COOLANT_FLOW_METER requires FLOWMETER_PIN and LASER_FEATURE."
2214 2238
 #endif

+ 105
- 32
Marlin/src/module/temperature.cpp Visa fil

@@ -58,8 +58,8 @@
58 58
 #endif
59 59
 
60 60
 // MAX TC related macros
61
-#define TEMP_SENSOR_IS_MAX(n, M) (ENABLED(TEMP_SENSOR_##n##_IS_MAX##M) || (ENABLED(TEMP_SENSOR_REDUNDANT_IS_MAX##M) && TEMP_SENSOR_REDUNDANT_SOURCE == (n)))
62
-#define TEMP_SENSOR_IS_ANY_MAX_TC(n) (ENABLED(TEMP_SENSOR_##n##_IS_MAX_TC) || (ENABLED(TEMP_SENSOR_REDUNDANT_IS_MAX_TC) && TEMP_SENSOR_REDUNDANT_SOURCE == n))
61
+#define TEMP_SENSOR_IS_MAX(n, M) (ENABLED(TEMP_SENSOR_##n##_IS_MAX##M) || (ENABLED(TEMP_SENSOR_REDUNDANT_IS_MAX##M) && REDUNDANT_TEMP_MATCH(SOURCE, E##n)))
62
+#define TEMP_SENSOR_IS_ANY_MAX_TC(n) (ENABLED(TEMP_SENSOR_##n##_IS_MAX_TC) || (ENABLED(TEMP_SENSOR_REDUNDANT_IS_MAX_TC) && REDUNDANT_TEMP_MATCH(SOURCE, E##n)))
63 63
 
64 64
 // LIB_MAX6675 can be added to the build_flags in platformio.ini to use a user-defined library
65 65
 // If LIB_MAX6675 is not on the build_flags then raw SPI reads will be used.
@@ -262,7 +262,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY,
262 262
 #endif
263 263
 
264 264
 #if HAS_TEMP_REDUNDANT
265
-  redundant_temp_info_t Temperature::temp_redundant;
265
+  redundant_info_t Temperature::temp_redundant;
266 266
 #endif
267 267
 
268 268
 #if ENABLED(AUTO_POWER_E_FANS)
@@ -436,6 +436,14 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY,
436 436
   probe_info_t Temperature::temp_probe; // = { 0 }
437 437
 #endif
438 438
 
439
+#if HAS_TEMP_BOARD
440
+  board_info_t Temperature::temp_board; // = { 0 }
441
+  #if ENABLED(THERMAL_PROTECTION_BOARD)
442
+    int16_t Temperature::mintemp_raw_BOARD = TEMP_SENSOR_BOARD_RAW_LO_TEMP,
443
+            Temperature::maxtemp_raw_BOARD = TEMP_SENSOR_COOLER_RAW_HI_TEMP;
444
+  #endif
445
+#endif
446
+
439 447
 #if ENABLED(PREVENT_COLD_EXTRUSION)
440 448
   bool Temperature::allow_cold_extrude = false;
441 449
   celsius_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP;
@@ -937,14 +945,26 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms
937 945
     SERIAL_ERROR_START();
938 946
     SERIAL_ECHOPGM_P(serial_msg);
939 947
     SERIAL_ECHOPGM(STR_STOPPED_HEATER);
940
-    if (heater_id >= 0)
941
-      SERIAL_ECHO(heater_id);
942
-    else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER))
943
-      SERIAL_ECHOPGM(STR_HEATER_CHAMBER);
944
-    else if (TERN0(HAS_COOLER, heater_id == H_COOLER))
945
-      SERIAL_ECHOPGM(STR_COOLER);
946
-    else
947
-      SERIAL_ECHOPGM(STR_HEATER_BED);
948
+
949
+    heater_id_t real_heater_id = heater_id;
950
+
951
+    #if HAS_TEMP_REDUNDANT
952
+      if (heater_id == H_REDUNDANT) {
953
+        SERIAL_ECHOPGM(STR_REDUNDANT); // print redundant and cascade to print target, too.
954
+        real_heater_id = (heater_id_t)TEMP_SENSOR_REDUNDANT_TARGET;
955
+      }
956
+    #endif
957
+
958
+    switch (real_heater_id) {
959
+      OPTCODE(HAS_TEMP_COOLER,  case H_COOLER:  SERIAL_ECHOPGM(STR_COOLER);         break)
960
+      OPTCODE(HAS_TEMP_PROBE,   case H_PROBE:   SERIAL_ECHOPGM(STR_PROBE);          break)
961
+      OPTCODE(HAS_TEMP_BOARD,   case H_BOARD:   SERIAL_ECHOPGM(STR_MOTHERBOARD);    break)
962
+      OPTCODE(HAS_TEMP_CHAMBER, case H_CHAMBER: SERIAL_ECHOPGM(STR_HEATER_CHAMBER); break)
963
+      OPTCODE(HAS_TEMP_BED,     case H_BED:     SERIAL_ECHOPGM(STR_HEATER_BED);     break)
964
+      default:
965
+        if (real_heater_id >= 0)
966
+          SERIAL_ECHOLNPAIR("E", real_heater_id);
967
+    }
948 968
     SERIAL_EOL();
949 969
   }
950 970
 
@@ -1663,6 +1683,9 @@ void Temperature::manage_heater() {
1663 1683
       #if TEMP_SENSOR_PROBE_IS_CUSTOM
1664 1684
         { true, 0, 0, PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS, 0, 0, PROBE_BETA, 0 },
1665 1685
       #endif
1686
+      #if TEMP_SENSOR_BOARD_IS_CUSTOM
1687
+        { true, 0, 0, BOARD_PULLUP_RESISTOR_OHMS, BOARD_RESISTANCE_25C_OHMS, 0, 0, BOARD_BETA, 0 },
1688
+      #endif
1666 1689
       #if TEMP_SENSOR_REDUNDANT_IS_CUSTOM
1667 1690
         { true, 0, 0, REDUNDANT_PULLUP_RESISTOR_OHMS, REDUNDANT_RESISTANCE_25C_OHMS, 0, 0, REDUNDANT_BETA, 0 },
1668 1691
       #endif
@@ -1698,6 +1721,7 @@ void Temperature::manage_heater() {
1698 1721
       TERN_(TEMP_SENSOR_CHAMBER_IS_CUSTOM, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :)
1699 1722
       TERN_(TEMP_SENSOR_COOLER_IS_CUSTOM, t_index == CTI_COOLER ? PSTR("COOLER") :)
1700 1723
       TERN_(TEMP_SENSOR_PROBE_IS_CUSTOM, t_index == CTI_PROBE ? PSTR("PROBE") :)
1724
+      TERN_(TEMP_SENSOR_BOARD_IS_CUSTOM, t_index == CTI_BOARD ? PSTR("BOARD") :)
1701 1725
       TERN_(TEMP_SENSOR_REDUNDANT_IS_CUSTOM, t_index == CTI_REDUNDANT ? PSTR("REDUNDANT") :)
1702 1726
       nullptr
1703 1727
     );
@@ -1933,14 +1957,32 @@ void Temperature::manage_heater() {
1933 1957
   }
1934 1958
 #endif // HAS_TEMP_PROBE
1935 1959
 
1960
+#if HAS_TEMP_BOARD
1961
+  // For motherboard temperature measurement.
1962
+  celsius_float_t Temperature::analog_to_celsius_board(const int16_t raw) {
1963
+    #if TEMP_SENSOR_BOARD_IS_CUSTOM
1964
+      return user_thermistor_to_deg_c(CTI_BOARD, raw);
1965
+    #elif TEMP_SENSOR_BOARD_IS_THERMISTOR
1966
+      SCAN_THERMISTOR_TABLE(TEMPTABLE_BOARD, TEMPTABLE_BOARD_LEN);
1967
+    #elif TEMP_SENSOR_BOARD_IS_AD595
1968
+      return TEMP_AD595(raw);
1969
+    #elif TEMP_SENSOR_BOARD_IS_AD8495
1970
+      return TEMP_AD8495(raw);
1971
+    #else
1972
+      UNUSED(raw);
1973
+      return 0;
1974
+    #endif
1975
+  }
1976
+#endif // HAS_TEMP_BOARD
1977
+
1936 1978
 #if HAS_TEMP_REDUNDANT
1937 1979
   // For redundant temperature measurement.
1938 1980
   celsius_float_t Temperature::analog_to_celsius_redundant(const int16_t raw) {
1939 1981
     #if TEMP_SENSOR_REDUNDANT_IS_CUSTOM
1940 1982
       return user_thermistor_to_deg_c(CTI_REDUNDANT, raw);
1941
-    #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 0
1983
+    #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E0)
1942 1984
       return TERN(TEMP_SENSOR_REDUNDANT_IS_MAX31865, max31865_0.temperature((uint16_t)raw), raw * 0.25);
1943
-    #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && TEMP_SENSOR_REDUNDANT_SOURCE == 1
1985
+    #elif TEMP_SENSOR_REDUNDANT_IS_MAX_TC && REDUNDANT_TEMP_MATCH(SOURCE, E1)
1944 1986
       return TERN(TEMP_SENSOR_REDUNDANT_IS_MAX31865, max31865_1.temperature((uint16_t)raw), raw * 0.25);
1945 1987
     #elif TEMP_SENSOR_REDUNDANT_IS_THERMISTOR
1946 1988
       SCAN_THERMISTOR_TABLE(TEMPTABLE_REDUNDANT, TEMPTABLE_REDUNDANT_LEN);
@@ -1983,6 +2025,7 @@ void Temperature::updateTemperaturesFromRawValues() {
1983 2025
   TERN_(HAS_TEMP_CHAMBER,   temp_chamber.celsius   = analog_to_celsius_chamber(temp_chamber.raw));
1984 2026
   TERN_(HAS_TEMP_COOLER,    temp_cooler.celsius    = analog_to_celsius_cooler(temp_cooler.raw));
1985 2027
   TERN_(HAS_TEMP_PROBE,     temp_probe.celsius     = analog_to_celsius_probe(temp_probe.raw));
2028
+  TERN_(HAS_TEMP_BOARD,     temp_board.celsius     = analog_to_celsius_board(temp_board.raw));
1986 2029
   TERN_(HAS_TEMP_REDUNDANT, temp_redundant.celsius = analog_to_celsius_redundant(temp_redundant.raw));
1987 2030
 
1988 2031
   TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm());
@@ -2030,23 +2073,28 @@ void Temperature::updateTemperaturesFromRawValues() {
2030 2073
 
2031 2074
   #endif // HAS_HOTEND
2032 2075
 
2076
+  #define TP_CMP(S,A,B) (TEMPDIR(S) < 0 ? ((A)<(B)) : ((A)>(B)))
2033 2077
   #if ENABLED(THERMAL_PROTECTION_BED)
2034
-    #define BEDCMP(A,B) (TEMPDIR(BED) < 0 ? ((A)<(B)) : ((A)>(B)))
2035
-    if (BEDCMP(temp_bed.raw, maxtemp_raw_BED)) max_temp_error(H_BED);
2036
-    if (temp_bed.target > 0 && BEDCMP(mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED);
2078
+    if (TP_CMP(BED, temp_bed.raw, maxtemp_raw_BED)) max_temp_error(H_BED);
2079
+    if (temp_bed.target > 0 && TP_CMP(BED, mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED);
2037 2080
   #endif
2038 2081
 
2039 2082
   #if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER)
2040
-    #define CHAMBERCMP(A,B) (TEMPDIR(CHAMBER) < 0 ? ((A)<(B)) : ((A)>(B)))
2041
-    if (CHAMBERCMP(temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER);
2042
-    if (temp_chamber.target > 0 && CHAMBERCMP(mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER);
2083
+    if (TP_CMP(CHAMBER, temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER);
2084
+    if (temp_chamber.target > 0 && TP_CMP(CHAMBER, mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER);
2043 2085
   #endif
2044 2086
 
2045 2087
   #if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER)
2046
-    #define COOLERCMP(A,B) (TEMPDIR(COOLER) < 0 ? ((A)<(B)) : ((A)>(B)))
2047
-    if (cutter.unitPower > 0 && COOLERCMP(temp_cooler.raw, maxtemp_raw_COOLER)) max_temp_error(H_COOLER);
2048
-    if (COOLERCMP(mintemp_raw_COOLER, temp_cooler.raw)) min_temp_error(H_COOLER);
2088
+    if (cutter.unitPower > 0 && TP_CMP(COOLER, temp_cooler.raw, maxtemp_raw_COOLER)) max_temp_error(H_COOLER);
2089
+    if (TP_CMP(COOLER, mintemp_raw_COOLER, temp_cooler.raw)) min_temp_error(H_COOLER);
2090
+  #endif
2091
+
2092
+  #if BOTH(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD)
2093
+    if (TP_CMP(BOARD, temp_board.raw, maxtemp_raw_BOARD)) max_temp_error(H_BOARD);
2094
+    if (TP_CMP(BOARD, mintemp_raw_BOARD, temp_board.raw)) min_temp_error(H_BOARD);
2049 2095
   #endif
2096
+  #undef TP_CMP
2097
+
2050 2098
 } // Temperature::updateTemperaturesFromRawValues
2051 2099
 
2052 2100
 /**
@@ -2275,6 +2323,9 @@ void Temperature::init() {
2275 2323
   #if HAS_TEMP_ADC_PROBE
2276 2324
     HAL_ANALOG_SELECT(TEMP_PROBE_PIN);
2277 2325
   #endif
2326
+  #if HAS_TEMP_ADC_BOARD
2327
+    HAL_ANALOG_SELECT(TEMP_BOARD_PIN);
2328
+  #endif
2278 2329
   #if HAS_TEMP_ADC_REDUNDANT
2279 2330
     HAL_ANALOG_SELECT(TEMP_REDUNDANT_PIN);
2280 2331
   #endif
@@ -2388,6 +2439,7 @@ void Temperature::init() {
2388 2439
     #endif
2389 2440
   #endif // HAS_HOTEND
2390 2441
 
2442
+  // TODO: combine these into the macros above
2391 2443
   #if HAS_HEATED_BED
2392 2444
     while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR);
2393 2445
     while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR);
@@ -2403,15 +2455,22 @@ void Temperature::init() {
2403 2455
     while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR);
2404 2456
   #endif
2405 2457
 
2458
+  #if HAS_TEMP_BOARD
2459
+    while (analog_to_celsius_board(mintemp_raw_BOARD) > BOARD_MINTEMP) mintemp_raw_BOARD += TEMPDIR(BOARD) * (OVERSAMPLENR);
2460
+    while (analog_to_celsius_board(maxtemp_raw_BOARD) < BOARD_MAXTEMP) maxtemp_raw_BOARD -= TEMPDIR(BOARD) * (OVERSAMPLENR);
2461
+  #endif
2462
+
2406 2463
   #if HAS_TEMP_REDUNDANT
2407 2464
     temp_redundant.target = &(
2408
-      #if TEMP_SENSOR_REDUNDANT_TARGET == -5 && HAS_TEMP_COOLER
2465
+      #if REDUNDANT_TEMP_MATCH(TARGET, COOLER) && HAS_TEMP_COOLER
2409 2466
         temp_cooler
2410
-      #elif TEMP_SENSOR_REDUNDANT_TARGET == -4 && HAS_TEMP_PROBE
2467
+      #elif REDUNDANT_TEMP_MATCH(TARGET, PROBE) && HAS_TEMP_PROBE
2411 2468
         temp_probe
2412
-      #elif TEMP_SENSOR_REDUNDANT_TARGET == -2 && HAS_TEMP_CHAMBER
2469
+      #elif REDUNDANT_TEMP_MATCH(TARGET, BOARD) && HAS_TEMP_BOARD
2470
+        temp_board
2471
+      #elif REDUNDANT_TEMP_MATCH(TARGET, CHAMBER) && HAS_TEMP_CHAMBER
2413 2472
         temp_chamber
2414
-      #elif TEMP_SENSOR_REDUNDANT_TARGET == -1 && HAS_TEMP_BED
2473
+      #elif REDUNDANT_TEMP_MATCH(TARGET, BED) && HAS_TEMP_BED
2415 2474
         temp_bed
2416 2475
       #else
2417 2476
         temp_hotend[TEMP_SENSOR_REDUNDANT_TARGET]
@@ -2787,6 +2846,7 @@ void Temperature::disable_all_heaters() {
2787 2846
  */
2788 2847
 void Temperature::update_raw_temperatures() {
2789 2848
 
2849
+  // TODO: can this be collapsed into a HOTEND_LOOP()?
2790 2850
   #if HAS_TEMP_ADC_0 && !TEMP_SENSOR_0_IS_MAX_TC
2791 2851
     temp_hotend[0].update();
2792 2852
   #endif
@@ -2808,6 +2868,7 @@ void Temperature::update_raw_temperatures() {
2808 2868
   TERN_(HAS_TEMP_ADC_BED,     temp_bed.update());
2809 2869
   TERN_(HAS_TEMP_ADC_CHAMBER, temp_chamber.update());
2810 2870
   TERN_(HAS_TEMP_ADC_PROBE,   temp_probe.update());
2871
+  TERN_(HAS_TEMP_ADC_BOARD,   temp_board.update());
2811 2872
   TERN_(HAS_TEMP_ADC_COOLER,  temp_cooler.update());
2812 2873
 
2813 2874
   TERN_(HAS_JOY_ADC_X, joystick.x.update());
@@ -2834,10 +2895,11 @@ void Temperature::readings_ready() {
2834 2895
     HOTEND_LOOP() temp_hotend[e].reset();
2835 2896
   #endif
2836 2897
 
2837
-  TERN_(HAS_HEATED_BED, temp_bed.reset());
2838
-  TERN_(HAS_TEMP_CHAMBER, temp_chamber.reset());
2839
-  TERN_(HAS_TEMP_PROBE, temp_probe.reset());
2840
-  TERN_(HAS_TEMP_COOLER, temp_cooler.reset());
2898
+  TERN_(HAS_HEATED_BED,     temp_bed.reset());
2899
+  TERN_(HAS_TEMP_CHAMBER,   temp_chamber.reset());
2900
+  TERN_(HAS_TEMP_PROBE,     temp_probe.reset());
2901
+  TERN_(HAS_TEMP_COOLER,    temp_cooler.reset());
2902
+  TERN_(HAS_TEMP_BOARD,     temp_board.reset());
2841 2903
   TERN_(HAS_TEMP_REDUNDANT, temp_redundant.reset());
2842 2904
 
2843 2905
   TERN_(HAS_JOY_ADC_X, joystick.x.reset());
@@ -3264,6 +3326,11 @@ void Temperature::isr() {
3264 3326
       case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break;
3265 3327
     #endif
3266 3328
 
3329
+    #if HAS_TEMP_ADC_BOARD
3330
+      case PrepareTemp_BOARD: HAL_START_ADC(TEMP_BOARD_PIN); break;
3331
+      case MeasureTemp_BOARD: ACCUMULATE_ADC(temp_board); break;
3332
+    #endif
3333
+
3267 3334
     #if HAS_TEMP_ADC_REDUNDANT
3268 3335
       case PrepareTemp_REDUNDANT: HAL_START_ADC(TEMP_REDUNDANT_PIN); break;
3269 3336
       case MeasureTemp_REDUNDANT: ACCUMULATE_ADC(temp_redundant); break;
@@ -3430,6 +3497,9 @@ void Temperature::isr() {
3430 3497
       #if HAS_TEMP_COOLER
3431 3498
         case H_COOLER: k = 'L'; break;
3432 3499
       #endif
3500
+      #if HAS_TEMP_BOARD
3501
+        case H_BOARD: k = 'M'; break;
3502
+      #endif
3433 3503
       #if HAS_TEMP_REDUNDANT
3434 3504
         case H_REDUNDANT: k = 'R'; break;
3435 3505
       #endif
@@ -3459,7 +3529,7 @@ void Temperature::isr() {
3459 3529
     OPTARG(HAS_TEMP_REDUNDANT, const bool include_r/*=false*/)
3460 3530
   ) {
3461 3531
     #if HAS_TEMP_HOTEND
3462
-      print_heater_state(H_NONE, degHotend(target_extruder), degTargetHotend(target_extruder) OPTARG(SHOW_TEMP_ADC_VALUES, rawHotendTemp(target_extruder)));
3532
+      print_heater_state(H_E0, degHotend(target_extruder), degTargetHotend(target_extruder) OPTARG(SHOW_TEMP_ADC_VALUES, rawHotendTemp(target_extruder)));
3463 3533
     #endif
3464 3534
     #if HAS_HEATED_BED
3465 3535
       print_heater_state(H_BED, degBed(), degTargetBed() OPTARG(SHOW_TEMP_ADC_VALUES, rawBedTemp()));
@@ -3471,7 +3541,10 @@ void Temperature::isr() {
3471 3541
       print_heater_state(H_COOLER, degCooler(), TERN0(HAS_COOLER, degTargetCooler()) OPTARG(SHOW_TEMP_ADC_VALUES, rawCoolerTemp()));
3472 3542
     #endif
3473 3543
     #if HAS_TEMP_PROBE
3474
-      print_heater_state(H_PROBE, degProbe(), 0 OPTARG(SHOW_TEMP_ADC_VALUES, rawProbeTemp()) );
3544
+      print_heater_state(H_PROBE, degProbe(), 0 OPTARG(SHOW_TEMP_ADC_VALUES, rawProbeTemp()));
3545
+    #endif
3546
+    #if HAS_TEMP_BOARD
3547
+      print_heater_state(H_BOARD, degBoard(), 0 OPTARG(SHOW_TEMP_ADC_VALUES, rawBoardTemp()));
3475 3548
     #endif
3476 3549
     #if HAS_TEMP_REDUNDANT
3477 3550
       if (include_r) print_heater_state(H_REDUNDANT, degRedundant(), degRedundantTarget() OPTARG(SHOW_TEMP_ADC_VALUES, rawRedundantTemp()));

+ 36
- 5
Marlin/src/module/temperature.h Visa fil

@@ -46,9 +46,13 @@
46 46
 
47 47
 // Element identifiers. Positive values are hotends. Negative values are other heaters or coolers.
48 48
 typedef enum : int8_t {
49
-  H_NONE = -6,
50
-  H_COOLER, H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED,
51
-  H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7
49
+  H_REDUNDANT = HID_REDUNDANT,
50
+  H_COOLER = HID_COOLER,
51
+  H_PROBE = HID_PROBE,
52
+  H_BOARD = HID_BOARD,
53
+  H_CHAMBER = HID_CHAMBER,
54
+  H_BED = HID_BED,
55
+  H_E0 = HID_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7
52 56
 } heater_id_t;
53 57
 
54 58
 // PID storage
@@ -105,6 +109,9 @@ enum ADCSensorState : char {
105 109
   #if HAS_TEMP_ADC_PROBE
106 110
     PrepareTemp_PROBE, MeasureTemp_PROBE,
107 111
   #endif
112
+  #if HAS_TEMP_ADC_BOARD
113
+    PrepareTemp_BOARD, MeasureTemp_BOARD,
114
+  #endif
108 115
   #if HAS_TEMP_ADC_REDUNDANT
109 116
     PrepareTemp_REDUNDANT, MeasureTemp_REDUNDANT,
110 117
   #endif
@@ -192,7 +199,7 @@ typedef struct TempInfo {
192 199
   // A redundant temperature sensor
193 200
   typedef struct RedundantTempInfo : public TempInfo {
194 201
     temp_info_t* target;
195
-  } redundant_temp_info_t;
202
+  } redundant_info_t;
196 203
 #endif
197 204
 
198 205
 // A PWM heater with temperature sensor
@@ -231,6 +238,9 @@ struct PIDHeaterInfo : public HeaterInfo {
231 238
 #elif HAS_TEMP_CHAMBER
232 239
   typedef temp_info_t chamber_info_t;
233 240
 #endif
241
+#if HAS_TEMP_BOARD
242
+  typedef temp_info_t board_info_t;
243
+#endif
234 244
 #if EITHER(HAS_COOLER, HAS_TEMP_COOLER)
235 245
   typedef heater_info_t cooler_info_t;
236 246
 #endif
@@ -312,6 +322,9 @@ typedef struct { int16_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ra
312 322
     #if TEMP_SENSOR_COOLER_IS_CUSTOM
313 323
       CTI_COOLER,
314 324
     #endif
325
+    #if TEMP_SENSOR_BOARD_IS_CUSTOM
326
+      CTI_BOARD,
327
+    #endif
315 328
     #if TEMP_SENSOR_REDUNDANT_IS_CUSTOM
316 329
       CTI_REDUNDANT,
317 330
     #endif
@@ -352,8 +365,11 @@ class Temperature {
352 365
     #if HAS_TEMP_COOLER
353 366
       static cooler_info_t temp_cooler;
354 367
     #endif
368
+    #if HAS_TEMP_BOARD
369
+      static board_info_t temp_board;
370
+    #endif
355 371
     #if HAS_TEMP_REDUNDANT
356
-      static redundant_temp_info_t temp_redundant;
372
+      static redundant_info_t temp_redundant;
357 373
     #endif
358 374
 
359 375
     #if ENABLED(AUTO_POWER_E_FANS)
@@ -478,6 +494,10 @@ class Temperature {
478 494
       static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER;
479 495
     #endif
480 496
 
497
+    #if HAS_TEMP_BOARD && ENABLED(THERMAL_PROTECTION_BOARD)
498
+      static int16_t mintemp_raw_BOARD, maxtemp_raw_BOARD;
499
+    #endif
500
+
481 501
     #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1
482 502
       static uint8_t consecutive_low_temperature_error[HOTENDS];
483 503
     #endif
@@ -551,6 +571,9 @@ class Temperature {
551 571
     #if HAS_TEMP_COOLER
552 572
       static celsius_float_t analog_to_celsius_cooler(const int16_t raw);
553 573
     #endif
574
+    #if HAS_TEMP_BOARD
575
+      static celsius_float_t analog_to_celsius_board(const int16_t raw);
576
+    #endif
554 577
     #if HAS_TEMP_REDUNDANT
555 578
       static celsius_float_t analog_to_celsius_redundant(const int16_t raw);
556 579
     #endif
@@ -787,6 +810,14 @@ class Temperature {
787 810
       #endif
788 811
     #endif
789 812
 
813
+    #if HAS_TEMP_BOARD
814
+      #if ENABLED(SHOW_TEMP_ADC_VALUES)
815
+        static inline int16_t rawBoardTemp()    { return temp_board.raw; }
816
+      #endif
817
+      static inline celsius_float_t degBoard()  { return temp_board.celsius; }
818
+      static inline celsius_t wholeDegBoard()   { return static_cast<celsius_t>(degBoard() + 0.5f); }
819
+    #endif
820
+
790 821
     #if HAS_TEMP_REDUNDANT
791 822
       #if ENABLED(SHOW_TEMP_ADC_VALUES)
792 823
         static inline int16_t rawRedundantTemp()         { return temp_redundant.raw; }

+ 18
- 0
Marlin/src/module/thermistor/thermistors.h Visa fil

@@ -51,6 +51,7 @@
51 51
                             || TEMP_SENSOR_IS(n, CHAMBER) \
52 52
                             || TEMP_SENSOR_IS(n, COOLER) \
53 53
                             || TEMP_SENSOR_IS(n, PROBE) \
54
+                            || TEMP_SENSOR_IS(n, BOARD) \
54 55
                             || TEMP_SENSOR_IS(n, REDUNDANT) )
55 56
 
56 57
 typedef struct { int16_t value; celsius_t celsius; } temp_entry_t;
@@ -305,6 +306,13 @@ typedef struct { int16_t value; celsius_t celsius; } temp_entry_t;
305 306
   #define TEMPTABLE_PROBE_LEN 0
306 307
 #endif
307 308
 
309
+#if TEMP_SENSOR_BOARD > 0
310
+  #define TEMPTABLE_BOARD TT_NAME(TEMP_SENSOR_BOARD)
311
+  #define TEMPTABLE_BOARD_LEN COUNT(TEMPTABLE_BOARD)
312
+#else
313
+  #define TEMPTABLE_BOARD_LEN 0
314
+#endif
315
+
308 316
 #if TEMP_SENSOR_REDUNDANT > 0
309 317
   #define TEMPTABLE_REDUNDANT TT_NAME(TEMP_SENSOR_REDUNDANT)
310 318
   #define TEMPTABLE_REDUNDANT_LEN COUNT(TEMPTABLE_REDUNDANT)
@@ -319,6 +327,7 @@ static_assert(255 > TEMPTABLE_0_LEN || 255 > TEMPTABLE_1_LEN || 255 > TEMPTABLE_
319 327
            || 255 > TEMPTABLE_CHAMBER_LEN
320 328
            || 255 > TEMPTABLE_COOLER_LEN
321 329
            || 255 > TEMPTABLE_PROBE_LEN
330
+           || 255 > TEMPTABLE_BOARD_LEN
322 331
            || 255 > TEMPTABLE_REDUNDANT_LEN
323 332
   , "Temperature conversion tables over 255 entries need special consideration."
324 333
 );
@@ -513,6 +522,15 @@ static_assert(255 > TEMPTABLE_0_LEN || 255 > TEMPTABLE_1_LEN || 255 > TEMPTABLE_
513 522
     #define TEMP_SENSOR_PROBE_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE
514 523
   #endif
515 524
 #endif
525
+#ifndef TEMP_SENSOR_BOARD_RAW_HI_TEMP
526
+  #if TT_REVRAW(BOARD)
527
+    #define TEMP_SENSOR_BOARD_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE
528
+    #define TEMP_SENSOR_BOARD_RAW_LO_TEMP 0
529
+  #else
530
+    #define TEMP_SENSOR_BOARD_RAW_HI_TEMP 0
531
+    #define TEMP_SENSOR_BOARD_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE
532
+  #endif
533
+#endif
516 534
 #ifndef TEMP_SENSOR_REDUNDANT_RAW_HI_TEMP
517 535
   #if TT_REVRAW(REDUNDANT)
518 536
     #define TEMP_SENSOR_REDUNDANT_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE

+ 1
- 1
Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h Visa fil

@@ -65,7 +65,7 @@
65 65
   #define TEMP_BED_PIN                  P0_23_A0  // A0 (T0) - (67) - TEMP_BED_PIN
66 66
 #endif
67 67
 
68
-#if HOTENDS == 1 && TEMP_SENSOR_REDUNDANT_SOURCE != 1
68
+#if HOTENDS == 1 && !REDUNDANT_TEMP_MATCH(SOURCE, E1)
69 69
   #if TEMP_SENSOR_PROBE
70 70
     #define TEMP_PROBE_PIN            TEMP_1_PIN
71 71
   #elif TEMP_SENSOR_CHAMBER

+ 1
- 1
Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h Visa fil

@@ -165,8 +165,8 @@
165 165
 //
166 166
 #define TEMP_0_PIN                         P0_24
167 167
 #define TEMP_1_PIN                         P0_23
168
-//#define TEMP_2_PIN                       P1_30  // Onboard thermistor
169 168
 #define TEMP_BED_PIN                       P0_25
169
+#define TEMP_BOARD_PIN                     P1_30  // Onboard thermistor, NTC100K
170 170
 
171 171
 //
172 172
 // Heaters / Fans

+ 5
- 4
Marlin/src/pins/rambo/pins_EINSY_RAMBO.h Visa fil

@@ -114,10 +114,11 @@
114 114
 //
115 115
 // Temperature Sensors
116 116
 //
117
-#define TEMP_0_PIN                             0  // Analog Input
118
-#define TEMP_1_PIN                             1  // Analog Input
119
-#define TEMP_BED_PIN                           2  // Analog Input
120
-#define TEMP_PROBE_PIN                         3  // Analog Input
117
+#define TEMP_0_PIN                             0  // Analog Input, Header J2
118
+#define TEMP_1_PIN                             1  // Analog Input, Header J3
119
+#define TEMP_BOARD_PIN                TEMP_1_PIN  // Analog Input, Header J3
120
+#define TEMP_BED_PIN                           2  // Analog Input, Header J6
121
+#define TEMP_PROBE_PIN                         3  // Analog Input, Header J15
121 122
 
122 123
 //
123 124
 // Heaters / Fans

+ 1
- 1
Marlin/src/pins/sam/pins_DUE3DOM_MINI.h Visa fil

@@ -68,8 +68,8 @@
68 68
 //
69 69
 #define TEMP_0_PIN                             0  // Analog Input (HOTEND0 thermistor)
70 70
 #define TEMP_1_PIN                             2  // Analog Input (unused)
71
-#define TEMP_2_PIN                             5  // Analog Input (OnBoard thermistor beta 3950)
72 71
 #define TEMP_BED_PIN                           1  // Analog Input (BED thermistor)
72
+#define TEMP_BOARD_PIN                         5  // Analog Input (OnBoard thermistor beta 3950)
73 73
 
74 74
 // SPI for MAX Thermocouple
75 75
 #if DISABLED(SDSUPPORT)

+ 1
- 0
Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h Visa fil

@@ -161,6 +161,7 @@
161 161
 //
162 162
 #define TEMP_0_PIN                          PA2   // T0 <-> E0
163 163
 #define TEMP_1_PIN                          PA0   // T1 <-> E1
164
+#define TEMP_BOARD_PIN               TEMP_1_PIN   // Onboard sensor shared with T1
164 165
 #define TEMP_BED_PIN                        PA1   // T2 <-> Bed
165 166
 #define TEMP_PROBE_PIN                      PC3   // Shares J4 connector with PD1
166 167
 

Laddar…
Avbryt
Spara