Merge pull request #3086 from thinkyhead/rc_two_fans
Support for multiple PWM fans
This commit is contained in:
commit
09ef955191
|
@ -465,7 +465,9 @@
|
||||||
#define HAS_AUTO_FAN_2 (PIN_EXISTS(EXTRUDER_2_AUTO_FAN))
|
#define HAS_AUTO_FAN_2 (PIN_EXISTS(EXTRUDER_2_AUTO_FAN))
|
||||||
#define HAS_AUTO_FAN_3 (PIN_EXISTS(EXTRUDER_3_AUTO_FAN))
|
#define HAS_AUTO_FAN_3 (PIN_EXISTS(EXTRUDER_3_AUTO_FAN))
|
||||||
#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3)
|
#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3)
|
||||||
#define HAS_FAN (PIN_EXISTS(FAN))
|
#define HAS_FAN0 (PIN_EXISTS(FAN))
|
||||||
|
#define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLERFAN_PIN != FAN1_PIN && EXTRUDER_0_AUTO_FAN_PIN != FAN1_PIN && EXTRUDER_1_AUTO_FAN_PIN != FAN1_PIN && EXTRUDER_2_AUTO_FAN_PIN != FAN1_PIN)
|
||||||
|
#define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLERFAN_PIN != FAN2_PIN && EXTRUDER_0_AUTO_FAN_PIN != FAN2_PIN && EXTRUDER_1_AUTO_FAN_PIN != FAN2_PIN && EXTRUDER_2_AUTO_FAN_PIN != FAN2_PIN)
|
||||||
#define HAS_CONTROLLERFAN (PIN_EXISTS(CONTROLLERFAN))
|
#define HAS_CONTROLLERFAN (PIN_EXISTS(CONTROLLERFAN))
|
||||||
#define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0)
|
#define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0)
|
||||||
#define HAS_SERVO_0 (PIN_EXISTS(SERVO0))
|
#define HAS_SERVO_0 (PIN_EXISTS(SERVO0))
|
||||||
|
@ -550,10 +552,32 @@
|
||||||
#if HAS_HEATER_BED
|
#if HAS_HEATER_BED
|
||||||
#define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v)
|
#define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v)
|
||||||
#endif
|
#endif
|
||||||
#if HAS_FAN
|
|
||||||
#define WRITE_FAN(v) WRITE(FAN_PIN, v)
|
/**
|
||||||
|
* Up to 3 PWM fans
|
||||||
|
*/
|
||||||
|
#if HAS_FAN2
|
||||||
|
#define FAN_COUNT 3
|
||||||
|
#elif HAS_FAN1
|
||||||
|
#define FAN_COUNT 2
|
||||||
|
#elif HAS_FAN0
|
||||||
|
#define FAN_COUNT 1
|
||||||
|
#else
|
||||||
|
#define FAN_COUNT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_FAN0
|
||||||
|
#define WRITE_FAN(v) WRITE(FAN_PIN, v)
|
||||||
|
#define WRITE_FAN0(v) WRITE_FAN(v)
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
#define WRITE_FAN1(v) WRITE(FAN1_PIN, v)
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
#define WRITE_FAN2(v) WRITE(FAN2_PIN, v)
|
||||||
|
#endif
|
||||||
|
#define WRITE_FAN_N(n, v) WRITE_FAN##n(v)
|
||||||
|
|
||||||
#define HAS_BUZZER (PIN_EXISTS(BEEPER) || defined(LCD_USE_I2C_BUZZER))
|
#define HAS_BUZZER (PIN_EXISTS(BEEPER) || defined(LCD_USE_I2C_BUZZER))
|
||||||
|
|
||||||
#if defined(NUM_SERVOS) && NUM_SERVOS > 0
|
#if defined(NUM_SERVOS) && NUM_SERVOS > 0
|
||||||
|
|
|
@ -306,17 +306,15 @@ extern bool axis_homed[3]; // axis[n].is_homed
|
||||||
extern float extrude_min_temp;
|
extern float extrude_min_temp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int fanSpeed;
|
#if FAN_COUNT > 0
|
||||||
|
extern int fanSpeeds[FAN_COUNT];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
extern int ValvePressure;
|
extern int ValvePressure;
|
||||||
extern int EtoPPressure;
|
extern int EtoPPressure;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
|
||||||
extern unsigned char fanSpeedSoftPwm;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(FILAMENT_SENSOR)
|
#if ENABLED(FILAMENT_SENSOR)
|
||||||
extern float filament_width_nominal; //holds the theoretical filament diameter i.e., 3.00 or 1.75
|
extern float filament_width_nominal; //holds the theoretical filament diameter i.e., 3.00 or 1.75
|
||||||
extern bool filament_sensor; //indicates that filament sensor readings should control extrusion
|
extern bool filament_sensor; //indicates that filament sensor readings should control extrusion
|
||||||
|
|
|
@ -267,8 +267,11 @@ float home_offset[3] = { 0 };
|
||||||
float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
|
float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
|
||||||
float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
|
float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
|
||||||
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
int fanSpeeds[FAN_COUNT] = { 0 };
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t active_extruder = 0;
|
uint8_t active_extruder = 0;
|
||||||
int fanSpeed = 0;
|
|
||||||
bool cancel_heatup = false;
|
bool cancel_heatup = false;
|
||||||
|
|
||||||
const char errormagic[] PROGMEM = "Error:";
|
const char errormagic[] PROGMEM = "Error:";
|
||||||
|
@ -3581,31 +3584,39 @@ inline void gcode_M31() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M42: Change pin status via GCode
|
* M42: Change pin status via GCode
|
||||||
|
*
|
||||||
|
* P<pin> Pin number (LED if omitted)
|
||||||
|
* S<byte> Pin status from 0 - 255
|
||||||
*/
|
*/
|
||||||
inline void gcode_M42() {
|
inline void gcode_M42() {
|
||||||
if (code_seen('S')) {
|
if (code_seen('S')) {
|
||||||
int pin_status = code_value_short(),
|
int pin_status = code_value_short();
|
||||||
pin_number = LED_PIN;
|
if (pin_status < 0 || pin_status > 255) return;
|
||||||
|
|
||||||
if (code_seen('P') && pin_status >= 0 && pin_status <= 255)
|
int pin_number = code_seen('P') ? code_value_short() : LED_PIN;
|
||||||
pin_number = code_value_short();
|
if (pin_number < 0) return;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) {
|
for (uint8_t i = 0; i < COUNT(sensitive_pins); i++)
|
||||||
if (sensitive_pins[i] == pin_number) {
|
if (pin_number == sensitive_pins[i]) return;
|
||||||
pin_number = -1;
|
|
||||||
break;
|
pinMode(pin_number, OUTPUT);
|
||||||
|
digitalWrite(pin_number, pin_status);
|
||||||
|
analogWrite(pin_number, pin_status);
|
||||||
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
switch (pin_number) {
|
||||||
|
#if HAS_FAN0
|
||||||
|
case FAN_PIN: fanSpeeds[0] = pin_status; break;
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
case FAN1_PIN: fanSpeeds[1] = pin_status; break;
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
case FAN2_PIN: fanSpeeds[2] = pin_status; break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#if HAS_FAN
|
|
||||||
if (pin_number == FAN_PIN) fanSpeed = pin_status;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pin_number > -1) {
|
|
||||||
pinMode(pin_number, OUTPUT);
|
|
||||||
digitalWrite(pin_number, pin_status);
|
|
||||||
analogWrite(pin_number, pin_status);
|
|
||||||
}
|
|
||||||
} // code_seen('S')
|
} // code_seen('S')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3968,19 +3979,30 @@ inline void gcode_M105() {
|
||||||
SERIAL_EOL;
|
SERIAL_EOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAS_FAN
|
#if FAN_COUNT > 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M106: Set Fan Speed
|
* M106: Set Fan Speed
|
||||||
|
*
|
||||||
|
* S<int> Speed between 0-255
|
||||||
|
* P<index> Fan index, if more than one fan
|
||||||
*/
|
*/
|
||||||
inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value_short(), 0, 255) : 255; }
|
inline void gcode_M106() {
|
||||||
|
uint16_t s = code_seen('S') ? code_value_short() : 255,
|
||||||
|
p = code_seen('P') ? code_value_short() : 0;
|
||||||
|
NOMORE(s, 255);
|
||||||
|
if (p < FAN_COUNT) fanSpeeds[p] = s;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M107: Fan Off
|
* M107: Fan Off
|
||||||
*/
|
*/
|
||||||
inline void gcode_M107() { fanSpeed = 0; }
|
inline void gcode_M107() {
|
||||||
|
uint16_t p = code_seen('P') ? code_value_short() : 0;
|
||||||
|
if (p < FAN_COUNT) fanSpeeds[p] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // HAS_FAN
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating.
|
* M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating.
|
||||||
|
@ -4047,7 +4069,7 @@ inline void gcode_M109() {
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
SERIAL_EOL;
|
SERIAL_EOL;
|
||||||
#endif //TEMP_RESIDENCY_TIME
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
idle();
|
idle();
|
||||||
|
@ -4261,7 +4283,13 @@ inline void gcode_M140() {
|
||||||
inline void gcode_M81() {
|
inline void gcode_M81() {
|
||||||
disable_all_heaters();
|
disable_all_heaters();
|
||||||
finishAndDisableSteppers();
|
finishAndDisableSteppers();
|
||||||
fanSpeed = 0;
|
#if FAN_COUNT > 0
|
||||||
|
#if FAN_COUNT > 1
|
||||||
|
for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0;
|
||||||
|
#else
|
||||||
|
fanSpeeds[0] = 0;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
delay(1000); // Wait 1 second before switching off
|
delay(1000); // Wait 1 second before switching off
|
||||||
#if HAS_SUICIDE
|
#if HAS_SUICIDE
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
@ -6015,14 +6043,14 @@ void process_next_command() {
|
||||||
break;
|
break;
|
||||||
#endif // HAS_TEMP_BED
|
#endif // HAS_TEMP_BED
|
||||||
|
|
||||||
#if HAS_FAN
|
#if FAN_COUNT > 0
|
||||||
case 106: // M106: Fan On
|
case 106: // M106: Fan On
|
||||||
gcode_M106();
|
gcode_M106();
|
||||||
break;
|
break;
|
||||||
case 107: // M107: Fan Off
|
case 107: // M107: Fan Off
|
||||||
gcode_M107();
|
gcode_M107();
|
||||||
break;
|
break;
|
||||||
#endif // HAS_FAN
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
// PWM for HEATER_1_PIN
|
// PWM for HEATER_1_PIN
|
||||||
|
|
|
@ -264,22 +264,36 @@
|
||||||
/**
|
/**
|
||||||
* Make sure auto fan pins don't conflict with the fan pin
|
* Make sure auto fan pins don't conflict with the fan pin
|
||||||
*/
|
*/
|
||||||
#if HAS_AUTO_FAN && HAS_FAN
|
#if HAS_AUTO_FAN
|
||||||
#if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
|
#if HAS_FAN0
|
||||||
#error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN.
|
#if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
|
||||||
#elif EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
|
#error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN.
|
||||||
#error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN.
|
#elif EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
|
||||||
#elif EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
|
#error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN.
|
||||||
#error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN.
|
#elif EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
|
||||||
#elif EXTRUDER_3_AUTO_FAN_PIN == FAN_PIN
|
#error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN.
|
||||||
#error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to FAN_PIN.
|
#elif EXTRUDER_3_AUTO_FAN_PIN == FAN_PIN
|
||||||
|
#error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to FAN_PIN.
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_FAN && CONTROLLERFAN_PIN == FAN_PIN
|
#if HAS_FAN0 && CONTROLLERFAN_PIN == FAN_PIN
|
||||||
#error You cannot set CONTROLLERFAN_PIN equal to FAN_PIN.
|
#error You cannot set CONTROLLERFAN_PIN equal to FAN_PIN.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_CONTROLLERFAN
|
||||||
|
#if EXTRUDER_0_AUTO_FAN_PIN == CONTROLLERFAN_PIN
|
||||||
|
#error You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN.
|
||||||
|
#elif EXTRUDER_1_AUTO_FAN_PIN == CONTROLLERFAN_PIN
|
||||||
|
#error You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN.
|
||||||
|
#elif EXTRUDER_2_AUTO_FAN_PIN == CONTROLLERFAN_PIN
|
||||||
|
#error You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN.
|
||||||
|
#elif EXTRUDER_3_AUTO_FAN_PIN == CONTROLLERFAN_PIN
|
||||||
|
#error You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to CONTROLLERFAN_PIN.
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set.
|
* Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -283,7 +283,7 @@ static void lcd_implementation_status_screen() {
|
||||||
u8g.setColorIndex(1); // black on white
|
u8g.setColorIndex(1); // black on white
|
||||||
|
|
||||||
// Symbols menu graphics, animated fan
|
// Symbols menu graphics, animated fan
|
||||||
u8g.drawBitmapP(9,1,STATUS_SCREENBYTEWIDTH,STATUS_SCREENHEIGHT, (blink % 2) && fanSpeed ? status_screen0_bmp : status_screen1_bmp);
|
u8g.drawBitmapP(9,1,STATUS_SCREENBYTEWIDTH,STATUS_SCREENHEIGHT, (blink % 2) && fanSpeeds[0] ? status_screen0_bmp : status_screen1_bmp);
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
// SD Card Symbol
|
// SD Card Symbol
|
||||||
|
@ -324,8 +324,8 @@ static void lcd_implementation_status_screen() {
|
||||||
// Fan
|
// Fan
|
||||||
lcd_setFont(FONT_STATUSMENU);
|
lcd_setFont(FONT_STATUSMENU);
|
||||||
u8g.setPrintPos(104, 27);
|
u8g.setPrintPos(104, 27);
|
||||||
#if HAS_FAN
|
#if HAS_FAN0
|
||||||
int per = ((fanSpeed + 1) * 100) / 256;
|
int per = ((fanSpeeds[0] + 1) * 100) / 256;
|
||||||
if (per) {
|
if (per) {
|
||||||
lcd_print(itostr3(per));
|
lcd_print(itostr3(per));
|
||||||
lcd_print('%');
|
lcd_print('%');
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
#define FAN1_PIN 35
|
#define FAN1_PIN 35
|
||||||
#define FAN2_PIN 36
|
#define FAN2_PIN 36
|
||||||
#define FAN_SOFT_PWM
|
#define FAN_SOFT_PWM
|
||||||
#define CONTROLLERFAN_PIN 36
|
#define CONTROLLERFAN_PIN FAN2_PIN
|
||||||
#define PS_ON_PIN -1
|
#define PS_ON_PIN -1
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,10 @@ unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
||||||
bool autotemp_enabled = false;
|
bool autotemp_enabled = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
|
extern unsigned char fanSpeedSoftPwm[FAN_COUNT];
|
||||||
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============ semi-private variables, used in inline functions =============
|
//============ semi-private variables, used in inline functions =============
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -399,7 +403,12 @@ void plan_init() {
|
||||||
|
|
||||||
void check_axes_activity() {
|
void check_axes_activity() {
|
||||||
unsigned char axis_active[NUM_AXIS] = { 0 },
|
unsigned char axis_active[NUM_AXIS] = { 0 },
|
||||||
tail_fan_speed = fanSpeed;
|
tail_fan_speed[FAN_COUNT];
|
||||||
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = fanSpeeds[i];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
unsigned char tail_valve_pressure = ValvePressure,
|
unsigned char tail_valve_pressure = ValvePressure,
|
||||||
tail_e_to_p_pressure = EtoPPressure;
|
tail_e_to_p_pressure = EtoPPressure;
|
||||||
|
@ -408,13 +417,19 @@ void check_axes_activity() {
|
||||||
block_t* block;
|
block_t* block;
|
||||||
|
|
||||||
if (blocks_queued()) {
|
if (blocks_queued()) {
|
||||||
|
|
||||||
uint8_t block_index = block_buffer_tail;
|
uint8_t block_index = block_buffer_tail;
|
||||||
tail_fan_speed = block_buffer[block_index].fan_speed;
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = block_buffer[block_index].fan_speed[i];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
block = &block_buffer[block_index];
|
block = &block_buffer[block_index];
|
||||||
tail_valve_pressure = block->valve_pressure;
|
tail_valve_pressure = block->valve_pressure;
|
||||||
tail_e_to_p_pressure = block->e_to_p_pressure;
|
tail_e_to_p_pressure = block->e_to_p_pressure;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (block_index != block_buffer_head) {
|
while (block_index != block_buffer_head) {
|
||||||
block = &block_buffer[block_index];
|
block = &block_buffer[block_index];
|
||||||
for (int i = 0; i < NUM_AXIS; i++) if (block->steps[i]) axis_active[i]++;
|
for (int i = 0; i < NUM_AXIS; i++) if (block->steps[i]) axis_active[i]++;
|
||||||
|
@ -439,32 +454,65 @@ void check_axes_activity() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_FAN
|
#if FAN_COUNT > 0
|
||||||
#ifdef FAN_KICKSTART_TIME
|
|
||||||
static millis_t fan_kick_end = 0;
|
|
||||||
if (tail_fan_speed) {
|
|
||||||
millis_t ms = millis();
|
|
||||||
if (fan_kick_end == 0) {
|
|
||||||
fan_kick_end = ms + FAN_KICKSTART_TIME;
|
|
||||||
tail_fan_speed = 255; // Starting up.
|
|
||||||
}
|
|
||||||
else if (ms < fan_kick_end)
|
|
||||||
tail_fan_speed = 255; // Still spinning up.
|
|
||||||
else
|
|
||||||
fan_kick_end = 0;
|
|
||||||
}
|
|
||||||
#endif //FAN_KICKSTART_TIME
|
|
||||||
#if defined(FAN_MIN_PWM)
|
#if defined(FAN_MIN_PWM)
|
||||||
#define CALC_FAN_SPEED (tail_fan_speed ? ( FAN_MIN_PWM + (tail_fan_speed * (255 - (FAN_MIN_PWM))) / 255 ) : 0)
|
#define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? ( FAN_MIN_PWM + (tail_fan_speed[f] * (255 - FAN_MIN_PWM)) / 255 ) : 0)
|
||||||
#else
|
#else
|
||||||
#define CALC_FAN_SPEED tail_fan_speed
|
#define CALC_FAN_SPEED(f) tail_fan_speed[f]
|
||||||
#endif // FAN_MIN_PWM
|
#endif
|
||||||
|
|
||||||
|
#ifdef FAN_KICKSTART_TIME
|
||||||
|
|
||||||
|
static millis_t fan_kick_end[FAN_COUNT] = { 0 }, ms = millis();
|
||||||
|
|
||||||
|
#define KICKSTART_FAN(f) \
|
||||||
|
if (tail_fan_speed[f]) { \
|
||||||
|
if (fan_kick_end[f] == 0) { \
|
||||||
|
fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \
|
||||||
|
tail_fan_speed[f] = 255; \
|
||||||
|
} \
|
||||||
|
else if (fan_kick_end[f] > ms) \
|
||||||
|
tail_fan_speed[f] = 255; \
|
||||||
|
else \
|
||||||
|
fan_kick_end[f] = 0; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAS_FAN0
|
||||||
|
KICKSTART_FAN(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
KICKSTART_FAN(1);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
KICKSTART_FAN(2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //FAN_KICKSTART_TIME
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
fanSpeedSoftPwm = CALC_FAN_SPEED;
|
#if HAS_FAN0
|
||||||
|
fanSpeedSoftPwm[0] = CALC_FAN_SPEED(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
fanSpeedSoftPwm[1] = CALC_FAN_SPEED(1);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
fanSpeedSoftPwm[2] = CALC_FAN_SPEED(2);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
analogWrite(FAN_PIN, CALC_FAN_SPEED);
|
#if HAS_FAN0
|
||||||
#endif // FAN_SOFT_PWM
|
analogWrite(FAN_PIN, CALC_FAN_SPEED(0));
|
||||||
#endif // HAS_FAN
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
analogWrite(FAN1_PIN, CALC_FAN_SPEED(1));
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
analogWrite(FAN2_PIN, CALC_FAN_SPEED(2));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
#if ENABLED(AUTOTEMP)
|
#if ENABLED(AUTOTEMP)
|
||||||
getHighESpeed();
|
getHighESpeed();
|
||||||
|
@ -576,7 +624,10 @@ float junction_deviation = 0.1;
|
||||||
// Bail if this is a zero-length block
|
// Bail if this is a zero-length block
|
||||||
if (block->step_event_count <= dropsegments) return;
|
if (block->step_event_count <= dropsegments) return;
|
||||||
|
|
||||||
block->fan_speed = fanSpeed;
|
#if FAN_COUNT > 0
|
||||||
|
for (uint8_t i = 0; i < FAN_COUNT; i++) block->fan_speed[i] = fanSpeeds[i];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
block->valve_pressure = ValvePressure;
|
block->valve_pressure = ValvePressure;
|
||||||
block->e_to_p_pressure = EtoPPressure;
|
block->e_to_p_pressure = EtoPPressure;
|
||||||
|
|
|
@ -59,12 +59,18 @@ typedef struct {
|
||||||
unsigned long initial_rate; // The jerk-adjusted step rate at start of block
|
unsigned long initial_rate; // The jerk-adjusted step rate at start of block
|
||||||
unsigned long final_rate; // The minimal rate at exit
|
unsigned long final_rate; // The minimal rate at exit
|
||||||
unsigned long acceleration_st; // acceleration steps/sec^2
|
unsigned long acceleration_st; // acceleration steps/sec^2
|
||||||
unsigned long fan_speed;
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
unsigned long fan_speed[FAN_COUNT];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
#if ENABLED(BARICUDA)
|
||||||
unsigned long valve_pressure;
|
unsigned long valve_pressure;
|
||||||
unsigned long e_to_p_pressure;
|
unsigned long e_to_p_pressure;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
volatile char busy;
|
volatile char busy;
|
||||||
|
|
||||||
} block_t;
|
} block_t;
|
||||||
|
|
||||||
#define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1))
|
#define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1))
|
||||||
|
|
|
@ -62,7 +62,7 @@ float current_temperature_bed = 0.0;
|
||||||
#endif //PIDTEMPBED
|
#endif //PIDTEMPBED
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
unsigned char fanSpeedSoftPwm;
|
unsigned char fanSpeedSoftPwm[FAN_COUNT];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char soft_pwm_bed;
|
unsigned char soft_pwm_bed;
|
||||||
|
@ -130,7 +130,7 @@ static volatile bool temp_meas_ready = false;
|
||||||
static unsigned char soft_pwm[EXTRUDERS];
|
static unsigned char soft_pwm[EXTRUDERS];
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
static unsigned char soft_pwm_fan;
|
static unsigned char soft_pwm_fan[FAN_COUNT];
|
||||||
#endif
|
#endif
|
||||||
#if HAS_AUTO_FAN
|
#if HAS_AUTO_FAN
|
||||||
static millis_t next_auto_fan_check_ms;
|
static millis_t next_auto_fan_check_ms;
|
||||||
|
@ -886,17 +886,40 @@ void tp_init() {
|
||||||
#if HAS_HEATER_BED
|
#if HAS_HEATER_BED
|
||||||
SET_OUTPUT(HEATER_BED_PIN);
|
SET_OUTPUT(HEATER_BED_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_FAN
|
|
||||||
#if ENABLED(FAST_PWM_FAN) || ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAST_PWM_FAN) || ENABLED(FAN_SOFT_PWM)
|
||||||
|
|
||||||
|
#if HAS_FAN0
|
||||||
SET_OUTPUT(FAN_PIN);
|
SET_OUTPUT(FAN_PIN);
|
||||||
#if ENABLED(FAST_PWM_FAN)
|
#if ENABLED(FAST_PWM_FAN)
|
||||||
setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
soft_pwm_fan = fanSpeedSoftPwm / 2;
|
soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
#if HAS_FAN1
|
||||||
|
SET_OUTPUT(FAN1_PIN);
|
||||||
|
#if ENABLED(FAST_PWM_FAN)
|
||||||
|
setPwmFrequency(FAN1_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
||||||
|
#endif
|
||||||
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
|
soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_FAN2
|
||||||
|
SET_OUTPUT(FAN2_PIN);
|
||||||
|
#if ENABLED(FAST_PWM_FAN)
|
||||||
|
setPwmFrequency(FAN2_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
||||||
|
#endif
|
||||||
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
|
soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // FAST_PWM_FAN || FAN_SOFT_PWM
|
||||||
|
|
||||||
#if ENABLED(HEATER_0_USES_MAX6675)
|
#if ENABLED(HEATER_0_USES_MAX6675)
|
||||||
|
|
||||||
|
@ -1320,9 +1343,20 @@ ISR(TIMER0_COMPB_vect) {
|
||||||
soft_pwm_BED = soft_pwm_bed;
|
soft_pwm_BED = soft_pwm_bed;
|
||||||
WRITE_HEATER_BED(soft_pwm_BED > 0 ? 1 : 0);
|
WRITE_HEATER_BED(soft_pwm_BED > 0 ? 1 : 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
soft_pwm_fan = fanSpeedSoftPwm / 2;
|
#if HAS_FAN0
|
||||||
WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0);
|
soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2;
|
||||||
|
WRITE_FAN(soft_pwm_fan[0] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2;
|
||||||
|
WRITE_FAN1(soft_pwm_fan[1] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2;
|
||||||
|
WRITE_FAN2(soft_pwm_fan[2] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1342,7 +1376,15 @@ ISR(TIMER0_COMPB_vect) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
if (soft_pwm_fan < pwm_count) WRITE_FAN(0);
|
#if HAS_FAN0
|
||||||
|
if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pwm_count += _BV(SOFT_PWM_SCALE);
|
pwm_count += _BV(SOFT_PWM_SCALE);
|
||||||
|
@ -1421,10 +1463,28 @@ ISR(TIMER0_COMPB_vect) {
|
||||||
|
|
||||||
#if ENABLED(FAN_SOFT_PWM)
|
#if ENABLED(FAN_SOFT_PWM)
|
||||||
if (pwm_count == 0) {
|
if (pwm_count == 0) {
|
||||||
soft_pwm_fan = fanSpeedSoftPwm / 2;
|
#if HAS_FAN0
|
||||||
WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0);
|
soft_pwm_fan[0] = fanSpeedSoftPwm[0] / 2;
|
||||||
|
WRITE_FAN(soft_pwm_fan[0] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
soft_pwm_fan[1] = fanSpeedSoftPwm[1] / 2;
|
||||||
|
WRITE_FAN1(soft_pwm_fan[1] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
soft_pwm_fan[2] = fanSpeedSoftPwm[2] / 2;
|
||||||
|
WRITE_FAN2(soft_pwm_fan[2] > 0 ? 1 : 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (soft_pwm_fan < pwm_count) WRITE_FAN(0);
|
#if HAS_FAN0
|
||||||
|
if (soft_pwm_fan[0] < pwm_count) WRITE_FAN(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
if (soft_pwm_fan[1] < pwm_count) WRITE_FAN1(0);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
if (soft_pwm_fan[2] < pwm_count) WRITE_FAN2(0);
|
||||||
|
#endif
|
||||||
#endif //FAN_SOFT_PWM
|
#endif //FAN_SOFT_PWM
|
||||||
|
|
||||||
pwm_count += _BV(SOFT_PWM_SCALE);
|
pwm_count += _BV(SOFT_PWM_SCALE);
|
||||||
|
|
|
@ -614,7 +614,22 @@ static void lcd_tune_menu() {
|
||||||
//
|
//
|
||||||
// Fan Speed:
|
// Fan Speed:
|
||||||
//
|
//
|
||||||
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);
|
#if FAN_COUNT > 0
|
||||||
|
#if HAS_FAN0
|
||||||
|
#if FAN_COUNT > 1
|
||||||
|
#define MSG_1ST_FAN_SPEED MSG_FAN_SPEED " 1"
|
||||||
|
#else
|
||||||
|
#define MSG_1ST_FAN_SPEED MSG_FAN_SPEED
|
||||||
|
#endif
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_1ST_FAN_SPEED, &fanSpeeds[0], 0, 255);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255);
|
||||||
|
#endif
|
||||||
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
//
|
//
|
||||||
// Flow:
|
// Flow:
|
||||||
|
@ -665,7 +680,13 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
|
||||||
#if TEMP_SENSOR_BED != 0
|
#if TEMP_SENSOR_BED != 0
|
||||||
setTargetBed(tempb);
|
setTargetBed(tempb);
|
||||||
#endif
|
#endif
|
||||||
fanSpeed = fan;
|
#if FAN_COUNT > 0
|
||||||
|
#if FAN_COUNT > 1
|
||||||
|
fanSpeeds[active_extruder < FAN_COUNT ? active_extruder : 0] = fan;
|
||||||
|
#else
|
||||||
|
fanSpeeds[0] = fan;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,8 +776,10 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
|
||||||
#endif // TEMP_SENSOR_0 && (TEMP_SENSOR_1 || TEMP_SENSOR_2 || TEMP_SENSOR_3 || TEMP_SENSOR_BED)
|
#endif // TEMP_SENSOR_0 && (TEMP_SENSOR_1 || TEMP_SENSOR_2 || TEMP_SENSOR_3 || TEMP_SENSOR_BED)
|
||||||
|
|
||||||
void lcd_cooldown() {
|
void lcd_cooldown() {
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0;
|
||||||
|
#endif
|
||||||
disable_all_heaters();
|
disable_all_heaters();
|
||||||
fanSpeed = 0;
|
|
||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1125,7 +1148,22 @@ static void lcd_control_temperature_menu() {
|
||||||
//
|
//
|
||||||
// Fan Speed:
|
// Fan Speed:
|
||||||
//
|
//
|
||||||
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);
|
#if FAN_COUNT > 0
|
||||||
|
#if HAS_FAN0
|
||||||
|
#if FAN_COUNT > 1
|
||||||
|
#define MSG_1ST_FAN_SPEED MSG_FAN_SPEED " 1"
|
||||||
|
#else
|
||||||
|
#define MSG_1ST_FAN_SPEED MSG_FAN_SPEED
|
||||||
|
#endif
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_1ST_FAN_SPEED, &fanSpeeds[0], 0, 255);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255);
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255);
|
||||||
|
#endif
|
||||||
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
//
|
//
|
||||||
// Autotemp, Min, Max, Fact
|
// Autotemp, Min, Max, Fact
|
||||||
|
|
|
@ -873,16 +873,34 @@ void lcd_implementation_drawedit(const char* pstr, char* value) {
|
||||||
// Set the LEDS - referred to as backlights by the LiquidTWI2 library
|
// Set the LEDS - referred to as backlights by the LiquidTWI2 library
|
||||||
static uint8_t ledsprev = 0;
|
static uint8_t ledsprev = 0;
|
||||||
uint8_t leds = 0;
|
uint8_t leds = 0;
|
||||||
|
|
||||||
if (target_temperature_bed > 0) leds |= LED_A;
|
if (target_temperature_bed > 0) leds |= LED_A;
|
||||||
|
|
||||||
if (target_temperature[0] > 0) leds |= LED_B;
|
if (target_temperature[0] > 0) leds |= LED_B;
|
||||||
if (fanSpeed) leds |= LED_C;
|
|
||||||
|
#if FAN_COUNT > 0
|
||||||
|
if (0
|
||||||
|
#if HAS_FAN0
|
||||||
|
|| fanSpeeds[0]
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN1
|
||||||
|
|| fanSpeeds[1]
|
||||||
|
#endif
|
||||||
|
#if HAS_FAN2
|
||||||
|
|| fanSpeeds[2]
|
||||||
|
#endif
|
||||||
|
) leds |= LED_C;
|
||||||
|
#endif // FAN_COUNT > 0
|
||||||
|
|
||||||
#if EXTRUDERS > 1
|
#if EXTRUDERS > 1
|
||||||
if (target_temperature[1] > 0) leds |= LED_C;
|
if (target_temperature[1] > 0) leds |= LED_C;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (leds != ledsprev) {
|
if (leds != ledsprev) {
|
||||||
lcd.setBacklight(leds);
|
lcd.setBacklight(leds);
|
||||||
ledsprev = leds;
|
ledsprev = leds;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // LCD_HAS_STATUS_INDICATORS
|
#endif // LCD_HAS_STATUS_INDICATORS
|
||||||
|
|
Loading…
Reference in a new issue