From e0e741a76f7183dd94668218b0eb4d3e9d53d014 Mon Sep 17 00:00:00 2001 From: David Crocker Date: Thu, 16 Dec 2021 12:29:42 +0000 Subject: Big fixes to calculation of PID parameters --- src/Heating/FOPDT.cpp | 7 ++++--- 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; -- cgit v1.2.3