12 dt_ = calculate_relative_time_();
15 error_ = setpoint - process_value;
17 calculate_proportional_term_();
18 calculate_integral_term_();
19 calculate_derivative_term_(setpoint);
22 float output = proportional_term_ + integral_term_ + derivative_term_;
25 int samples =
in_deadband() ? deadband_output_samples_ : output_samples_;
26 return ring_buffer_average_(output_window_, output, samples);
32 return (threshold_low_ < err && err < threshold_high_);
35void PIDController::calculate_proportional_term_() {
37 proportional_term_ = kp_ * error_;
42 proportional_term_ *= kp_multiplier_;
46 float threshold = (error_ < 0) ? threshold_high_ : threshold_low_;
47 float pdm_offset = (threshold - (kp_multiplier_ * threshold)) * kp_;
48 proportional_term_ += pdm_offset;
52void PIDController::calculate_integral_term_() {
54 float new_integral = error_ * dt_ * ki_;
58 accumulated_integral_ += new_integral * ki_multiplier_;
60 accumulated_integral_ += new_integral;
64 if (!std::isnan(min_integral_) && accumulated_integral_ < min_integral_)
65 accumulated_integral_ = min_integral_;
66 if (!std::isnan(max_integral_) && accumulated_integral_ > max_integral_)
67 accumulated_integral_ = max_integral_;
69 integral_term_ = accumulated_integral_;
72void PIDController::calculate_derivative_term_(
float setpoint) {
75 float derivative = 0.0f;
78 if (!std::isnan(previous_setpoint_) && previous_setpoint_ != setpoint)
79 previous_error_ -= previous_setpoint_ - setpoint;
80 derivative = (error_ - previous_error_) / dt_;
82 previous_error_ = error_;
83 previous_setpoint_ = setpoint;
86 derivative = ring_buffer_average_(derivative_window_, derivative, derivative_samples_);
88 derivative_term_ = kd_ * derivative;
92 derivative_term_ *= kd_multiplier_;
96float PIDController::ring_buffer_average_(FixedRingBuffer<float> &buf,
float new_value,
int max_samples) {
98 if (max_samples <= 1) {
105 while (buf.size() >=
static_cast<size_t>(max_samples))
112 return sum / buf.size();
115float PIDController::calculate_relative_time_() {
117 uint32_t dt = now - this->last_time_;
118 if (last_time_ == 0) {
Providing packet encoding functions for exchanging data with a remote host.
uint32_t IRAM_ATTR HOT millis()
float update(float setpoint, float process_value)