From f9298b37b802832705009d3c73dbf2994f9a234c Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 5 Feb 2019 04:02:38 +0100 Subject: [PATCH] fan check hotfix (selftest, measuring RPM, fan errors) --- Firmware/Marlin_main.cpp | 10 +++++++- Firmware/planner.cpp | 1 + Firmware/temperature.cpp | 51 ++++++++++++++++++++++++++++++++++++---- Firmware/temperature.h | 4 ++++ Firmware/ultralcd.cpp | 30 ++++++++++++++++++++++- 5 files changed, 89 insertions(+), 7 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index be039f3b9..fc18238f7 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8519,8 +8519,13 @@ void setup_fan_interrupt() { // and it takes 4.24 us to process (the interrupt invocation overhead not taken into account). ISR(INT7_vect) { //measuring speed now works for fanSpeed > 18 (approximately), which is sufficient because MIN_PRINT_FAN_SPEED is higher - +#ifdef FAN_SOFT_PWM + //if (fanSpeedSoftPwm != 255) return; + if ((fanSpeed != 255) || (fanSpeed < MIN_PRINT_FAN_SPEED)) return; +#else //FAN_SOFT_PWM if (fanSpeed < MIN_PRINT_FAN_SPEED) return; +#endif //FAN_SOFT_PWM + if ((1 << 6) & EICRB) { //interrupt was triggered by rising edge t_fan_rising_edge = millis_nc(); } @@ -8887,6 +8892,9 @@ void stop_and_save_print_to_ram(float z_move, float e_move) saved_extruder_under_pressure = extruder_under_pressure; //extruder under pressure flag - currently unused saved_extruder_relative_mode = axis_relative_modes[E_AXIS]; saved_fanSpeed = fanSpeed; +#ifdef FAN_SOFT_PWM + if (fan_measuring) saved_fanSpeed = fanSpeedBckp; +#endif //FAN_SOFT_PWM cmdqueue_reset(); //empty cmdqueue card.sdprinting = false; // card.closefile(); diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 37d6e0b7d..c1768a91a 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -546,6 +546,7 @@ void check_axes_activity() #endif//FAN_KICKSTART_TIME #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = tail_fan_speed; + //printf_P(PSTR("fanspeedsoftPWM %d \n"), fanSpeedSoftPwm); #else analogWrite(FAN_PIN,tail_fan_speed); #endif//!FAN_SOFT_PWM diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index c02cf9042..158659046 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -142,7 +142,10 @@ static volatile bool temp_meas_ready = false; #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) - static unsigned long extruder_autofan_last_check; + unsigned long extruder_autofan_last_check = _millis(); + uint8_t fanSpeedBckp = 255; + bool fan_measuring = false; + #endif @@ -484,6 +487,16 @@ extern bool fans_check_enabled; void checkFanSpeed() { + uint8_t max_print_fan_errors = 0; + uint8_t max_extruder_fan_errors = 0; +#ifdef FAN_SOFT_PWM + max_print_fan_errors = 3; //15 seconds + max_extruder_fan_errors = 2; //10seconds +#else //FAN_SOFT_PWM + max_print_fan_errors = 15; //15 seconds + max_extruder_fan_errors = 5; //5 seconds +#endif //FAN_SOFT_PWM + fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0); static unsigned char fan_speed_errors[2] = { 0,0 }; #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1)) @@ -491,15 +504,15 @@ void checkFanSpeed() else fan_speed_errors[0] = 0; #endif #if (defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1)) - if ((fan_speed[1] == 0) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++; + if ((fan_speed[1] < 5) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++; else fan_speed_errors[1] = 0; #endif - if ((fan_speed_errors[0] > 5) && fans_check_enabled) { + if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) { fan_speed_errors[0] = 0; fanSpeedError(0); //extruder fan } - if ((fan_speed_errors[1] > 15) && fans_check_enabled) { + if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled) { fan_speed_errors[1] = 0; fanSpeedError(1); //print fan } @@ -734,10 +747,36 @@ void manage_heater() #endif } // End extruder for loop +#define FAN_CHECK_PERIOD 5000 //5s +#define FAN_CHECK_DURATION 100 //100ms + #ifndef DEBUG_DISABLE_FANCHECK #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) + +#ifdef FAN_SOFT_PWM + if ((_millis() - extruder_autofan_last_check > FAN_CHECK_PERIOD) && (!fan_measuring)) { + extruder_autofan_last_check = _millis(); + fanSpeedBckp = fanSpeed; + if (fanSpeed > MIN_PRINT_FAN_SPEED) { + fanSpeed = 255; + } + // fanSpeedBckp = fanSpeedSoftPwm; + // fanSpeedSoftPwm = 255; + fan_measuring = true; + } + if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) { + countFanSpeed(); + checkFanSpeed(); + fanSpeed = fanSpeedBckp; + // fanSpeedSoftPwm = fanSpeedBckp; + printf_P(PSTR("fan PWM: %d; extr fanSpeed measured: %d; print fan speed measured: %d \n"), fanSpeedBckp, fan_speed[0], fan_speed[1]); + extruder_autofan_last_check = _millis(); + fan_measuring = false; + } + checkExtruderAutoFans(); +#else //FAN_SOFT_PWM if(_millis() - extruder_autofan_last_check > 1000) // only need to check fan state very infrequently { #if (defined(FANCHECK) && ((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))) @@ -747,7 +786,9 @@ void manage_heater() checkExtruderAutoFans(); extruder_autofan_last_check = _millis(); } - #endif +#endif //FAN_SOFT_PWM + + #endif #endif //DEBUG_DISABLE_FANCHECK #ifndef PIDTEMPBED diff --git a/Firmware/temperature.h b/Firmware/temperature.h index 9be54e912..daee5c080 100644 --- a/Firmware/temperature.h +++ b/Firmware/temperature.h @@ -252,3 +252,7 @@ void check_max_temp(); #endif +extern unsigned long extruder_autofan_last_check; +extern uint8_t fanSpeedBckp; +extern bool fan_measuring; + diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a2c260083..bd8746c46 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -7350,9 +7350,21 @@ static bool lcd_selftest_fan_dialog(int _fan) fanSpeed = 0; manage_heater(); //turn off fan setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, 1); //extruder fan +#ifdef FAN_SOFT_PWM + extruder_autofan_last_check = _millis(); +#endif //FAN_SOFT_PWM _delay(2000); //delay_keep_alive would turn off extruder fan, because temerature is too low +#ifdef FAN_SOFT_PWM + countFanSpeed(); + if (!fan_speed[0]) _result = false; +#else //FAN_SOFT_PWM manage_heater(); //count average fan speed from 2s delay and turn off fans if (!fan_speed[0]) _result = false; +#endif //FAN_SOFT_PWM + + printf_P(PSTR("Test 1:\n")); + printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]); + printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]); //SERIAL_ECHOPGM("Extruder fan speed: "); //MYSERIAL.println(fan_speed[0]); //SERIAL_ECHOPGM("Print fan speed: "); @@ -7361,7 +7373,12 @@ static bool lcd_selftest_fan_dialog(int _fan) case 1: //will it work with Thotend > 50 C ? +#ifdef FAN_SOFT_PWM + extruder_autofan_last_check = _millis(); + fanSpeed = 255; +#else //FAN_SOFT_PWM fanSpeed = 150; //print fan +#endif //FAN_SOFT_PWM for (uint8_t i = 0; i < 5; i++) { delay_keep_alive(1000); lcd_set_cursor(18, 3); @@ -7370,15 +7387,26 @@ static bool lcd_selftest_fan_dialog(int _fan) lcd_set_cursor(18, 3); lcd_print("|"); } +#ifdef FAN_SOFT_PWM + countFanSpeed(); + fanSpeed = 0; +#else //FAN_SOFT_PWM fanSpeed = 0; manage_heater(); //turn off fan manage_inactivity(true); //to turn off print fan +#endif //FAN_SOFT_PWM + printf_P(PSTR("Test 2:\n")); + printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]); + printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]); if (!fan_speed[1]) { _result = false; _errno = 6; //print fan not spinning } +#ifdef FAN_SOFT_PWM + else { +#else //FAN_SOFT_PWM else if (fan_speed[1] < 34) { //fan is spinning, but measured RPM are too low for print fan, it must be left extruder fan +#endif //FAN_SOFT_PWM //check fans manually - _result = lcd_selftest_manual_fan_check(1, true); //turn on print fan and check that left extruder fan is not spinning if (_result) { _result = lcd_selftest_manual_fan_check(1, false); //print fan is stil turned on; check that it is spinning