Temperature code all working with simple bang-bang control. PID next...

This commit is contained in:
Adrian Bowyer 2013-06-18 22:24:07 +01:00
parent 2d335eadf3
commit ce7522f682
6 changed files with 96 additions and 18 deletions

View file

@ -72,6 +72,7 @@ class GCodes
boolean SetUpMove(GCodeBuffer* gb);
boolean DoDwell(GCodeBuffer *gb);
boolean DoHome();
boolean SetOffsets(GCodeBuffer *gb);
boolean NoHome();
boolean Push();
boolean Pop();
@ -99,6 +100,7 @@ class GCodes
float distanceScale;
int fileBeingPrinted;
int fileToPrint;
int8_t selectedHead;
boolean homeX;
boolean homeY;
boolean homeZ;

View file

@ -61,6 +61,7 @@ void GCodes::Init()
homeZQueued = false;
dwellWaiting = false;
stackPointer = 0;
selectedHead = -1;
dwellTime = platform->Time();
}
@ -375,6 +376,20 @@ boolean GCodes::DoDwell(GCodeBuffer *gb)
return false;
}
boolean GCodes::SetOffsets(GCodeBuffer *gb)
{
int8_t head;
if(gb->Seen('P'))
{
head = gb->GetIValue();
if(gb->Seen('R'))
platform->SetStandbyTemperature(head+1, gb->GetFValue());
if(gb->Seen('S'))
platform->SetActiveTemperature(head+1, gb->GetFValue());
}
return true;
}
// If the GCode to act on is completed, this returns true,
// otherwise false. It is called repeatedly for a given
// GCode until it returns true for that code.
@ -382,6 +397,7 @@ boolean GCodes::DoDwell(GCodeBuffer *gb)
boolean GCodes::ActOnGcode(GCodeBuffer *gb)
{
int code;
float value;
boolean result = true;
if(gb->Seen('G'))
@ -399,7 +415,7 @@ boolean GCodes::ActOnGcode(GCodeBuffer *gb)
break;
case 10: // Set offsets
platform->Message(HOST_MESSAGE, "Set offsets received\n");
result = SetOffsets(gb);
break;
case 20: // Inches (which century are we living in, here?)
@ -518,7 +534,8 @@ boolean GCodes::ActOnGcode(GCodeBuffer *gb)
break;
case 140: // Set bed temperature
platform->Message(HOST_MESSAGE, "Set bed temp received\n");
if(gb->Seen('S'))
reprap.GetHeat()->SetTemperature(0, gb->GetFValue());
break;
case 141: // Chamber temperature
@ -539,9 +556,14 @@ boolean GCodes::ActOnGcode(GCodeBuffer *gb)
boolean ok = false;
for(int8_t i = AXES; i < DRIVES; i++)
{
if(selectedHead == i - AXES)
{
reprap.GetHeat()->SetTemperature(selectedHead+1, platform->StandbyTemperature(selectedHead+1));
}
if(code == i - AXES)
{
platform->Message(HOST_MESSAGE, "Tool selection received\n");
reprap.GetHeat()->SetTemperature(code+1, platform->ActiveTemperature(code+1));
selectedHead = code;
ok = true;
}
}

10
Heat.h
View file

@ -28,7 +28,7 @@ class PID
PID(Platform* p, int8_t h);
void Init();
void Spin();
void SetTemperature(float t);
void SetTemperature(const float& t);
float GetTemperature();
private:
@ -48,6 +48,7 @@ class Heat
void Spin();
void Init();
void Exit();
void SetTemperature(int8_t heater, const float& t);
float GetTemperature(int8_t heater);
private:
@ -62,7 +63,7 @@ class Heat
//***********************************************************************************************************
inline void PID::SetTemperature(float t)
inline void PID::SetTemperature(const float& t)
{
setTemperature = t;
}
@ -72,6 +73,11 @@ inline float PID::GetTemperature()
return temperature;
}
inline void Heat::SetTemperature(int8_t heater, const float& t)
{
pids[heater]->SetTemperature(t);
}
inline float Heat::GetTemperature(int8_t heater)
{
return pids[heater]->GetTemperature();

View file

@ -68,10 +68,20 @@ PID::PID(Platform* p, int8_t h)
void PID::Init()
{
temperature = 5*(heater + 1);
temperature = platform->GetTemperature(heater);
setTemperature = 0.0;
platform->SetHeater(heater, -1.0);
}
void PID::Spin()
{
temperature += 1;
temperature = platform->GetTemperature(heater);
if(!platform->UsePID(heater))
{
if(temperature < setTemperature)
platform->SetHeater(heater, 1.0);
else
platform->SetHeater(heater, 0.0);
return;
}
}

View file

@ -76,10 +76,10 @@ Licence: GPL
#define LOW_STOP_PINS {3, 14, 17, -1}
#define HIGH_STOP_PINS {-1, -1, -1, -1}
#define ENDSTOP_HIT 1 // when a stop == this it is hit
#define MAX_FEEDRATES {300, 300, 3, 45} // mm/sec
#define ACCELERATIONS {800, 800, 30, 250} // mm/sec^2??
#define MAX_FEEDRATES {300.0, 300.0, 3.0, 45.0} // mm/sec
#define ACCELERATIONS {800.0, 800.0, 30.0, 250.0} // mm/sec^2??
//#define ACCELERATIONS {80, 80, 3, 25}
#define DRIVE_STEPS_PER_UNIT {91.4286, 91.4286, 4000, 929}
#define DRIVE_STEPS_PER_UNIT {91.4286, 91.4286, 4000.0, 929.0}
#define INSTANT_DVS {15.0, 15.0, 0.4, 15.0} // (mm/sec)
#define GCODE_LETTERS { 'X', 'Y', 'Z', 'E', 'F' } // The drives and feedrate in a GCode
@ -87,8 +87,9 @@ Licence: GPL
#define START_FEED_RATE 200.0
#define AXIS_LENGTHS {210, 210, 120} // mm
#define HOME_FEEDRATES {50*60, 50*60, 1*60} // mm/min
#define AXIS_LENGTHS {210, 200, 120} // mm
#define HOME_FEEDRATES {50.0*60.0, 50.0*60.0, 1.0*60.0} // mm/min
#define HEAD_OFFSETS {0.0, 0.0, 0.0}
#define X_AXIS 0 // The index of the X axis
#define Y_AXIS 1 // The index of the Y axis
@ -102,12 +103,14 @@ Licence: GPL
#define THERMISTOR_BETAS {3480.0, 3960.0} // Bed thermistor: RS 484-0149; EPCOS B57550G103J; Extruder thermistor: RS 198-961
#define THERMISTOR_SERIES_RS {4700, 4700} // Ohms in series with the thermistors
#define THERMISTOR_25_RS {10000.0, 100000.0} // Thermistor ohms at 25 C = 298.15 K
#define USE_PID {false, true} // PID or bang-bang for this heater?
#define USE_PID {false, false} // PID or bang-bang for this heater?
#define PID_KIS {-1, 100} // PID constants...
#define PID_KDS {-1, 100}
#define PID_KPS {-1, 100}
#define PID_I_LIMITS {-1, 100} // ... to here
#define TEMP_INTERVAL 0.5 // secs - check and control temperatures this often
#define STANDBY_TEMPERATURES {0.0, 0.0} // We specify one for the bed, though it's not needed
#define ACTIVE_TEMPERATURES {0.0, 0.0}
#define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value
@ -253,11 +256,15 @@ class Platform
float GetTemperature(int8_t heater); // Result is in degrees celsius
void SetHeater(int8_t heater, const float& power); // power is a fraction in [0,1]
void SetStandbyTemperature(int8_t heater, const float& t);
void SetActiveTemperature(int8_t heater, const float& t);
float StandbyTemperature(int8_t heater);
float ActiveTemperature(int8_t heater);
float pidKp(int8_t heater);
float pidKi(int8_t heater);
float pidKd(int8_t heater);
float pidKw(int8_t heater);
boolean pidBangBang(int8_t heater);
boolean UsePID(int8_t heater);
float HeatSampleTime();
//-------------------------------------------------------------------------------------------------------
@ -297,7 +304,8 @@ class Platform
float axisLengths[AXES];
float homeFeedrates[AXES];
float headOffsets[AXES]; // FIXME - needs a 2D array
// HEATERS - Bed is assumed to be the first
int8_t tempSensePins[HEATERS];
@ -305,12 +313,14 @@ class Platform
float thermistorBetas[HEATERS];
float thermistorSeriesRs[HEATERS];
float thermistorInfRs[HEATERS];
boolean usePid[HEATERS];
boolean usePID[HEATERS];
float pidKis[HEATERS];
float pidKds[HEATERS];
float pidKps[HEATERS];
float pidILimits[HEATERS];
float heatSampleTime;
float standbyTemperatures[HEATERS];
float activeTemperatures[HEATERS];
// Files
@ -444,6 +454,31 @@ inline float Platform::HeatSampleTime()
return heatSampleTime;
}
inline boolean Platform::UsePID(int8_t heater)
{
return usePID[heater];
}
inline void Platform::SetStandbyTemperature(int8_t heater, const float& t)
{
standbyTemperatures[heater] = t;
}
inline void Platform::SetActiveTemperature(int8_t heater, const float& t)
{
activeTemperatures[heater] = t;
}
inline float Platform::StandbyTemperature(int8_t heater)
{
return standbyTemperatures[heater];
}
inline float Platform::ActiveTemperature(int8_t heater)
{
return activeTemperatures[heater];
}
//*********************************************************************************************************
// Interrupts

