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 );
48 return m_PropotionalTerm;
52 return m_IntegralTerm;
56 return m_DerivativeTerm;
70 double m_IntegratorMin {0};
71 double m_IntegratorMax {0};
79 double m_PreviousError {0};
80 double m_PreviousMeasurement {0};
83 double m_PropotionalTerm {0};
84 double m_IntegralTerm {0};
85 double m_DerivativeTerm {0};
90 PID::PID(
double dt,
double max,
double min,
double Kp,
double Kd,
double Ki )
96 pimpl->setIntegratorLimits(
min,
max);
100 pimpl->setTau(value);
104 return pimpl->calculate(setpoint, pv);
108 return pimpl->propotionalTerm();
112 return pimpl->integralTerm();
116 return pimpl->derivativeTerm();
140 double error = setpoint - measurement;
143 m_PropotionalTerm = m_Kp * error;
146 m_IntegralTerm = m_IntegralTerm + 0.5 * m_Ki * m_T * (error + m_PreviousError);
149 if (m_IntegratorMin || m_IntegratorMax)
150 m_IntegralTerm =
std::min(m_IntegratorMax,
std::max(m_IntegratorMin, m_IntegralTerm));
153 m_DerivativeTerm = -(2.0f * m_Kd * (measurement - m_PreviousMeasurement) + (2.0f * m_Tau - m_T) * m_DerivativeTerm)
154 / (2.0f * m_Tau + m_T);
157 double output = m_PropotionalTerm + m_IntegralTerm + m_DerivativeTerm;
163 m_PreviousError = error;
164 m_PreviousMeasurement = measurement;
double calculate(double setpoint, double measurement)
void setIntegratorLimits(double min, double max)
double propotionalTerm() 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
PID(double dt, double max, double min, double Kp, double Kd, double Ki)
void setTau(double value)
double calculate(double setpoint, double pv)
void setIntegratorLimits(double min, double max)
double propotionalTerm() const