From aac7aa3bf076cf8eb0b4d077748d061da86eb82d Mon Sep 17 00:00:00 2001 From: Erik van der Zalm Date: Sun, 4 Mar 2012 13:05:26 +0100 Subject: [PATCH] Queued fan control. Issue #90 --- Marlin/Marlin.h | 1 + Marlin/Marlin.pde | 14 ++++---------- Marlin/planner.cpp | 13 +++++++++++++ Marlin/planner.h | 1 + Marlin/stepper.cpp | 6 ++---- Marlin/ultralcd.pde | 16 ++++++++-------- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index e01d98ad50..919287260b 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -175,6 +175,7 @@ extern float homing_feedrate[]; extern bool axis_relative_modes[]; extern float current_position[NUM_AXIS] ; extern float add_homeing[3]; +extern unsigned char FanSpeed; // Handling multiple extruders pins extern uint8_t active_extruder; diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde index 4b9d06c6ad..e28acdec97 100644 --- a/Marlin/Marlin.pde +++ b/Marlin/Marlin.pde @@ -131,6 +131,7 @@ volatile int extrudemultiply=100; //100->1 200->2 float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 }; float add_homeing[3]={0,0,0}; uint8_t active_extruder = 0; +unsigned char FanSpeed=0; //=========================================================================== //=============================private variables============================= @@ -145,8 +146,6 @@ static long gcode_N, gcode_LastN; static bool relative_mode = false; //Determines Absolute or Relative Coordinates static bool relative_mode_e = false; //Determines Absolute or Relative E Codes while in Absolute Coordinates mode. E is always relative in Relative Coordinates mode. -static uint8_t fanpwm=0; - static char cmdbuffer[BUFSIZE][MAX_CMD_SIZE]; static bool fromsd[BUFSIZE]; static int bufindr = 0; @@ -938,19 +937,14 @@ void process_commands() #if FAN_PIN > -1 case 106: //M106 Fan On if (code_seen('S')){ - WRITE(FAN_PIN,HIGH); - fanpwm=constrain(code_value(),0,255); - analogWrite(FAN_PIN, fanpwm); + FanSpeed=constrain(code_value(),0,255); } else { - WRITE(FAN_PIN,HIGH); - fanpwm=255; - analogWrite(FAN_PIN, fanpwm); + FanSpeed=255; } break; case 107: //M107 Fan Off - WRITE(FAN_PIN,LOW); - analogWrite(FAN_PIN, 0); + FanSpeed = 0; break; #endif //FAN_PIN diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 7b85f81459..5972dafea5 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -418,23 +418,34 @@ void check_axes_activity() { unsigned char y_active = 0; unsigned char z_active = 0; unsigned char e_active = 0; + unsigned char fan_speed = 0; + unsigned char tail_fan_speed = 0; block_t *block; if(block_buffer_tail != block_buffer_head) { uint8_t block_index = block_buffer_tail; + tail_fan_speed = block_buffer[block_index].fan_speed; while(block_index != block_buffer_head) { block = &block_buffer[block_index]; if(block->steps_x != 0) x_active++; if(block->steps_y != 0) y_active++; if(block->steps_z != 0) z_active++; if(block->steps_e != 0) e_active++; + if(block->fan_speed != 0) fan_speed++; block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); } } + else { + if (FanSpeed != 0) analogWrite(FAN_PIN,FanSpeed); // If buffer is empty use current fan speed + } if((DISABLE_X) && (x_active == 0)) disable_x(); if((DISABLE_Y) && (y_active == 0)) disable_y(); if((DISABLE_Z) && (z_active == 0)) disable_z(); if((DISABLE_E) && (e_active == 0)) { disable_e0();disable_e1();disable_e2(); } + if((FanSpeed == 0) && (fan_speed ==0)) analogWrite(FAN_PIN, 0); + if (FanSpeed != 0 && tail_fan_speed !=0) { + analogWrite(FAN_PIN,tail_fan_speed); + } } @@ -498,6 +509,8 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa // Bail if this is a zero-length block if (block->step_event_count <=dropsegments) { return; }; + block->fan_speed = FanSpeed; + // Compute direction bits for this block block->direction_bits = 0; if (target[X_AXIS] < position[X_AXIS]) { block->direction_bits |= (1<steps_z > 0) { enable_z(); diff --git a/Marlin/ultralcd.pde b/Marlin/ultralcd.pde index 27b8674972..afb6908a16 100644 --- a/Marlin/ultralcd.pde +++ b/Marlin/ultralcd.pde @@ -812,7 +812,7 @@ void MainMenu::showTune() if(force_lcd_update) { lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED); - lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm)); + lcd.setCursor(13,line);lcd.print(ftostr3(FanSpeed)); } if((activeline!=line) ) @@ -823,7 +823,7 @@ void MainMenu::showTune() linechanging=!linechanging; if(linechanging) { - encoderpos=fanpwm; + encoderpos=FanSpeed; } else { @@ -836,8 +836,8 @@ void MainMenu::showTune() { if(encoderpos<0) encoderpos=0; if(encoderpos>255) encoderpos=255; - fanpwm=encoderpos; - analogWrite(FAN_PIN, fanpwm); + FanSpeed=encoderpos; + analogWrite(FAN_PIN, FanSpeed); lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); } @@ -1134,7 +1134,7 @@ void MainMenu::showControlTemp() if(force_lcd_update) { lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED); - lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm)); + lcd.setCursor(13,line);lcd.print(ftostr3(FanSpeed)); } if((activeline!=line) ) @@ -1145,7 +1145,7 @@ void MainMenu::showControlTemp() linechanging=!linechanging; if(linechanging) { - encoderpos=fanpwm; + encoderpos=FanSpeed; } else { @@ -1158,8 +1158,8 @@ void MainMenu::showControlTemp() { if(encoderpos<0) encoderpos=0; if(encoderpos>255) encoderpos=255; - fanpwm=encoderpos; - analogWrite(FAN_PIN, fanpwm); + FanSpeed=encoderpos; + analogWrite(FAN_PIN, FanSpeed); lcd.setCursor(13,line);lcd.print(itostr3(encoderpos)); }