|
@@ -83,10 +83,12 @@ Temperature thermalManager;
|
83
|
83
|
// public:
|
84
|
84
|
|
85
|
85
|
float Temperature::current_temperature[HOTENDS] = { 0.0 },
|
|
86
|
+ Temperature::current_temperature_chamber = 0.0,
|
86
|
87
|
Temperature::current_temperature_bed = 0.0;
|
87
|
88
|
|
88
|
89
|
int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
|
89
|
90
|
Temperature::target_temperature[HOTENDS] = { 0 },
|
|
91
|
+ Temperature::current_temperature_chamber_raw = 0,
|
90
|
92
|
Temperature::current_temperature_bed_raw = 0;
|
91
|
93
|
|
92
|
94
|
#if ENABLED(AUTO_POWER_E_FANS)
|
|
@@ -179,6 +181,7 @@ volatile bool Temperature::temp_meas_ready = false;
|
179
|
181
|
#endif
|
180
|
182
|
|
181
|
183
|
uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 },
|
|
184
|
+ Temperature::raw_temp_chamber_value = 0,
|
182
|
185
|
Temperature::raw_temp_bed_value = 0;
|
183
|
186
|
|
184
|
187
|
// Init min and max temp with extreme values to prevent false errors during startup
|
|
@@ -550,19 +553,22 @@ int Temperature::getHeaterPower(int heater) {
|
550
|
553
|
#if HAS_AUTO_FAN
|
551
|
554
|
|
552
|
555
|
void Temperature::checkExtruderAutoFans() {
|
553
|
|
- static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN };
|
|
556
|
+ static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
|
554
|
557
|
static const uint8_t fanBit[] PROGMEM = {
|
555
|
558
|
0,
|
556
|
559
|
AUTO_1_IS_0 ? 0 : 1,
|
557
|
560
|
AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2,
|
558
|
561
|
AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3,
|
559
|
|
- AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4
|
|
562
|
+ AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4,
|
|
563
|
+ AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : 5
|
560
|
564
|
};
|
561
|
565
|
uint8_t fanState = 0;
|
562
|
566
|
|
563
|
567
|
HOTEND_LOOP()
|
564
|
568
|
if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
565
|
569
|
SBI(fanState, pgm_read_byte(&fanBit[e]));
|
|
570
|
+ if (current_temperature_chamber > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
571
|
+ SBI(fanState, pgm_read_byte(&fanBit[5]));
|
566
|
572
|
|
567
|
573
|
uint8_t fanDone = 0;
|
568
|
574
|
for (uint8_t f = 0; f < COUNT(fanPin); f++) {
|
|
@@ -998,6 +1004,42 @@ float Temperature::analog2temp(const int raw, const uint8_t e) {
|
998
|
1004
|
}
|
999
|
1005
|
#endif // HAS_TEMP_BED
|
1000
|
1006
|
|
|
1007
|
+#if HAS_TEMP_CHAMBER
|
|
1008
|
+ // Derived from RepRap FiveD extruder::getTemperature()
|
|
1009
|
+ // For chamber temperature measurement.
|
|
1010
|
+ float Temperature::analog2tempChamber(const int raw) {
|
|
1011
|
+ #if ENABLED(CHAMBER_USES_THERMISTOR)
|
|
1012
|
+ float celsius = 0;
|
|
1013
|
+ byte i;
|
|
1014
|
+
|
|
1015
|
+ for (i = 1; i < CHAMBERTEMPTABLE_LEN; i++) {
|
|
1016
|
+ if (PGM_RD_W(CHAMBERTEMPTABLE[i][0]) > raw) {
|
|
1017
|
+ celsius = PGM_RD_W(CHAMBERTEMPTABLE[i - 1][1]) +
|
|
1018
|
+ (raw - PGM_RD_W(CHAMBERTEMPTABLE[i - 1][0])) *
|
|
1019
|
+ (float)(PGM_RD_W(CHAMBERTEMPTABLE[i][1]) - PGM_RD_W(CHAMBERTEMPTABLE[i - 1][1])) /
|
|
1020
|
+ (float)(PGM_RD_W(CHAMBERTEMPTABLE[i][0]) - PGM_RD_W(CHAMBERTEMPTABLE[i - 1][0]));
|
|
1021
|
+ break;
|
|
1022
|
+ }
|
|
1023
|
+ }
|
|
1024
|
+
|
|
1025
|
+ // Overflow: Set to last value in the table
|
|
1026
|
+ if (i == CHAMBERTEMPTABLE_LEN) celsius = PGM_RD_W(CHAMBERTEMPTABLE[i - 1][1]);
|
|
1027
|
+
|
|
1028
|
+ return celsius;
|
|
1029
|
+
|
|
1030
|
+ #elif defined(CHAMBER_USES_AD595)
|
|
1031
|
+
|
|
1032
|
+ return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN)) + TEMP_SENSOR_AD595_OFFSET;
|
|
1033
|
+
|
|
1034
|
+ #else
|
|
1035
|
+
|
|
1036
|
+ UNUSED(raw);
|
|
1037
|
+ return 0;
|
|
1038
|
+
|
|
1039
|
+ #endif
|
|
1040
|
+ }
|
|
1041
|
+#endif // HAS_TEMP_CHAMBER
|
|
1042
|
+
|
1001
|
1043
|
/**
|
1002
|
1044
|
* Get the raw values into the actual temperatures.
|
1003
|
1045
|
* The raw values are created in interrupt context,
|
|
@@ -1013,6 +1055,9 @@ void Temperature::updateTemperaturesFromRawValues() {
|
1013
|
1055
|
#if HAS_TEMP_BED
|
1014
|
1056
|
current_temperature_bed = Temperature::analog2tempBed(current_temperature_bed_raw);
|
1015
|
1057
|
#endif
|
|
1058
|
+ #if HAS_TEMP_CHAMBER
|
|
1059
|
+ current_temperature_chamber = Temperature::analog2tempChamber(current_temperature_chamber_raw);
|
|
1060
|
+ #endif
|
1016
|
1061
|
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
|
1017
|
1062
|
redundant_temperature = Temperature::analog2temp(redundant_temperature_raw, 1);
|
1018
|
1063
|
#endif
|
|
@@ -1076,7 +1121,7 @@ void Temperature::init() {
|
1076
|
1121
|
inited = true;
|
1077
|
1122
|
#endif
|
1078
|
1123
|
|
1079
|
|
- #if MB(RUMBA) && (TEMP_SENSOR_0 == -1 || TEMP_SENSOR_1 == -1 || TEMP_SENSOR_2 == -1 || TEMP_SENSOR_BED == -1)
|
|
1124
|
+ #if MB(RUMBA) && (TEMP_SENSOR_0 == -1 || TEMP_SENSOR_1 == -1 || TEMP_SENSOR_2 == -1 || TEMP_SENSOR_BED == -1 || TEMP_SENSOR_CHAMBER == -1)
|
1080
|
1125
|
// Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector
|
1081
|
1126
|
MCUCR = _BV(JTD);
|
1082
|
1127
|
MCUCR = _BV(JTD);
|
|
@@ -1162,6 +1207,9 @@ void Temperature::init() {
|
1162
|
1207
|
#if HAS_TEMP_BED
|
1163
|
1208
|
HAL_ANALOG_SELECT(TEMP_BED_PIN);
|
1164
|
1209
|
#endif
|
|
1210
|
+ #if HAS_TEMP_CHAMBER
|
|
1211
|
+ HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN);
|
|
1212
|
+ #endif
|
1165
|
1213
|
#if ENABLED(FILAMENT_WIDTH_SENSOR)
|
1166
|
1214
|
HAL_ANALOG_SELECT(FILWIDTH_PIN);
|
1167
|
1215
|
#endif
|
|
@@ -1227,6 +1275,16 @@ void Temperature::init() {
|
1227
|
1275
|
SET_OUTPUT(E4_AUTO_FAN_PIN);
|
1228
|
1276
|
#endif
|
1229
|
1277
|
#endif
|
|
1278
|
+ #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_0 && !AUTO_CHAMBER_IS_1 && !AUTO_CHAMBER_IS_2 && !AUTO_CHAMBER_IS_3 && ! AUTO_CHAMBER_IS_4
|
|
1279
|
+ #if CHAMBER_AUTO_FAN_PIN == FAN1_PIN
|
|
1280
|
+ SET_OUTPUT(CHAMBER_AUTO_FAN_PIN);
|
|
1281
|
+ #if ENABLED(FAST_PWM_FAN)
|
|
1282
|
+ setPwmFrequency(CHAMBER_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
|
1283
|
+ #endif
|
|
1284
|
+ #else
|
|
1285
|
+ SET_OUTPUT(CHAMBER_AUTO_FAN_PIN);
|
|
1286
|
+ #endif
|
|
1287
|
+ #endif
|
1230
|
1288
|
|
1231
|
1289
|
// Wait for temperature measurement to settle
|
1232
|
1290
|
delay(250);
|
|
@@ -1630,6 +1688,7 @@ void Temperature::set_current_temp_raw() {
|
1630
|
1688
|
#endif
|
1631
|
1689
|
#endif
|
1632
|
1690
|
current_temperature_bed_raw = raw_temp_bed_value;
|
|
1691
|
+ current_temperature_chamber_raw = raw_temp_chamber_value;
|
1633
|
1692
|
temp_meas_ready = true;
|
1634
|
1693
|
}
|
1635
|
1694
|
|
|
@@ -1994,6 +2053,15 @@ void Temperature::isr() {
|
1994
|
2053
|
break;
|
1995
|
2054
|
#endif
|
1996
|
2055
|
|
|
2056
|
+ #if HAS_TEMP_CHAMBER
|
|
2057
|
+ case PrepareTemp_CHAMBER:
|
|
2058
|
+ HAL_START_ADC(TEMP_CHAMBER_PIN);
|
|
2059
|
+ break;
|
|
2060
|
+ case MeasureTemp_CHAMBER:
|
|
2061
|
+ raw_temp_chamber_value += ADC;
|
|
2062
|
+ break;
|
|
2063
|
+ #endif
|
|
2064
|
+
|
1997
|
2065
|
#if HAS_TEMP_1
|
1998
|
2066
|
case PrepareTemp_1:
|
1999
|
2067
|
HAL_START_ADC(TEMP_1_PIN);
|
|
@@ -2080,6 +2148,7 @@ void Temperature::isr() {
|
2080
|
2148
|
|
2081
|
2149
|
ZERO(raw_temp_value);
|
2082
|
2150
|
raw_temp_bed_value = 0;
|
|
2151
|
+ raw_temp_chamber_value = 0;
|
2083
|
2152
|
|
2084
|
2153
|
#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) > (HEATER_##N##_RAW_HI_TEMP) ? -1 : 1)
|
2085
|
2154
|
|
|
@@ -2191,15 +2260,17 @@ void Temperature::isr() {
|
2191
|
2260
|
#if NUM_SERIAL > 1
|
2192
|
2261
|
, const int8_t port=-1
|
2193
|
2262
|
#endif
|
2194
|
|
- , const int8_t e=-2
|
|
2263
|
+ , const int8_t e=-3
|
2195
|
2264
|
) {
|
2196
|
|
- #if !(HAS_TEMP_BED && HAS_TEMP_HOTEND) && HOTENDS <= 1
|
|
2265
|
+ #if !(HAS_TEMP_BED && HAS_TEMP_HOTEND && HAS_TEMP_CHAMBER) && HOTENDS <= 1
|
2197
|
2266
|
UNUSED(e);
|
2198
|
2267
|
#endif
|
2199
|
2268
|
|
2200
|
2269
|
SERIAL_PROTOCOLCHAR_P(port, ' ');
|
2201
|
2270
|
SERIAL_PROTOCOLCHAR_P(port,
|
2202
|
|
- #if HAS_TEMP_BED && HAS_TEMP_HOTEND
|
|
2271
|
+ #if HAS_TEMP_CHAMBER && HAS_TEMP_BED && HAS_TEMP_HOTEND
|
|
2272
|
+ e == -2 ? 'C' : e == -1 ? 'B' : 'T'
|
|
2273
|
+ #elif HAS_TEMP_BED && HAS_TEMP_HOTEND
|
2203
|
2274
|
e == -1 ? 'B' : 'T'
|
2204
|
2275
|
#elif HAS_TEMP_HOTEND
|
2205
|
2276
|
'T'
|
|
@@ -2246,6 +2317,14 @@ void Temperature::isr() {
|
2246
|
2317
|
, -1 // BED
|
2247
|
2318
|
);
|
2248
|
2319
|
#endif
|
|
2320
|
+ #if HAS_TEMP_CHAMBER
|
|
2321
|
+ print_heater_state(degChamber(), 0
|
|
2322
|
+ #if ENABLED(SHOW_TEMP_ADC_VALUES)
|
|
2323
|
+ , rawChamberTemp()
|
|
2324
|
+ #endif
|
|
2325
|
+ , -2 // CHAMBER
|
|
2326
|
+ );
|
|
2327
|
+ #endif
|
2249
|
2328
|
#if HOTENDS > 1
|
2250
|
2329
|
HOTEND_LOOP() print_heater_state(degHotend(e), degTargetHotend(e)
|
2251
|
2330
|
#if ENABLED(SHOW_TEMP_ADC_VALUES)
|