diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-11-22 16:59:22 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-11-22 16:59:22 +0300 |
commit | 1e0e6c99252dee6aa20194f212aca3be6e68415a (patch) | |
tree | dfb754e8776bdc1f007b18b4a71c6adda4379d59 | |
parent | 9481ad7c331a59aaaafe5259e48078f57c66e397 (diff) |
Fixed bug in calculation of heater PID parameters
-rw-r--r-- | src/Heating/FOPDT.cpp | 7 |
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; } } |