Fixed cooling fan support (M106 command)

Fixed M106 command so that the cooling fan is controllably by PWM and
works the right way round (0 = off, 1 = on). Also added optional P
parameter to specify the value that corresponds to maximum PWM.
This commit is contained in:
David Crocker 2014-02-25 19:39:16 +00:00
parent 2b7b9fc505
commit 2305dc27c9
5 changed files with 18 additions and 5 deletions

View file

@ -24,7 +24,7 @@ Licence: GPL
#define CONFIGURATION_H #define CONFIGURATION_H
#define NAME "RepRapFirmware" #define NAME "RepRapFirmware"
#define VERSION "0.57p-dc42" #define VERSION "0.57q-dc42"
#define DATE "2014-02-24" #define DATE "2014-02-24"
#define LAST_AUTHOR "dc42" #define LAST_AUTHOR "dc42"

View file

@ -59,7 +59,9 @@ void GCodes::Init()
gCodeLetters = GCODE_LETTERS; gCodeLetters = GCODE_LETTERS;
distanceScale = 1.0; distanceScale = 1.0;
for (int8_t i = 0; i < DRIVES - AXES; i++) for (int8_t i = 0; i < DRIVES - AXES; i++)
{
lastPos[i] = 0.0; lastPos[i] = 0.0;
}
fileBeingPrinted = NULL; fileBeingPrinted = NULL;
fileToPrint = NULL; fileToPrint = NULL;
fileBeingWritten = NULL; fileBeingWritten = NULL;
@ -85,6 +87,7 @@ void GCodes::Init()
longWait = platform->Time(); longWait = platform->Time();
dwellTime = longWait; dwellTime = longWait;
axisIsHomed[X_AXIS] = axisIsHomed[Y_AXIS] = axisIsHomed[Z_AXIS] = false; axisIsHomed[X_AXIS] = axisIsHomed[Y_AXIS] = axisIsHomed[Z_AXIS] = false;
fanMaxPwm = 1.0;
} }
void GCodes::doFilePrint(GCodeBuffer* gb) void GCodes::doFilePrint(GCodeBuffer* gb)
@ -1580,8 +1583,16 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
break; break;
case 106: // Fan on or off case 106: // Fan on or off
if (gb->Seen('P'))
{
// slic3r and Cura expect PWM values to go from 0 to 255, but we expect PWM value to go from 0.0 to 1.0.
// So I've added a P parameter to allow the top end of the range to be set, so we can be compatible with those programs.
fanMaxPwm = fmax(gb->GetFValue(), 1.0);
}
if (gb->Seen('S')) if (gb->Seen('S'))
platform->CoolingFan(gb->GetFValue()); {
platform->CoolingFan(fmax(gb->GetFValue(), 0.0)/fanMaxPwm);
}
break; break;
case 107: // Fan off - deprecated case 107: // Fan off - deprecated

View file

@ -118,8 +118,8 @@ class GCodes
bool SendConfigToLine(); bool SendConfigToLine();
void WriteHTMLToFile(char b, GCodeBuffer *gb); void WriteHTMLToFile(char b, GCodeBuffer *gb);
bool OffsetAxes(GCodeBuffer *gb); bool OffsetAxes(GCodeBuffer *gb);
int8_t Heater(int8_t head) const; int8_t Heater(int8_t head) const;
Platform* platform; Platform* platform;
bool active; bool active;
Webserver* webserver; Webserver* webserver;
@ -166,6 +166,7 @@ class GCodes
bool zProbesSet; bool zProbesSet;
float longWait; float longWait;
bool axisIsHomed[3]; // these record which of the axes have been homed bool axisIsHomed[3]; // these record which of the axes have been homed
float fanMaxPwm; // the M106 S value that represents 100% fan speed
}; };
//***************************************************************************************************** //*****************************************************************************************************

View file

@ -133,7 +133,7 @@ Licence: GPL
#define TEMP_INTERVAL 0.122 // secs - check and control temperatures this often #define TEMP_INTERVAL 0.122 // secs - check and control temperatures this often
#define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed #define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed
#define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO} #define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO}
#define COOLING_FAN_PIN 34 #define COOLING_FAN_PIN X6
#define HEAT_ON 0 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) #define HEAT_ON 0 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4)
#define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value #define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value
@ -899,7 +899,8 @@ inline void Platform::CoolingFan(float speed)
{ {
if(coolingFanPin < 0) if(coolingFanPin < 0)
return; return;
analogWrite(coolingFanPin, (uint8_t)(speed*255.0)); // The cooling fan output pin gets inverted
analogWriteNonDue(coolingFanPin, (uint32_t)((1.0 - speed)*255.0));
} }
//inline void Platform::SetHeatOn(int8_t ho) //inline void Platform::SetHeatOn(int8_t ho)

Binary file not shown.