diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-12-16 15:29:42 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-12-16 15:29:42 +0300 |
commit | e0e741a76f7183dd94668218b0eb4d3e9d53d014 (patch) | |
tree | 22c9b3357828f62f414a3448b965d85a605602d8 | |
parent | 3eac979ffead60714e127b6f6eeef7c43fdbff49 (diff) |
Big fixes to calculation of PID parameters
-rw-r--r-- | src/Heating/FOPDT.cpp | 7 | ||||
-rw-r--r-- | src/Heating/Heater.cpp | 6 |
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; |