34 PIDImpl(
double dt,
double max,
double min,
double Kp,
double Kd,
double Ki );
38 m_IntegratorMin =
min;
39 m_IntegratorMax =
max;
45 double calculate(
double setpoint,
double measurement );
49 return m_ProportionalTerm;
53 return m_IntegralTerm;
57 return m_DerivativeTerm;
72 void getGains(
double &Kp,
double &Ki,
double &Kd)
const
90 double m_IntegratorMin {0};
91 double m_IntegratorMax {0};
99 double m_PreviousError {0};
100 double m_PreviousMeasurement {0};
103 double m_ProportionalTerm {0};
104 double m_IntegralTerm {0};
105 double m_DerivativeTerm {0};
182 double error = setpoint - measurement;
185 m_ProportionalTerm = m_Kp * error;
188 m_IntegralTerm = m_IntegralTerm + 0.5 * m_Ki * m_T * (error + m_PreviousError);
192 if (m_IntegratorMin != m_IntegratorMax)
193 m_IntegralTerm = std::min(m_IntegratorMax, std::max(m_IntegratorMin, m_IntegralTerm));
197 m_DerivativeTerm = -(2.0 * m_Kd * (measurement - m_PreviousMeasurement) + (2.0 * m_Tau - m_T) * m_DerivativeTerm)
198 / (2.0 * m_Tau + m_T);
201 double output = m_ProportionalTerm + m_IntegralTerm + m_DerivativeTerm;
204 double outputBeforeSaturation = output;
205 output = std::min(m_Max, std::max(m_Min, output));
209 if (output != outputBeforeSaturation && m_Ki != 0.0)
212 m_IntegralTerm = output - m_ProportionalTerm - m_DerivativeTerm;
216 m_PreviousError = error;
217 m_PreviousMeasurement = measurement;
224 m_PreviousError = 0.0;
225 m_PreviousMeasurement = 0.0;
226 m_IntegralTerm = 0.0;
227 m_DerivativeTerm = 0.0;
228 m_ProportionalTerm = 0.0;
double calculate(double setpoint, double measurement)
void setIntegratorLimits(double min, double max)
double proportionalTerm() const
void getGains(double &Kp, double &Ki, double &Kd) const
void setTau(double value)
PIDImpl(double dt, double max, double min, double Kp, double Kd, double Ki)
double derivativeTerm() const
double integralTerm() const
double derivativeTerm() const
double integralTerm() const
void getGains(double &Kp, double &Ki, double &Kd) const
PID(double dt, double max, double min, double Kp, double Kd, double Ki)
void setTau(double value)
double proportionalTerm() const
double calculate(double setpoint, double pv)
void setIntegratorLimits(double min, double max)