Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2021-12-16 15:29:42 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-12-16 15:29:42 +0300
commite0e741a76f7183dd94668218b0eb4d3e9d53d014 (patch)
tree22c9b3357828f62f414a3448b965d85a605602d8
parent3eac979ffead60714e127b6f6eeef7c43fdbff49 (diff)
Big fixes to calculation of PID parameters
-rw-r--r--src/Heating/FOPDT.cpp7
-rw-r--r--src/Heating/Heater.cpp6
2 files changed, 10 insertions, 3 deletions
diff --git a/src/Heating/FOPDT.cpp b/src/Heating/FOPDT.cpp
index 026458b9..5d3ac2c5 100644
--- a/src/Heating/FOPDT.cpp
+++ b/src/Heating/FOPDT.cpp
@@ -299,13 +299,14 @@ void FopDt::CalcPidConstants(float targetTemperature) noexcept
if (!pidParametersOverridden)
{
// Calculate the cooling rate per degC at this temperature. We assume the fan is off because that is the worst case i.e. longest time constant and less stable.
- const float averageCoolingRatePerDegc = basicCoolingRate * 0.01 * powf((targetTemperature - NormalAmbientTemperature) * 0.01, coolingRateExponent - 1.0);
+ const float temperatureRise = targetTemperature - NormalAmbientTemperature;
+ const float averageCoolingRatePerDegC = GetCoolingRate(temperatureRise, 0.2)/temperatureRise;
loadChangeParams.kP = 0.7/(heatingRate * deadTime);
- loadChangeParams.recipTi = powf(averageCoolingRatePerDegc, 0.25)/(1.14 * powf(deadTime, 0.75)); // Ti = 1.14 * timeConstant^0.25 * deadTime^0.75 (Ho et al)
+ loadChangeParams.recipTi = powf(averageCoolingRatePerDegC, 0.25)/(1.14 * powf(deadTime, 0.75)); // Ti = 1.14 * timeConstant^0.25 * deadTime^0.75 (Ho et al)
loadChangeParams.tD = deadTime * 0.7;
setpointChangeParams.kP = 0.7/(heatingRate * deadTime);
- setpointChangeParams.recipTi = powf(averageCoolingRatePerDegc, 0.5)/powf(deadTime, 0.5); // Ti = timeConstant^0.5 * deadTime^0.5
+ setpointChangeParams.recipTi = powf(averageCoolingRatePerDegC, 0.5)/powf(deadTime, 0.5); // Ti = timeConstant^0.5 * deadTime^0.5
setpointChangeParams.tD = deadTime * 0.7;
}
}
diff --git a/src/Heating/Heater.cpp b/src/Heating/Heater.cpp
index ac5a5ba6..6c330504 100644
--- a/src/Heating/Heater.cpp
+++ b/src/Heating/Heater.cpp
@@ -609,6 +609,7 @@ void Heater::SetTemperature(float t, bool activeNotStandby) THROWS(GCodeExceptio
{
throw GCodeException(-1, 1, reply.c_str());
}
+ model.CalcPidConstants(activeTemperature);
}
}
}
@@ -692,19 +693,23 @@ GCodeResult Heater::SetTemperature(const CanMessageSetHeaterTemperature& msg, co
{
case CanMessageSetHeaterTemperature::commandNone:
activeTemperature = standbyTemperature = msg.setPoint;
+ model.CalcPidConstants(activeTemperature);
return GCodeResult::ok;
case CanMessageSetHeaterTemperature::commandOff:
activeTemperature = standbyTemperature = msg.setPoint;
+ model.CalcPidConstants(activeTemperature);
SwitchOff();
return GCodeResult::ok;
case CanMessageSetHeaterTemperature::commandOn:
activeTemperature = standbyTemperature = msg.setPoint;
+ model.CalcPidConstants(activeTemperature);
return SwitchOn(reply);
case CanMessageSetHeaterTemperature::commandResetFault:
activeTemperature = standbyTemperature = msg.setPoint;
+ model.CalcPidConstants(activeTemperature);
return ResetFault(reply);
case CanMessageSetHeaterTemperature::commandSuspend:
@@ -713,6 +718,7 @@ GCodeResult Heater::SetTemperature(const CanMessageSetHeaterTemperature& msg, co
case CanMessageSetHeaterTemperature::commandUnsuspend:
activeTemperature = standbyTemperature = msg.setPoint;
+ model.CalcPidConstants(activeTemperature);
Suspend(false);
return GCodeResult::ok;