pi without the d
This commit is contained in:
@@ -27,10 +27,8 @@ public:
|
||||
useMaxSensorPv_(false),
|
||||
sessionStartMs_(0),
|
||||
phaseStartMs_(0),
|
||||
resultKp_(PID_KP),
|
||||
resultKi_(PID_KI),
|
||||
resultKd_(PID_KD),
|
||||
resultFanMixMax_(FAN_MIX_MAX_PWM) {}
|
||||
resultKp_(HEAT_PI_KP),
|
||||
resultKi_(HEAT_PI_KI) {}
|
||||
|
||||
Phase phase() const { return phase_; }
|
||||
|
||||
@@ -77,7 +75,7 @@ public:
|
||||
Serial.print(preheatTargetC(), 1);
|
||||
Serial.print(F("-"));
|
||||
Serial.print(setpointC_, 1);
|
||||
Serial.println(F("C avg"));
|
||||
Serial.println(F("C avg (heat PI only)"));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -98,20 +96,18 @@ public:
|
||||
|
||||
float resultKp() const { return resultKp_; }
|
||||
float resultKi() const { return resultKi_; }
|
||||
float resultKd() const { return resultKd_; }
|
||||
uint8_t resultFanMixMax() const { return resultFanMixMax_; }
|
||||
|
||||
Phase update(float avgTempC, float maxTempC, float spreadC, uint32_t nowMs, float &heaterDutyOut,
|
||||
uint8_t &fanPwmOut) {
|
||||
heaterDutyOut = 0.0f;
|
||||
fanPwmOut = FAN_HEAT_MIN_PWM;
|
||||
fanPwmOut = AUTOTUNE_PREHEAT_FAN_PWM;
|
||||
|
||||
if (phase_ == Phase::Idle || phase_ == Phase::Done || phase_ == Phase::Failed) {
|
||||
return phase_;
|
||||
}
|
||||
|
||||
if (maxTempC >= TARGET_MAX_C - 1.0f) {
|
||||
fail(F("autotune: abort — max sensor at safety limit"));
|
||||
if (maxTempC >= EMERGENCY_MAX_TEMP_C) {
|
||||
fail(F("autotune: abort — max sensor at emergency limit"));
|
||||
return phase_;
|
||||
}
|
||||
|
||||
@@ -140,11 +136,6 @@ public:
|
||||
return phase_;
|
||||
}
|
||||
|
||||
if (nowMs - sessionStartMs_ > AUTOTUNE_SESSION_TIMEOUT_MS) {
|
||||
fail(F("autotune: abort — session timeout"));
|
||||
return phase_;
|
||||
}
|
||||
|
||||
if (cycleCount_ == 0 && nowMs - phaseStartMs_ > AUTOTUNE_RELAY_STALL_MS) {
|
||||
Serial.print(F("autotune: relay stalled — avg "));
|
||||
Serial.print(avgTempC, 1);
|
||||
@@ -264,7 +255,6 @@ private:
|
||||
const float ku = (4.0f * 100.0f) / (PI * avgAmplitude);
|
||||
resultKp_ = 0.45f * ku;
|
||||
resultKi_ = resultKp_ / (2.2f * avgPeriodSec);
|
||||
resultKd_ = resultKp_ * avgPeriodSec / 6.3f;
|
||||
|
||||
if (resultKp_ < 0.5f) {
|
||||
resultKp_ = 0.5f;
|
||||
@@ -273,30 +263,15 @@ private:
|
||||
resultKi_ = resultKp_ / 3.0f;
|
||||
}
|
||||
|
||||
resultFanMixMax_ = FAN_MIX_MAX_PWM;
|
||||
const float spreadAvg =
|
||||
spreadSamples_ > 0 ? spreadSum_ / static_cast<float>(spreadSamples_) : GOOD_SPREAD_C;
|
||||
if (spreadAvg > GOOD_SPREAD_C) {
|
||||
const float boost = 1.0f + ((spreadAvg - GOOD_SPREAD_C) / 10.0f);
|
||||
int boosted = static_cast<int>(static_cast<float>(FAN_MIX_MAX_PWM) * boost);
|
||||
if (boosted > static_cast<int>(FAN_MAX_PWM) - 20) {
|
||||
boosted = FAN_MAX_PWM - 20;
|
||||
}
|
||||
resultFanMixMax_ = static_cast<uint8_t>(boosted);
|
||||
}
|
||||
|
||||
phase_ = Phase::Done;
|
||||
Serial.print(F("autotune: done in "));
|
||||
Serial.print((nowMs - sessionStartMs_) / 1000UL);
|
||||
Serial.println(F("s"));
|
||||
Serial.print(F(" Kp="));
|
||||
Serial.print(F(" heat Kp="));
|
||||
Serial.print(resultKp_, 3);
|
||||
Serial.print(F(" Ki="));
|
||||
Serial.print(resultKi_, 4);
|
||||
Serial.print(F(" Kd="));
|
||||
Serial.print(resultKd_, 3);
|
||||
Serial.print(F(" fanMixMax="));
|
||||
Serial.println(resultFanMixMax_);
|
||||
Serial.println(resultKi_, 4);
|
||||
Serial.println(F(" tune mix PI separately: mixpi <Kp> <Ki>"));
|
||||
}
|
||||
|
||||
void fail(const __FlashStringHelper *reason) {
|
||||
@@ -325,6 +300,4 @@ private:
|
||||
uint32_t phaseStartMs_;
|
||||
float resultKp_;
|
||||
float resultKi_;
|
||||
float resultKd_;
|
||||
uint8_t resultFanMixMax_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user