View file

@ -90,6 +90,7 @@ void Platform::Init()
axisLengths = AXIS_LENGTHS;
homeFeedrates = HOME_FEEDRATES;
headOffsets = HEAD_OFFSETS;
// HEATERS - Bed is assumed to be the first
@ -98,7 +99,7 @@ void Platform::Init()
thermistorBetas = THERMISTOR_BETAS;
thermistorSeriesRs = THERMISTOR_SERIES_RS;
thermistorInfRs = THERMISTOR_25_RS;
usePid = USE_PID;
usePID = USE_PID;
pidKis = PID_KIS;
pidKds = PID_KDS;
pidKps = PID_KPS;
@ -108,6 +109,8 @@ void Platform::Init()
sysDir = SYS_DIR;
tempDir = TEMP_DIR;
heatSampleTime = HEAT_SAMPLE_TIME;
standbyTemperatures = STANDBY_TEMPERATURES;
activeTemperatures = ACTIVE_TEMPERATURES;
}
for(i = 0; i < DRIVES; i++)
@ -238,7 +241,7 @@ float Platform::GetTemperature(int8_t heater)
void Platform::SetHeater(int8_t heater, const float& power)
{
if(power <= 0)
if(power <= 0.0)
{
digitalWrite(heatOnPins[heater], 0);
return;