fan check hotfix (selftest, measuring RPM, fan errors)
This commit is contained in:
parent
ea20529945
commit
f9298b37b8
5 changed files with 89 additions and 7 deletions
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -252,3 +252,7 @@ void check_max_temp();
|
|||
|
||||
#endif
|
||||
|
||||
extern unsigned long extruder_autofan_last_check;
|
||||
extern uint8_t fanSpeedBckp;
|
||||
extern bool fan_measuring;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue