Instrument Neutral Distributed Interface INDI  2.0.2
pid.cpp
Go to the documentation of this file.
1 
25 #include <iostream>
26 #include <cmath>
27 #include "pid.h"
28 
29 using namespace std;
30 
31 class PIDImpl
32 {
33  public:
34  PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki );
35  ~PIDImpl();
36  void setIntegratorLimits(double min, double max)
37  {
38  m_IntegratorMin = min;
39  m_IntegratorMax = max;
40  }
41  void setTau(double value)
42  {
43  m_Tau = value;
44  }
45  double calculate( double setpoint, double measurement );
46  double propotionalTerm() const
47  {
48  return m_PropotionalTerm;
49  }
50  double integralTerm() const
51  {
52  return m_IntegralTerm;
53  }
54  double derivativeTerm() const
55  {
56  return m_DerivativeTerm;
57  }
58 
59  private:
60  // Sample Time
61  double m_T {1};
62  // Derivative Low-Pass filter time constant */
63  double m_Tau {2};
64 
65  // Output limits
66  double m_Max {0};
67  double m_Min {0};
68 
69  // Integrator Limits
70  double m_IntegratorMin {0};
71  double m_IntegratorMax {0};
72 
73  // Gains
74  double m_Kp {0};
75  double m_Kd {0};
76  double m_Ki {0};
77 
78  // Controller volatile data
79  double m_PreviousError {0};
80  double m_PreviousMeasurement {0};
81 
82  // Terms
83  double m_PropotionalTerm {0};
84  double m_IntegralTerm {0};
85  double m_DerivativeTerm {0};
86 
87 };
88 
89 
90 PID::PID( double dt, double max, double min, double Kp, double Kd, double Ki )
91 {
92  pimpl = new PIDImpl(dt, max, min, Kp, Kd, Ki);
93 }
94 void PID::setIntegratorLimits(double min, double max)
95 {
96  pimpl->setIntegratorLimits(min, max);
97 }
98 void PID::setTau(double value)
99 {
100  pimpl->setTau(value);
101 }
102 double PID::calculate( double setpoint, double pv )
103 {
104  return pimpl->calculate(setpoint, pv);
105 }
106 double PID::propotionalTerm() const
107 {
108  return pimpl->propotionalTerm();
109 }
110 double PID::integralTerm() const
111 {
112  return pimpl->integralTerm();
113 }
114 double PID::derivativeTerm() const
115 {
116  return pimpl->derivativeTerm();
117 }
119 {
120  delete pimpl;
121 }
122 
123 
127 PIDImpl::PIDImpl( double dt, double max, double min, double Kp, double Kd, double Ki ) :
128  m_T(dt),
129  m_Max(max),
130  m_Min(min),
131  m_Kp(Kp),
132  m_Kd(Kd),
133  m_Ki(Ki)
134 {
135 }
136 
137 double PIDImpl::calculate(double setpoint, double measurement )
138 {
139  // Calculate error
140  double error = setpoint - measurement;
141 
142  // Proportional term
143  m_PropotionalTerm = m_Kp * error;
144 
145  // Integral term
146  m_IntegralTerm = m_IntegralTerm + 0.5 * m_Ki * m_T * (error + m_PreviousError);
147 
148  // Clamp Integral
149  if (m_IntegratorMin || m_IntegratorMax)
150  m_IntegralTerm = std::min(m_IntegratorMax, std::max(m_IntegratorMin, m_IntegralTerm));
151 
152  // Derivative term (N.B. on measurement NOT error)
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);
155 
156  // Calculate total output
157  double output = m_PropotionalTerm + m_IntegralTerm + m_DerivativeTerm;
158 
159  // Clamp Output
160  output = std::min(m_Max, std::max(m_Min, output));
161 
162  // Save error to previous error
163  m_PreviousError = error;
164  m_PreviousMeasurement = measurement;
165 
166  return output;
167 }
168 
170 {
171 }
172 
Definition: pid.cpp:32
double calculate(double setpoint, double measurement)
Definition: pid.cpp:137
void setIntegratorLimits(double min, double max)
Definition: pid.cpp:36
double propotionalTerm() const
Definition: pid.cpp:46
void setTau(double value)
Definition: pid.cpp:41
~PIDImpl()
Definition: pid.cpp:169
PIDImpl(double dt, double max, double min, double Kp, double Kd, double Ki)
Definition: pid.cpp:127
double derivativeTerm() const
Definition: pid.cpp:54
double integralTerm() const
Definition: pid.cpp:50
double derivativeTerm() const
Definition: pid.cpp:114
double integralTerm() const
Definition: pid.cpp:110
PID(double dt, double max, double min, double Kp, double Kd, double Ki)
Definition: pid.cpp:90
void setTau(double value)
Definition: pid.cpp:98
~PID()
Definition: pid.cpp:118
double calculate(double setpoint, double pv)
Definition: pid.cpp:102
void setIntegratorLimits(double min, double max)
Definition: pid.cpp:94
double propotionalTerm() const
Definition: pid.cpp:106
double max(void)
double min(void)
Definition: json.h:4973