test
Dependencies: ESP8266 HCSR04 PID
Fork of car_test_v1 by
Diff: AutomationElement/PI1.cpp
- Revision:
- 3:9e51de1050a1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AutomationElement/PI1.cpp Sat Nov 25 03:36:58 2017 +0000 @@ -0,0 +1,72 @@ +#include "PI1.h" + +PI1::PI1() { + u = y = u_p1 = y_p1 = 0; + setParameters(1, 1, 0.1); + setOutputLimits(0, 1); + setOperationMode(automatic); +} + +PI1::PI1(double K_R_, double T_I_, double T_d_) { + u = y = u_p1 = y_p1 = 0; + setParameters(K_R_, T_I_, T_d_); + setOutputLimits(0, 1); + setOperationMode(automatic); +} + +void PI1::setParameters(double K_R_, double T_I_, double T_d_) { + if (T_d_ > 0) + T_d = T_d_; + else + T_d = 0.1; + if (T_I_ > 0) + T_I = T_I_; + else + T_I = 1; + K_R = K_R_; +} + +void PI1::setOutputLimits(double lowerOutputLimit, double upperOutputLimit) { + if (upperOutputLimit > lowerOutputLimit) { + y_min = lowerOutputLimit; + y_max = upperOutputLimit; + } +} + +void PI1::setOperationMode(Mode newOperationMode) { + // Bumpless transfer from manual to automatic mode + if (operationMode == manual && newOperationMode == automatic) { + y = y_p1 = y_manual; + u = u_p1 = 0; + } + // Bumpless transfer from automatic to manual mode + else if (operationMode == automatic && newOperationMode == manual) { + y_manual = y; + } + operationMode = newOperationMode; +} + +void PI1::setOutputManually(double u_C) { + y_manual = u_C; +} + +double PI1::out() { + if (operationMode == automatic) { + y = y_p1 + K_R * u + K_R * (T_d / T_I - 1) * u_p1; + } else if (operationMode == manual) { + y = y_manual; + } + + if (y > y_max) + y = y_max; + else if (y < y_min) + y = y_min; + + y_p1 = y; + u_p1 = u; + return y; +} + +void PI1::in(double u_) { + u = u_; +} \ No newline at end of file