Skip to content

Commit 9466945

Browse files
authored
Merge pull request prusa3d#3461 from wavexx/fan_selfcheck_test
Fix/optimize fan selftest
2 parents a8244dc + 19b494a commit 9466945

7 files changed

+91
-93
lines changed

Firmware/ultralcd.cpp

+75-93
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ enum class FanCheck : uint_least8_t {
225225
*
226226
* @returns a TestError noerror, extruderFan, printFan or swappedFan.
227227
*/
228-
static FanCheck lcd_selftest_fan_auto(int _fan);
228+
static FanCheck lcd_selftest_fan_auto(uint8_t _fan);
229229
#endif //FANCHECK
230230

231231
#ifdef PAT9125
@@ -6655,15 +6655,15 @@ bool lcd_selftest()
66556655
_progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000);
66566656
#if (defined(FANCHECK) && defined(TACH_0))
66576657
switch (lcd_selftest_fan_auto(0)){ // check extruder Fan
6658-
case FanCheck::ExtruderFan:
6659-
_result = false;
6660-
break;
6661-
case FanCheck::SwappedFan:
6662-
_swapped_fan = true;
6663-
// FALLTHRU
6664-
default:
6665-
_result = true;
6666-
break;
6658+
case FanCheck::SwappedFan:
6659+
_swapped_fan = true; // swapped is merely a hint (checked later)
6660+
// FALLTHRU
6661+
case FanCheck::Success:
6662+
_result = true;
6663+
break;
6664+
default:
6665+
_result = false;
6666+
break;
66676667
}
66686668
#else //defined(TACH_0)
66696669
_result = lcd_selftest_manual_fan_check(0, false);
@@ -6677,17 +6677,17 @@ bool lcd_selftest()
66776677
{
66786678
_progress = lcd_selftest_screen(TestScreen::PrintFan, _progress, 3, true, 2000);
66796679
#if (defined(FANCHECK) && defined(TACH_1))
6680-
switch (lcd_selftest_fan_auto(1)){ // check print fan
6681-
case FanCheck::PrintFan:
6682-
_result = false;
6683-
break;
6684-
case FanCheck::SwappedFan:
6685-
_swapped_fan = true;
6686-
// FALLTHRU
6687-
default:
6688-
_result = true;
6689-
break;
6690-
}
6680+
switch (lcd_selftest_fan_auto(1)){ // check print fan
6681+
case FanCheck::SwappedFan:
6682+
_swapped_fan = true; // swapped is merely a hint (checked later)
6683+
// FALLTHRU
6684+
case FanCheck::Success:
6685+
_result = true;
6686+
break;
6687+
default:
6688+
_result = false;
6689+
break;
6690+
}
66916691
#else //defined(TACH_1)
66926692
_result = lcd_selftest_manual_fan_check(1, false);
66936693
#endif //defined(TACH_1)
@@ -7571,90 +7571,72 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
75717571
}
75727572

