pid.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "pid.h"
  2. PID::PID(float point, float kp, float ki, float kd) {
  3. _kp = kp;
  4. _ki = ki;
  5. _kd = kd;
  6. _point = point;
  7. output_max = 10000;
  8. output_min = -10000;
  9. integral_max = 10000;
  10. integral_min = -10000;
  11. error_integral = 0;
  12. _dir = 1;
  13. }
  14. float PID::Update(float input) {
  15. float output;
  16. float dinput;
  17. error = _point - input;
  18. error_integral += _ki * error + error_integral_offset;
  19. if (error_integral > integral_max) {
  20. error_integral = integral_max;
  21. }
  22. if (error_integral < integral_min) {
  23. error_integral = integral_min;
  24. }
  25. dinput = input - input_last;
  26. output = _kp * error + error_integral - _kd * dinput;
  27. input_last = input;
  28. if (output < output_min) {
  29. output = output_min;
  30. }
  31. if (output > output_max) {
  32. output = output_max;
  33. }
  34. return output;
  35. }
  36. void PID::SetOutputLimits(float max_out, float min_out) {
  37. output_max = max_out;
  38. output_min = min_out;
  39. }
  40. void PID::SetIntegralLimits(float max_out, float min_out) {
  41. integral_max = max_out;
  42. integral_min = min_out;
  43. }
  44. void PID::SetDirection(int8_t dir) {
  45. _dir = dir;
  46. _kp = fabs(_kp) * _dir;
  47. _ki = fabs(_ki) * _dir;
  48. _kd = fabs(_kd) * _dir;
  49. }
  50. void PID::SetIntegral(float integral) { error_integral = integral; }
  51. void PID::SetIntegralOffset(float offset) { error_integral_offset = offset; }
  52. void PID::UpdateParam(float kp, float ki, float kd) {
  53. _kp = fabs(kp) * _dir;
  54. _ki = fabs(ki) * _dir;
  55. _kd = fabs(kd) * _dir;
  56. }
  57. void PID::SetPoint(float point) { _point = point; }