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-11-22 16:59:22 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-11-22 16:59:22 +0300
commit1e0e6c99252dee6aa20194f212aca3be6e68415a (patch)
treedfb754e8776bdc1f007b18b4a71c6adda4379d59
parent9481ad7c331a59aaaafe5259e48078f57c66e397 (diff)
Fixed bug in calculation of heater PID parameters
-rw-r--r--src/Heating/FOPDT.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/Heating/FOPDT.cpp b/src/Heating/FOPDT.cpp
index b64c0f7b..c7d92d64 100644
--- a/src/Heating/FOPDT.cpp
+++ b/src/Heating/FOPDT.cpp
@@ -299,13 +299,14 @@ void FopDt::CalcPidConstants(float targetTemperature) noexcept
{
if (!pidParametersOverridden)
{
- const float averageCoolingRate = GetCoolingRate(targetTemperature - NormalAmbientTemperature, 0.2);
+ // 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);
loadChangeParams.kP = 0.7/(heatingRate * deadTime);
- loadChangeParams.recipTi = powf(averageCoolingRate, 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(averageCoolingRate, 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;
}
}