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:
ErikZalm 2013-05-19 02:10:33 -07:00
commit b2eeebd9c3
6 changed files with 363 additions and 285 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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