Ignore spurious MAX31855K / 6675 thermocouple errors (#18039)

This commit is contained in:
Mobilinkd LLC 2020-05-20 15:38:29 -05:00 committed by GitHub
parent 7b2a056656
commit 60bed3434b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 23 deletions

View File

@ -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
// //

View File

@ -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