123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- #include "fancheck.h"
- #include "cardreader.h"
- #include "ultralcd.h"
- #include "sound.h"
- #include "messages.h"
- #include "temperature.h"
- #include "stepper.h"
- #define FAN_CHECK_PERIOD 5000
- #define FAN_CHECK_DURATION 100
- #ifdef FANCHECK
- volatile uint8_t fan_check_error = EFCE_OK;
- #endif
- #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
- #ifdef EXTRUDER_ALTFAN_DETECT
- static struct
- {
- uint8_t isAltfan : 1;
- uint8_t altfanOverride : 1;
- } altfanStatus;
- #endif
- unsigned long extruder_autofan_last_check = _millis();
- bool fan_measuring = false;
- static uint8_t fanState = 0;
- #endif
- #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
- #if defined(FAN_PIN) && FAN_PIN > -1
- #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
- #error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN"
- #endif
- #endif
- void setExtruderAutoFanState(uint8_t state)
- {
-
-
- fanState = state;
- newFanSpeed = 0;
- if (fanState & 0x01)
- {
- #ifdef EXTRUDER_ALTFAN_DETECT
- if (altfanStatus.isAltfan && !altfanStatus.altfanOverride) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT;
- else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
- #else
- newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
- #endif
- }
- timer4_set_fan0(newFanSpeed);
- }
- #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
- void countFanSpeed()
- {
-
- fan_speed[0] = (fan_edge_counter[0] * (float(250) / (_millis() - extruder_autofan_last_check)));
- fan_speed[1] = (fan_edge_counter[1] * (float(250) / (_millis() - extruder_autofan_last_check)));
-
- fan_edge_counter[0] = 0;
- fan_edge_counter[1] = 0;
- }
- static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
- SERIAL_ECHOLNRPGM(serialMsg);
- if (get_message_level() == 0) {
- Sound_MakeCustom(200,0,true);
- LCD_ALERTMESSAGERPGM(lcdMsg);
- }
- }
- void fanSpeedError(unsigned char _fan) {
- if (fan_check_error == EFCE_REPORTED) return;
- fan_check_error = EFCE_REPORTED;
- if (IS_SD_PRINTING || usb_timer.running()) {
-
- if(!isPrintPaused) {
- if (usb_timer.running())
- lcd_pause_usb_print();
- else
- lcd_pause_print();
- }
- }
- else {
-
- setTargetHotend0(0);
- heating_status = HeatingStatus::NO_HEATING;
- }
- switch (_fan) {
- case 0:
- fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), MSG_FANCHECK_EXTRUDER);
- break;
- case 1:
- fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT);
- break;
- }
- }
- void checkFanSpeed()
- {
- uint8_t max_fan_errors[2];
- #ifdef FAN_SOFT_PWM
- max_fan_errors[1] = 3;
- max_fan_errors[0] = 2;
- #else
- max_fan_errors[1] = 15;
- max_fan_errors[0] = 5;
- #endif
- if(fans_check_enabled)
- fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
- static uint8_t fan_speed_errors[2] = { 0,0 };
- #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1))
- if ((fan_speed[0] < 20) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)){ fan_speed_errors[0]++;}
- else fan_speed_errors[0] = 0;
- #endif
- #if (defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-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] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){
-
- fan_check_error = EFCE_FIXED;
- }
- if ((fan_check_error == EFCE_FIXED) && !printer_active()){
- fan_check_error = EFCE_OK;
- lcd_reset_alert_level();
- }
- if (fans_check_enabled && (fan_check_error == EFCE_OK))
- {
- for (uint8_t fan = 0; fan < 2; fan++)
- {
- if (fan_speed_errors[fan] > max_fan_errors[fan])
- {
- fan_speed_errors[fan] = 0;
- fanSpeedError(fan);
- }
- }
- }
- }
- #endif
- #ifdef EXTRUDER_ALTFAN_DETECT
- ISR(INT6_vect) {
- fan_edge_counter[0]++;
- }
- bool extruder_altfan_detect()
- {
- setExtruderAutoFanState(3);
- SET_INPUT(TACH_0);
- uint8_t overrideVal = eeprom_read_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE);
- if (overrideVal == EEPROM_EMPTY_VALUE)
- {
- overrideVal = (calibration_status() == CALIBRATION_STATUS_CALIBRATED) ? 1 : 0;
- eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, overrideVal);
- }
- altfanStatus.altfanOverride = overrideVal;
- CRITICAL_SECTION_START;
- EICRB &= ~(1 << ISC61);
- EICRB |= (1 << ISC60);
- EIMSK |= (1 << INT6);
- fan_edge_counter[0] = 0;
- CRITICAL_SECTION_END;
- extruder_autofan_last_check = _millis();
- _delay(1000);
- EIMSK &= ~(1 << INT6);
- countFanSpeed();
- altfanStatus.isAltfan = fan_speed[0] > 100;
- setExtruderAutoFanState(1);
- return altfanStatus.isAltfan;
- }
- void altfanOverride_toggle()
- {
- altfanStatus.altfanOverride = !altfanStatus.altfanOverride;
- eeprom_update_byte((uint8_t *)EEPROM_ALTFAN_OVERRIDE, altfanStatus.altfanOverride);
- }
- bool altfanOverride_get()
- {
- return altfanStatus.altfanOverride;
- }
- #endif
- void checkExtruderAutoFans()
- {
- #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1
- if (!(fanState & 0x02))
- {
- fanState &= ~1;
- fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE;
- fanState |= get_temp_error();
- }
- setExtruderAutoFanState(fanState);
- #endif
- }
- #endif
- #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1))
- void readFanTach() {
- #ifdef FAN_SOFT_PWM
- if (READ(TACH_0) != fan_state[0]) {
- if(fan_measuring) fan_edge_counter[0] ++;
- fan_state[0] = !fan_state[0];
- }
- #else
- if (READ(TACH_0) != fan_state[0]) {
- fan_edge_counter[0] ++;
- fan_state[0] = !fan_state[0];
- }
- #endif
-
-
-
-
- }
- #endif
- void checkFans()
- {
- #ifndef DEBUG_DISABLE_FANCHECK
- #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
- #ifdef FAN_SOFT_PWM
- #ifdef FANCHECK
- if ((_millis() - extruder_autofan_last_check > FAN_CHECK_PERIOD) && (!fan_measuring)) {
- extruder_autofan_last_check = _millis();
- fanSpeedBckp = fanSpeedSoftPwm;
- if (fanSpeedSoftPwm >= MIN_PRINT_FAN_SPEED) {
-
- fanSpeedSoftPwm = 255;
- }
- fan_measuring = true;
- }
- if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) {
- countFanSpeed();
- checkFanSpeed();
-
- fanSpeedSoftPwm = fanSpeedBckp;
-
- extruder_autofan_last_check = _millis();
- fan_measuring = false;
- }
- #endif
- checkExtruderAutoFans();
- #else
- if(_millis() - extruder_autofan_last_check > 1000)
- {
- #if (defined(FANCHECK) && ((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))
- countFanSpeed();
- checkFanSpeed();
- #endif
- checkExtruderAutoFans();
- extruder_autofan_last_check = _millis();
- }
- #endif
- #endif
- #endif
- }
- void hotendFanSetFullSpeed()
- {
- #ifdef EXTRUDER_ALTFAN_DETECT
- altfanStatus.altfanOverride = 1;
- #endif
- setExtruderAutoFanState(3);
- SET_OUTPUT(FAN_PIN);
- #ifdef FAN_SOFT_PWM
- fanSpeedSoftPwm = 255;
- #else
- analogWrite(FAN_PIN, 255);
- #endif
- fanSpeed = 255;
- }
|