Files
esphome-dev/esphome/components/pid/pid_controller.h
T
Otto Winter ac0d921413 ESP-IDF support and generic target platforms (#2303)
* Socket refactor and SSL

* esp-idf temp

* Fixes

* Echo component and noise

* Add noise API transport support

* Updates

* ESP-IDF

* Complete

* Fixes

* Fixes

* Versions update

* New i2c APIs

* Complete i2c refactor

* SPI migration

* Revert ESP Preferences migration, too complex for now

* OTA support

* Remove echo again

* Remove ssl again

* GPIOFlags updates

* Rename esphal and ICACHE_RAM_ATTR

* Make ESP32 arduino compilable again

* Fix GPIO flags

* Complete pin registry refactor and fixes

* Fixes to make test1 compile

* Remove sdkconfig file

* Ignore sdkconfig file

* Fixes in reviewing

* Make test2 compile

* Make test4 compile

* Make test5 compile

* Run clang-format

* Fix lint errors

* Use esp-idf APIs instead of btStart

* Another round of fixes

* Start implementing ESP8266

* Make test3 compile

* Guard esp8266 code

* Lint

* Reformat

* Fixes

* Fixes v2

* more fixes

* ESP-IDF tidy target

* Convert ARDUINO_ARCH_ESPxx

* Update WiFiSignalSensor

* Update time ifdefs

* OTA needs millis from hal

* RestartSwitch needs delay from hal

* ESP-IDF Uart

* Fix OTA blank password

* Allow setting sdkconfig

* Fix idf partitions and allow setting sdkconfig from yaml

* Re-add read/write compat APIs and fix esp8266 uart

* Fix esp8266 store log strings in flash

* Fix ESP32 arduino preferences not initialized

* Update ifdefs

* Change how sdkconfig change is detected

* Add checks to ci-custom and fix them

* Run clang-format

* Add esp-idf clang-tidy target and fix errors

* Fixes from clang-tidy idf round 2

* Fixes from compiling tests with esp-idf

* Run clang-format

* Switch test5.yaml to esp-idf

* Implement ESP8266 Preferences

* Lint

* Re-do PIO package version selection a bit

* Fix arduinoespressif32 package version

* Fix unit tests

* Lint

* Lint fixes

* Fix readv/writev not defined

* Fix graphing component

* Re-add all old options from core/config.py

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
2021-09-20 11:47:51 +02:00

82 lines
2.0 KiB
C++

#pragma once
#include "esphome/core/hal.h"
namespace esphome {
namespace pid {
struct PIDController {
float update(float setpoint, float process_value) {
// e(t) ... error at timestamp t
// r(t) ... setpoint
// y(t) ... process value (sensor reading)
// u(t) ... output value
float dt = calculate_relative_time_();
// e(t) := r(t) - y(t)
error = setpoint - process_value;
// p(t) := K_p * e(t)
proportional_term = kp * error;
// i(t) := K_i * \int_{0}^{t} e(t) dt
accumulated_integral_ += error * dt * ki;
// constrain accumulated integral value
if (!std::isnan(min_integral) && accumulated_integral_ < min_integral)
accumulated_integral_ = min_integral;
if (!std::isnan(max_integral) && accumulated_integral_ > max_integral)
accumulated_integral_ = max_integral;
integral_term = accumulated_integral_;
// d(t) := K_d * de(t)/dt
float derivative = 0.0f;
if (dt != 0.0f)
derivative = (error - previous_error_) / dt;
previous_error_ = error;
derivative_term = kd * derivative;
// u(t) := p(t) + i(t) + d(t)
return proportional_term + integral_term + derivative_term;
}
void reset_accumulated_integral() { accumulated_integral_ = 0; }
/// Proportional gain K_p.
float kp = 0;
/// Integral gain K_i.
float ki = 0;
/// Differential gain K_d.
float kd = 0;
float min_integral = NAN;
float max_integral = NAN;
// Store computed values in struct so that values can be monitored through sensors
float error;
float proportional_term;
float integral_term;
float derivative_term;
protected:
float calculate_relative_time_() {
uint32_t now = millis();
uint32_t dt = now - this->last_time_;
if (last_time_ == 0) {
last_time_ = now;
return 0.0f;
}
last_time_ = now;
return dt / 1000.0f;
}
/// Error from previous update used for derivative term
float previous_error_ = 0;
/// Accumulated integral value
float accumulated_integral_ = 0;
uint32_t last_time_ = 0;
};
} // namespace pid
} // namespace esphome