75737573
#ifdef FANCHECK
7574-
static FanCheck lcd_selftest_fan_auto(int _fan)
7575-
{
7576-
switch (_fan) {
7577-
case 0:
7578-
fanSpeed = 0;
7579-
manage_heater(); //turn off fan
7580-
setExtruderAutoFanState(3); //extruder fan
7574+
// Set print fan speed
7575+
static void lcd_selftest_setfan(uint8_t speed) {
7576+
// set the fan speed
7577+
fanSpeed = speed;
75817578
#ifdef FAN_SOFT_PWM
7582-
extruder_autofan_last_check = _millis();
7583-
fan_measuring = true;
7584-
#endif //FAN_SOFT_PWM
7585-
_delay(2000);
7586-
setExtruderAutoFanState(0); //extruder fan
7587-
manage_heater(); //count average fan speed from 2s delay and turn off fans
7579+
fanSpeedSoftPwm = speed;
7580+
#endif
7581+
manage_heater();
7582+
}
75887583

7589-
puts_P(PSTR("Test 1:"));
7590-
printf_P(PSTR("Print fan speed: %d\n"), fan_speed[1]);
7591-
printf_P(PSTR("Extr fan speed: %d\n"), fan_speed[0]);
7584+
// Wait for the specified number of seconds while displaying some single-character indicator on the
7585+
// screen coordinate col/row, then perform fan measurement
7586+
static void lcd_selftest_measure_fans(uint8_t delay, uint8_t col, uint8_t row) {
7587+
// spin-up delay
7588+
static char symbols[] = {'-', '|'};
7589+
static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000);
7590+
while(delay--) {
7591+
for(uint8_t i = 0; i != sizeof(symbols); ++i) {
7592+
lcd_putc_at(col, row, symbols[i]);
7593+
delay_keep_alive(1000 / sizeof(symbols));
7594+
}
7595+
}
75927596

7593-
if (fan_speed[0] < 20) { // < 1200 RPM would mean either a faulty Noctua or Altfan
7594-
return FanCheck::ExtruderFan;
7595-
}
7596-
#ifdef FAN_SOFT_PWM
7597-
else if (fan_speed[0] > 50 ) { // printerFan is faster
7598-
return FanCheck::SwappedFan;
7599-
}
7600-
break;
7597+
#ifdef FANCHECK
7598+
extruder_autofan_last_check = _millis();
76017599
#endif
7600+
fan_measuring = true;
7601+
while(fan_measuring) {
7602+
delay_keep_alive(100);
7603+
}
76027604

7603-
case 1:
7604-
//will it work with Thotend > 50 C ?
7605-
#ifdef FAN_SOFT_PWM
7606-
fanSpeed = 255;
7607-
fanSpeedSoftPwm = 255;
7608-
extruder_autofan_last_check = _millis(); //store time when measurement starts
7609-
fan_measuring = true; //start fan measuring, rest is on manage_heater
7610-
#else //FAN_SOFT_PWM
7611-
fanSpeed = 150; //print fan
7612-
#endif //FAN_SOFT_PWM
7613-
for (uint8_t i = 0; i < 5; i++) {
7614-
delay_keep_alive(1000);
7615-
lcd_putc_at(18, 3, '-');
7616-
delay_keep_alive(1000);
7617-
lcd_putc_at(18, 3, '|');
7618-
}
7619-
fanSpeed = 0;
7605+
gcode_M123();
7606+
}
76207607

7621-
#ifdef FAN_SOFT_PWM
7622-
fanSpeedSoftPwm = 0;
7623-
#else //FAN_SOFT_PWM
7624-
manage_heater(); //turn off fan
7625-
manage_inactivity(true); //to turn off print fan
7626-
#endif //FAN_SOFT_PWM
7627-
puts_P(PSTR("Test 2:"));
7628-
printf_P(PSTR("Print fan speed: %d\n"), fan_speed[1]);
7629-
printf_P(PSTR("Extr fan speed: %d\n"), fan_speed[0]);
7630-
if (!fan_speed[1]) {
7631-
return FanCheck::PrintFan;
7632-
}
7608+
static FanCheck lcd_selftest_fan_auto(uint8_t _fan)
7609+
{
7610+
// speed threshold to differentiate between extruder and print fan
7611+
static const int printFanThr = FANCHECK_AUTO_PRINT_FAN_THRS; // >= FANCHECK_AUTO_PRINT_FAN_THRS RPS
76337612

7634-
#ifdef FAN_SOFT_PWM
7635-
fanSpeed = 80;
7636-
fanSpeedSoftPwm = 80;
7637-
7638-
for (uint8_t i = 0; i < 5; i++) {
7639-
delay_keep_alive(1000);
7640-
lcd_putc_at(18, 3, '-');
7641-
delay_keep_alive(1000);
7642-
lcd_putc_at(18, 3, '|');
7643-
}
7644-
fanSpeed = 0;
7613+
// speed threshold to mark a fan as failed
7614+
static const int failThr = FANCHECK_AUTO_FAIL_THRS; // < FANCHECK_AUTO_FAIL_THRS RPM would mean either a faulty Noctua, Altfan or print fan
76457615

7646-
// noctua speed is between 17 and 24, turbine more then 30
7647-
if (fan_speed[1] < 30) {
7648-
return FanCheck::SwappedFan;
7616+
switch (_fan) {
7617+
case 0:
7618+
setExtruderAutoFanState(3); // extruder fan
7619+
lcd_selftest_setfan(0); // print fan off
7620+
lcd_selftest_measure_fans(2, 18, 2);
7621+
setExtruderAutoFanState(0); // extruder fan off
7622+
if (fan_speed[0] < failThr) {
7623+
return FanCheck::ExtruderFan;
76497624
}
7650-
#else
7651-
// fan is spinning, but measured RPM are too low for print fan, it must
7652-
// be left extruder fan
7653-
else if (fan_speed[1] < 34) {
7625+
if (fan_speed[0] >= printFanThr ) {
76547626
return FanCheck::SwappedFan;
76557627
}
7656-
#endif //FAN_SOFT_PWM
76577628
break;
7629+
7630+
case 1:
7631+
lcd_selftest_setfan(255);
7632+
lcd_selftest_measure_fans(5, 18, 3);
7633+
lcd_selftest_setfan(0);
7634+
if (fan_speed[1] < failThr) {
7635+
return FanCheck::PrintFan;
7636+
}
7637+
if (fan_speed[1] < printFanThr) {
7638+
return FanCheck::SwappedFan;
7639+
}
76587640
}
76597641
return FanCheck::Success;
76607642
}

Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h

+3
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@
220220
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
221221
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
222222

223+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
224+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
225+
223226

224227
/*------------------------------------
225228
LOAD/UNLOAD FILAMENT SETTINGS

Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h

+3
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@
221221
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
222222
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
223223

224+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
225+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
226+
224227

225228
/*------------------------------------
226229
LOAD/UNLOAD FILAMENT SETTINGS

Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h

+3
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@
220220
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
221221
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
222222

223+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
224+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
225+
223226

224227
/*------------------------------------
225228
LOAD/UNLOAD FILAMENT SETTINGS

Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h

+3
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@
221221
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
222222
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
223223

224+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
225+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
226+
224227

225228
/*------------------------------------
226229
LOAD/UNLOAD FILAMENT SETTINGS

Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h

+2
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,8 @@
358358
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
359359
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
360360

361+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
362+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
361363

362364

363365
/*------------------------------------

Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h

+2
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,8 @@
362362
#define EXTRUDER_ALTFAN_DETECT
363363
#define EXTRUDER_ALTFAN_SPEED_SILENT 128
364364

365+
#define FANCHECK_AUTO_PRINT_FAN_THRS 70 //[RPS] - Used during selftest to identify swapped fans automatically
366+
#define FANCHECK_AUTO_FAIL_THRS 20 //[RPS] - Used during selftest to identify a faulty fan
365367

366368

367369
/*------------------------------------

0 commit comments

Comments
 (0)