194 ValueType
compute(ValueType ref, ValueType measure)
196 const ValueType error = ref - measure;
197 if constexpr (HasDeadband)
204 ValueType dt = deltaT.getDeltaMS();
205 ValueType P, I{}, D, output;
206 if constexpr (PositionalPID)
209 ITerm =
Ki * error * dt;
213 P =
Kp * (error - prev_error);
214 ITerm =
Ki * error * dt;
219 if constexpr (HasDerivativeOnMeasurement)
221 ValueType meas_deriv = -(measure - prev_measure) / dt;
222 prev_measure = measure;
225 else if constexpr (PositionalPID)
227 return (error - prev_error) / dt;
231 return (error - 2 * prev_error + prev_prev_error) / dt;
237 if constexpr (HasDerivativeFilter)
239 D = D * dt / (
D_RC + dt) + prev_derivative *
D_RC / (
D_RC + dt);
242 if constexpr (HasIntegralLimit)
244 ValueType temp_Iout = I + ITerm;
245 if (
const ValueType temp_Output = P + I + D; abs(temp_Output) >
MaxOutputVal)
268 if constexpr (HasOutputFilter)
270 output = output * dt / (
O_RC + dt) + prev_output *
O_RC / (
O_RC + dt);
274 if constexpr (HasOutputLimit)
281 prev_output = output;
294 prev_error = ValueType{};
295 prev_prev_error = ValueType{};
296 prev_ref = ValueType{};
297 prev_measure = ValueType{};
298 prev_derivative = ValueType{};
299 prev_output = ValueType{};