Ignore spurious MAX31855K / 6675 thermocouple errors (#18039)
This commit is contained in:
parent
7b2a056656
commit
60bed3434b
2 changed files with 50 additions and 23 deletions
|
@ -39,6 +39,19 @@
|
||||||
//=============================Thermal Settings ============================
|
//=============================Thermal Settings ============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thermocouple sensors are quite sensitive to noise. Any noise induced in
|
||||||
|
* the sensor wires, such as by stepper motor wires run in parallel to them,
|
||||||
|
* may result in the thermocouple sensor reporting spurious errors. This
|
||||||
|
* value is the number of errors which can occur in a row before the error
|
||||||
|
* is reported. This allows us to ignore intermittent error conditions while
|
||||||
|
* still detecting an actual failure, which should result in a continuous
|
||||||
|
* stream of errors from the sensor.
|
||||||
|
*
|
||||||
|
* Set this value to 0 to fail on the first error to occur.
|
||||||
|
*/
|
||||||
|
#define THERMOCOUPLE_MAX_ERRORS 15
|
||||||
|
|
||||||
//
|
//
|
||||||
// Custom Thermistor 1000 parameters
|
// Custom Thermistor 1000 parameters
|
||||||
//
|
//
|
||||||
|
|
|
@ -2060,6 +2060,10 @@ void Temperature::disable_all_heaters() {
|
||||||
|
|
||||||
#if HAS_MAX6675
|
#if HAS_MAX6675
|
||||||
|
|
||||||
|
#ifndef THERMOCOUPLE_MAX_ERRORS
|
||||||
|
#define THERMOCOUPLE_MAX_ERRORS 15
|
||||||
|
#endif
|
||||||
|
|
||||||
int Temperature::read_max6675(
|
int Temperature::read_max6675(
|
||||||
#if COUNT_6675 > 1
|
#if COUNT_6675 > 1
|
||||||
const uint8_t hindex
|
const uint8_t hindex
|
||||||
|
@ -2071,6 +2075,8 @@ void Temperature::disable_all_heaters() {
|
||||||
// Needed to return the correct temp when this is called too soon
|
// Needed to return the correct temp when this is called too soon
|
||||||
static uint16_t max6675_temp_previous[COUNT_6675] = { 0 };
|
static uint16_t max6675_temp_previous[COUNT_6675] = { 0 };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static uint8_t max6675_errors[COUNT_6675] = { 0 };
|
||||||
|
|
||||||
#define MAX6675_HEAT_INTERVAL 250UL
|
#define MAX6675_HEAT_INTERVAL 250UL
|
||||||
|
|
||||||
|
@ -2144,33 +2150,41 @@ void Temperature::disable_all_heaters() {
|
||||||
WRITE_MAX6675(HIGH); // disable TT_MAX6675
|
WRITE_MAX6675(HIGH); // disable TT_MAX6675
|
||||||
|
|
||||||
if (max6675_temp & MAX6675_ERROR_MASK) {
|
if (max6675_temp & MAX6675_ERROR_MASK) {
|
||||||
SERIAL_ERROR_START();
|
max6675_errors[hindex] += 1;
|
||||||
SERIAL_ECHOPGM("Temp measurement error! ");
|
if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) {
|
||||||
#if MAX6675_ERROR_MASK == 7
|
SERIAL_ERROR_START();
|
||||||
SERIAL_ECHOPGM("MAX31855 ");
|
SERIAL_ECHOPGM("Temp measurement error! ");
|
||||||
if (max6675_temp & 1)
|
#if MAX6675_ERROR_MASK == 7
|
||||||
SERIAL_ECHOLNPGM("Open Circuit");
|
SERIAL_ECHOPGM("MAX31855 ");
|
||||||
else if (max6675_temp & 2)
|
if (max6675_temp & 1)
|
||||||
SERIAL_ECHOLNPGM("Short to GND");
|
SERIAL_ECHOLNPGM("Open Circuit");
|
||||||
else if (max6675_temp & 4)
|
else if (max6675_temp & 2)
|
||||||
SERIAL_ECHOLNPGM("Short to VCC");
|
SERIAL_ECHOLNPGM("Short to GND");
|
||||||
#else
|
else if (max6675_temp & 4)
|
||||||
SERIAL_ECHOLNPGM("MAX6675");
|
SERIAL_ECHOLNPGM("Short to VCC");
|
||||||
#endif
|
|
||||||
|
|
||||||
// Thermocouple open
|
|
||||||
max6675_temp = 4 * (
|
|
||||||
#if COUNT_6675 > 1
|
|
||||||
hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX
|
|
||||||
#elif ENABLED(HEATER_1_USES_MAX6675)
|
|
||||||
HEATER_1_MAX6675_TMAX
|
|
||||||
#else
|
#else
|
||||||
HEATER_0_MAX6675_TMAX
|
SERIAL_ECHOLNPGM("MAX6675");
|
||||||
#endif
|
#endif
|
||||||
);
|
|
||||||
|
// Thermocouple open
|
||||||
|
max6675_temp = 4 * (
|
||||||
|
#if COUNT_6675 > 1
|
||||||
|
hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX
|
||||||
|
#elif ENABLED(HEATER_1_USES_MAX6675)
|
||||||
|
HEATER_1_MAX6675_TMAX
|
||||||
|
#else
|
||||||
|
HEATER_0_MAX6675_TMAX
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
max6675_temp >>= MAX6675_DISCARD_BITS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
max6675_temp >>= MAX6675_DISCARD_BITS;
|
max6675_temp >>= MAX6675_DISCARD_BITS;
|
||||||
|
max6675_errors[hindex] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLED(MAX6675_IS_MAX31855)
|
#if ENABLED(MAX6675_IS_MAX31855)
|
||||||
if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature
|
if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature
|
||||||
|
|
Reference in a new issue