Merge pull request #409 from buildrob202/Marlin_v1
Implement automatic cold-end/extruder motor fan control based on nozzle temperature
This commit is contained in:
commit
b2eeebd9c3
6 changed files with 363 additions and 285 deletions
|
@ -51,6 +51,9 @@
|
||||||
#define MOTHERBOARD 7
|
#define MOTHERBOARD 7
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// This defines the number of extruders
|
||||||
|
#define EXTRUDERS 1
|
||||||
|
|
||||||
//// The following define selects which power supply you have. Please choose the one that matches your setup
|
//// The following define selects which power supply you have. Please choose the one that matches your setup
|
||||||
// 1 = ATX
|
// 1 = ATX
|
||||||
// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
|
// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
|
||||||
|
|
|
@ -63,21 +63,31 @@
|
||||||
//This is for controlling a fan to cool down the stepper drivers
|
//This is for controlling a fan to cool down the stepper drivers
|
||||||
//it will turn on when any driver is enabled
|
//it will turn on when any driver is enabled
|
||||||
//and turn off after the set amount of seconds from last driver being disabled again
|
//and turn off after the set amount of seconds from last driver being disabled again
|
||||||
//#define CONTROLLERFAN_PIN 23 //Pin used for the fan to cool controller, comment out to disable this function
|
#define CONTROLLERFAN_PIN -1 //Pin used for the fan to cool controller (-1 to disable)
|
||||||
#define CONTROLLERFAN_SEC 60 //How many seconds, after all motors were disabled, the fan should run
|
#define CONTROLLERFAN_SECS 60 //How many seconds, after all motors were disabled, the fan should run
|
||||||
|
#define CONTROLLERFAN_SPEED 255 // == full speed
|
||||||
|
|
||||||
// When first starting the main fan, run it at full speed for the
|
// When first starting the main fan, run it at full speed for the
|
||||||
// given number of milliseconds. This gets the fan spinning reliably
|
// given number of milliseconds. This gets the fan spinning reliably
|
||||||
// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
|
// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
|
||||||
//#define FAN_KICKSTART_TIME 100
|
//#define FAN_KICKSTART_TIME 100
|
||||||
|
|
||||||
|
// Extruder cooling fans
|
||||||
|
// Configure fan pin outputs to automatically turn on/off when the associated
|
||||||
|
// extruder temperature is above/below EXTRUDER_AUTO_FAN_TEMPERATURE.
|
||||||
|
// Multiple extruders can be assigned to the same pin in which case
|
||||||
|
// the fan will turn on when any selected extruder is above the threshold.
|
||||||
|
#define EXTRUDER_0_AUTO_FAN_PIN -1
|
||||||
|
#define EXTRUDER_1_AUTO_FAN_PIN -1
|
||||||
|
#define EXTRUDER_2_AUTO_FAN_PIN -1
|
||||||
|
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
|
||||||
|
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Mechanical Settings===========================
|
//=============================Mechanical Settings===========================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
// This defines the number of extruders
|
|
||||||
#define EXTRUDERS 1
|
|
||||||
|
|
||||||
#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -319,7 +319,7 @@ void setup_photpin()
|
||||||
void setup_powerhold()
|
void setup_powerhold()
|
||||||
{
|
{
|
||||||
#ifdef SUICIDE_PIN
|
#ifdef SUICIDE_PIN
|
||||||
#if (SUICIDE_PIN> -1)
|
#if (SUICIDE_PIN> 0)
|
||||||
SET_OUTPUT(SUICIDE_PIN);
|
SET_OUTPUT(SUICIDE_PIN);
|
||||||
WRITE(SUICIDE_PIN, HIGH);
|
WRITE(SUICIDE_PIN, HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
@ -411,13 +411,9 @@ void setup()
|
||||||
|
|
||||||
lcd_init();
|
lcd_init();
|
||||||
|
|
||||||
#ifdef CONTROLLERFAN_PIN
|
#if CONTROLLERFAN_PIN > 0
|
||||||
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
|
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EXTRUDERFAN_PIN
|
|
||||||
SET_OUTPUT(EXTRUDERFAN_PIN); //Set pin used for extruder cooling fan
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1040,6 +1036,10 @@ void process_commands()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if FAN_PIN > 0
|
||||||
|
if (pin_number == FAN_PIN)
|
||||||
|
fanSpeed = pin_status;
|
||||||
|
#endif
|
||||||
if (pin_number > -1)
|
if (pin_number > -1)
|
||||||
{
|
{
|
||||||
pinMode(pin_number, OUTPUT);
|
pinMode(pin_number, OUTPUT);
|
||||||
|
@ -2064,7 +2064,12 @@ void prepare_arc_move(char isclockwise) {
|
||||||
previous_millis_cmd = millis();
|
previous_millis_cmd = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONTROLLERFAN_PIN
|
#if CONTROLLERFAN_PIN > 0
|
||||||
|
|
||||||
|
#if CONTROLLERFAN_PIN == FAN_PIN
|
||||||
|
#error "You cannot set CONTROLLERFAN_PIN equal to FAN_PIN"
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned long lastMotor = 0; //Save the time for when a motor was turned on last
|
unsigned long lastMotor = 0; //Save the time for when a motor was turned on last
|
||||||
unsigned long lastMotorCheck = 0;
|
unsigned long lastMotorCheck = 0;
|
||||||
|
|
||||||
|
@ -2086,34 +2091,16 @@ void controllerFan()
|
||||||
lastMotor = millis(); //... set time to NOW so the fan will turn on
|
lastMotor = millis(); //... set time to NOW so the fan will turn on
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((millis() - lastMotor) >= (CONTROLLERFAN_SEC*1000UL) || lastMotor == 0) //If the last time any driver was enabled, is longer since than CONTROLLERSEC...
|
if ((millis() - lastMotor) >= (CONTROLLERFAN_SECS*1000UL) || lastMotor == 0) //If the last time any driver was enabled, is longer since than CONTROLLERSEC...
|
||||||
{
|
{
|
||||||
WRITE(CONTROLLERFAN_PIN, LOW); //... turn the fan off
|
digitalWrite(CONTROLLERFAN_PIN, 0);
|
||||||
|
analogWrite(CONTROLLERFAN_PIN, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WRITE(CONTROLLERFAN_PIN, HIGH); //... turn the fan on
|
// allows digital or PWM fan output to be used (see M42 handling)
|
||||||
}
|
digitalWrite(CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
|
||||||
}
|
analogWrite(CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef EXTRUDERFAN_PIN
|
|
||||||
unsigned long lastExtruderCheck = 0;
|
|
||||||
|
|
||||||
void extruderFan()
|
|
||||||
{
|
|
||||||
if ((millis() - lastExtruderCheck) >= 2500) //Not a time critical function, so we only check every 2500ms
|
|
||||||
{
|
|
||||||
lastExtruderCheck = millis();
|
|
||||||
|
|
||||||
if (degHotend(active_extruder) < EXTRUDERFAN_DEC)
|
|
||||||
{
|
|
||||||
WRITE(EXTRUDERFAN_PIN, LOW); //... turn the fan off
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WRITE(EXTRUDERFAN_PIN, HIGH); //... turn the fan on
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2137,11 +2124,11 @@ void manage_inactivity()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if( KILL_PIN>-1 )
|
#if KILL_PIN > 0
|
||||||
if( 0 == READ(KILL_PIN) )
|
if( 0 == READ(KILL_PIN) )
|
||||||
kill();
|
kill();
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONTROLLERFAN_PIN
|
#if CONTROLLERFAN_PIN > 0
|
||||||
controllerFan(); //Check if fan should be turned on to cool stepper drivers down
|
controllerFan(); //Check if fan should be turned on to cool stepper drivers down
|
||||||
#endif
|
#endif
|
||||||
#ifdef EXTRUDER_RUNOUT_PREVENT
|
#ifdef EXTRUDER_RUNOUT_PREVENT
|
||||||
|
|
|
@ -879,10 +879,6 @@ void st_init()
|
||||||
disable_e2();
|
disable_e2();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONTROLLERFAN_PIN
|
|
||||||
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// waveform generation = 0100 = CTC
|
// waveform generation = 0100 = CTC
|
||||||
TCCR1B &= ~(1<<WGM13);
|
TCCR1B &= ~(1<<WGM13);
|
||||||
TCCR1B |= (1<<WGM12);
|
TCCR1B |= (1<<WGM12);
|
||||||
|
|
|
@ -99,8 +99,9 @@ static volatile bool temp_meas_ready = false;
|
||||||
#ifdef FAN_SOFT_PWM
|
#ifdef FAN_SOFT_PWM
|
||||||
static unsigned char soft_pwm_fan;
|
static unsigned char soft_pwm_fan;
|
||||||
#endif
|
#endif
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN > 0 || EXTRUDER_1_AUTO_FAN_PIN > 0 || EXTRUDER_2_AUTO_FAN_PIN > 0
|
||||||
|
static unsigned long extruder_autofan_last_check;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if EXTRUDERS > 3
|
#if EXTRUDERS > 3
|
||||||
# error Unsupported number of extruders
|
# error Unsupported number of extruders
|
||||||
|
@ -306,6 +307,76 @@ int getHeaterPower(int heater) {
|
||||||
return soft_pwm[heater];
|
return soft_pwm[heater];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN > 0 || EXTRUDER_1_AUTO_FAN_PIN > 0 || EXTRUDER_2_AUTO_FAN_PIN > 0
|
||||||
|
|
||||||
|
#if FAN_PIN > 0
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
|
||||||
|
#error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN"
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
|
||||||
|
#error "You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN"
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
|
||||||
|
#error "You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void setExtruderAutoFanState(int pin, bool state)
|
||||||
|
{
|
||||||
|
unsigned char newFanSpeed = (state != 0) ? EXTRUDER_AUTO_FAN_SPEED : 0;
|
||||||
|
// this idiom allows both digital and PWM fan outputs (see M42 handling).
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
digitalWrite(pin, newFanSpeed);
|
||||||
|
analogWrite(pin, newFanSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkExtruderAutoFans()
|
||||||
|
{
|
||||||
|
uint8_t fanState = 0;
|
||||||
|
|
||||||
|
// which fan pins need to be turned on?
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN > 0
|
||||||
|
if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
||||||
|
fanState |= 1;
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_1_AUTO_FAN_PIN > 0
|
||||||
|
if (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
||||||
|
{
|
||||||
|
if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
||||||
|
fanState |= 1;
|
||||||
|
else
|
||||||
|
fanState |= 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_2_AUTO_FAN_PIN > 0
|
||||||
|
if (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
||||||
|
{
|
||||||
|
if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
||||||
|
fanState |= 1;
|
||||||
|
else if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN)
|
||||||
|
fanState |= 2;
|
||||||
|
else
|
||||||
|
fanState |= 4;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// update extruder auto fan states
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN > 0
|
||||||
|
setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, (fanState & 1) != 0);
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_1_AUTO_FAN_PIN > 0
|
||||||
|
if (EXTRUDER_1_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN)
|
||||||
|
setExtruderAutoFanState(EXTRUDER_1_AUTO_FAN_PIN, (fanState & 2) != 0);
|
||||||
|
#endif
|
||||||
|
#if EXTRUDER_2_AUTO_FAN_PIN > 0
|
||||||
|
if (EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN
|
||||||
|
&& EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN)
|
||||||
|
setExtruderAutoFanState(EXTRUDER_2_AUTO_FAN_PIN, (fanState & 4) != 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // any extruder auto fan pins set
|
||||||
|
|
||||||
void manage_heater()
|
void manage_heater()
|
||||||
{
|
{
|
||||||
float pid_input;
|
float pid_input;
|
||||||
|
@ -399,6 +470,13 @@ void manage_heater()
|
||||||
|
|
||||||
} // End extruder for loop
|
} // End extruder for loop
|
||||||
|
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN > 0 || EXTRUDER_1_AUTO_FAN_PIN > 0 || EXTRUDER_2_AUTO_FAN_PIN > 0
|
||||||
|
if(millis() - extruder_autofan_last_check > 2500) // only need to check fan state very infrequently
|
||||||
|
{
|
||||||
|
checkExtruderAutoFans();
|
||||||
|
extruder_autofan_last_check = millis();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef PIDTEMPBED
|
#ifndef PIDTEMPBED
|
||||||
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
||||||
|
|
12
README.md
12
README.md
|
@ -1,8 +1,11 @@
|
||||||
WARNING:
|
==========================
|
||||||
--------
|
Marlin 3D Printer Firmware
|
||||||
THIS IS RELEASE CANDIDATE 2 FOR MARLIN 1.0.0
|
==========================
|
||||||
|
|
||||||
The configuration is now split in two files
|
Notes:
|
||||||
|
-----
|
||||||
|
|
||||||
|
The configuration is now split in two files:
|
||||||
Configuration.h for the normal settings
|
Configuration.h for the normal settings
|
||||||
Configuration_adv.h for the advanced settings
|
Configuration_adv.h for the advanced settings
|
||||||
|
|
||||||
|
@ -46,6 +49,7 @@ Features:
|
||||||
* PID tuning
|
* PID tuning
|
||||||
* CoreXY kinematics (www.corexy.com/theory.html)
|
* CoreXY kinematics (www.corexy.com/theory.html)
|
||||||
* Configurable serial port to support connection of wireless adaptors.
|
* Configurable serial port to support connection of wireless adaptors.
|
||||||
|
* Automatic operation of extruder/cold-end cooling fans based on nozzle temperature
|
||||||
|
|
||||||
The default baudrate is 250000. This baudrate has less jitter and hence errors than the usual 115200 baud, but is less supported by drivers and host-environments.
|
The default baudrate is 250000. This baudrate has less jitter and hence errors than the usual 115200 baud, but is less supported by drivers and host-environments.
|
||||||
|
|
||||||
|
|
Reference in a new issue