fan check hotfix (selftest, measuring RPM, fan errors)

This commit is contained in:
PavelSindler 2019-02-05 04:02:38 +01:00
parent ea20529945
commit f9298b37b8
5 changed files with 89 additions and 7 deletions

View file

@ -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();

View file

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

View file

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

View file

@ -252,3 +252,7 @@ void check_max_temp();
#endif
extern unsigned long extruder_autofan_last_check;
extern uint8_t fanSpeedBckp;
extern bool fan_measuring;

View file

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