Rework change to incorporate CONTROLLERFAN

Also refactor extruder auto fan logic to simplify further and now only
check every 2.5 seconds
This commit is contained in:
Robert F-C 2013-04-30 01:08:29 +10:00
parent c3cdaceab3
commit d5ad7a0814
3 changed files with 98 additions and 86 deletions

View File

@ -63,14 +63,16 @@
//This is for controlling a fan to cool down the stepper drivers
//it will turn on when any driver is enabled
//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_SEC 60 //How many seconds, after all motors were disabled, the fan should run
#define CONTROLLERFAN_PIN -1 //Pin used for the fan to cool controller (-1 to disable)
#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
// 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)
//#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
@ -81,6 +83,7 @@
#define EXTRUDER_AUTO_FAN_TEMPERATURE 50
#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed
//===========================================================================
//=============================Mechanical Settings===========================
//===========================================================================

View File

@ -374,13 +374,9 @@ void setup()
lcd_init();
#ifdef CONTROLLERFAN_PIN
#if CONTROLLERFAN_PIN > 0
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
#endif
#ifdef EXTRUDERFAN_PIN
SET_OUTPUT(EXTRUDERFAN_PIN); //Set pin used for extruder cooling fan
#endif
#endif
}
@ -1963,7 +1959,12 @@ void prepare_arc_move(char isclockwise) {
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 lastMotorCheck = 0;
@ -1985,34 +1986,16 @@ void controllerFan()
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
{
WRITE(CONTROLLERFAN_PIN, HIGH); //... turn the fan on
}
}
}
#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
// allows digital or PWM fan output to be used (see M42 handling)
digitalWrite(CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
analogWrite(CONTROLLERFAN_PIN, CONTROLLERFAN_SPEED);
}
}
}
@ -2036,11 +2019,11 @@ void manage_inactivity()
}
}
}
#if( KILL_PIN>-1 )
#if KILL_PIN > 0
if( 0 == READ(KILL_PIN) )
kill();
#endif
#ifdef CONTROLLERFAN_PIN
#if CONTROLLERFAN_PIN > 0
controllerFan(); //Check if fan should be turned on to cool stepper drivers down
#endif
#ifdef EXTRUDER_RUNOUT_PREVENT

View File

@ -99,8 +99,8 @@ static volatile bool temp_meas_ready = false;
#ifdef FAN_SOFT_PWM
static unsigned char soft_pwm_fan;
#endif
#if EXTRUDER_0_AUTO_FAN_PIN > -1 || EXTRUDER_1_AUTO_FAN_PIN > -1 || EXTRUDER_2_AUTO_FAN_PIN > -1
static uint8_t extruderAutoFanState = 0; // extruder auto fan state stored as bitmap
#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
@ -307,6 +307,73 @@ int getHeaterPower(int heater) {
return soft_pwm[heater];
}
#if EXTRUDER_0_AUTO_FAN_PIN > 0 || EXTRUDER_1_AUTO_FAN_PIN > 0 || EXTRUDER_2_AUTO_FAN_PIN > 0
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 EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
#error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN"
#endif
if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)
fanState |= 1;
#endif
#if EXTRUDER_1_AUTO_FAN_PIN > 0
#if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
#error "You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN"
#endif
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 EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
#error "You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN"
#endif
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()
{
float pid_input;
@ -399,56 +466,15 @@ void manage_heater()
#endif
} // End extruder for loop
#if EXTRUDER_0_AUTO_FAN_PIN > -1 || EXTRUDER_1_AUTO_FAN_PIN > -1 || EXTRUDER_2_AUTO_FAN_PIN > -1
bool newFanState;
#if EXTRUDER_0_AUTO_FAN_PIN > -1
// check the extruder 0 setting (and any ganged auto fan outputs)
newFanState = (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE ||
(EXTRUDER_0_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN && current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE) ||
(EXTRUDER_0_AUTO_FAN_PIN == EXTRUDER_2_AUTO_FAN_PIN && current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE));
if ((extruderAutoFanState & 1) != newFanState) // store state in first bit
{
int newFanSpeed = (newFanState ? EXTRUDER_AUTO_FAN_SPEED : 0);
if (EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN)
fanSpeed = newFanSpeed;
pinMode(EXTRUDER_0_AUTO_FAN_PIN, OUTPUT);
digitalWrite(EXTRUDER_0_AUTO_FAN_PIN, newFanSpeed);
analogWrite(EXTRUDER_0_AUTO_FAN_PIN, newFanSpeed);
extruderAutoFanState = newFanState | (extruderAutoFanState & ~1);
}
#endif //EXTRUDER_0_AUTO_FAN_PIN > -1
#if EXTRUDER_1_AUTO_FAN_PIN > -1 && EXTRUDER_1_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN
// check the extruder 1 setting (except when extruder 1 is the same as 0)
newFanState = (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE ||
(EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_2_AUTO_FAN_PIN && current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE));
if ((extruderAutoFanState & 2) != (newFanState<<1)) // use second bit
{
int newFanSpeed = (newFanState ? EXTRUDER_AUTO_FAN_SPEED : 0);
if (EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN)
fanSpeed = newFanSpeed;
pinMode(EXTRUDER_1_AUTO_FAN_PIN, OUTPUT);
digitalWrite(EXTRUDER_1_AUTO_FAN_PIN, newFanSpeed);
analogWrite(EXTRUDER_1_AUTO_FAN_PIN, newFanSpeed);
extruderAutoFanState = (newFanState<<1) | (extruderAutoFanState & ~2);
}
#endif //EXTRUDER_1_AUTO_FAN_PIN > -1
#if EXTRUDER_2_AUTO_FAN_PIN > -1 && EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN && EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN
// check the extruder 2 setting (except when extruder 2 is the same as 1 or 0)
newFanState = (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE);
if ((extruderAutoFanState & 4) != (newFanState<<2)) // use third bit
{
int newFanSpeed = (newFanState ? EXTRUDER_AUTO_FAN_SPEED : 0);
if (EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN)
fanSpeed = newFanSpeed;
pinMode(EXTRUDER_2_AUTO_FAN_PIN, OUTPUT);
digitalWrite(EXTRUDER_2_AUTO_FAN_PIN, newFanSpeed);
analogWrite(EXTRUDER_2_AUTO_FAN_PIN, newFanSpeed);
extruderAutoFanState = (newFanState<<2) | (extruderAutoFanState & ~4);
}
#endif //EXTRUDER_2_AUTO_FAN_PIN > -1
#endif // any AUTO_FAN_PIN enabled
#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
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
return;