1- class libpid
1+ #ifndef PID_H
2+ #define PID_H
3+
4+ class PID
25{
36 public:
4- libpid ()
7+ PID ();
8+ ~PID () {}
9+ PID (double p,
10+ double i,
11+ double d,
12+ double derivator,
13+ double integrator,
14+ double integrator_max,
15+ double integrator_min);
16+
17+ PID& operator =(const PID& rhs);
18+
19+ double update (double current_value)
520 {
6- kp_ = ki_ = kd_ = derivator_ = integrator_ = integrator_max_ = integrator_min_ = set_point_ = 0 ;
7- }
8-
9- libpid (double p,
10- double i,
11- double d,
12- double derivator,
13- double integrator,
14- double integrator_max,
15- double integrator_min)
16- {
17- kp_ = p;
18- ki_ = i;
19- kd_ = d;
20- derivator_ = derivator;
21- integrator_ = integrator;
22- integrator_max_ = integrator_max;
23- integrator_min_ = integrator_min;
24- }
25-
26- double update (double current_value){
2721 double error = set_point_ - current_value;
28- double p_value = kp_ * error;
29- double d_value = kd_ * (error - derivator_);
22+ integrator_ += error;
23+ // clamp integrator_ value between integrator_max_ and integrator_min_
24+ double i_value = ki_ * (integrator_ > integrator_max_ ? integrator_max_ : (integrator_ < integrator_min_ ? integrator_min_ : integrator_));
25+ double pid = kp_*error + kd_*(error-derivator_) + i_value;
26+ if (isLimited_)
27+ {
28+ // clamp pid value between output_max_ and output_min_
29+ pid = pid > output_max_ ? output_max_ : (pid < output_min_ ? output_min_ : pid);
30+ }
3031 derivator_ = error;
31- integrator_ = integrator_ + error;
32- if (integrator_ > integrator_max_)
33- integrator_ = integrator_max_;
34- else if (integrator_ < integrator_min_)
35- integrator_ = integrator_min_;
36- double i_value = integrator_ * ki_;
37- double pid = p_value + i_value + d_value;
38- return pid;
39- }
40-
41- void setPoint (double set_point){
32+ return pid;
33+ };
34+
35+ void setPoint (double set_point)
36+ {
4237 set_point_ = set_point;
43- }
44-
45- void setIntegrator (double integrator){
38+ };
39+
40+ void setIntegrator (double integrator)
41+ {
4642 integrator_ = integrator;
47- }
48-
49- void setIntegratorMax (double max){
43+ };
44+
45+ void setIntegratorMax (double max)
46+ {
5047 integrator_max_ = max;
51- }
48+ };
5249
53- void setIntegratorMin (double min) {
50+ void setIntegratorMin (double min)
51+ {
5452 integrator_min_ = min;
55- }
56-
57- void setKp (double kp){
58- kp_ = (kp >= 0 ) ? kp : 0 ;
59- }
60-
61- void setKi (double ki){
62- ki_ = (ki >= 0 ) ? ki : 0 ;
63- }
64-
65- void setKd (double kd){
66- kd_ = (kd >= 0 ) ? kd : 0 ;
67- }
68- double getKp (){
69- return kp_;
70- }
71- double getKd (){
72- return kd_;
73- }
74- double getKi (){
75- return ki_;
76- }
53+ };
54+
55+ void setDerivator (double derivator)
56+ {
57+ derivator_ = derivator;
58+ };
59+
60+ void setKp (double kp)
61+ {
62+ kp_ = kp;
63+ };
64+
65+ void setKi (double ki)
66+ {
67+ ki_ = ki;
68+ };
69+
70+ void setKd (double kd)
71+ {
72+ kd_ = kd;
73+ };
74+
75+ void limitOutput (double min, double max)
76+ {
77+ isLimited_ = true ;
78+ output_min_ = min;
79+ output_max_ = max;
80+ };
7781
78- double getPoint (){
82+ void delimitOutput ()
83+ {
84+ isLimited_ = false ;
85+ };
86+
87+ double getPoint ()
88+ {
7989 return set_point_;
80- }
81-
82- double getIntegrator (){
90+ };
91+
92+ double getIntegrator ()
93+ {
8394 return integrator_;
84- }
85- double getDerivator (){
95+ };
96+
97+ double getDerivator ()
98+ {
8699 return derivator_;
87- }
100+ };
101+
102+ double getOutputMin ()
103+ {
104+ return output_min_;
105+ };
106+
107+ double getOutputMax ()
108+ {
109+ return output_max_;
110+ };
88111
112+ bool outputIsLimited ()
113+ {
114+ return isLimited_;
115+ };
116+
89117 private:
90118 double kp_;
91119 double ki_;
@@ -95,4 +123,9 @@ class libpid
95123 double integrator_min_;
96124 double integrator_max_;
97125 double set_point_;
126+ double output_max_;
127+ double output_min_;
128+ bool isLimited_;
98129};
130+
131+ #endif
0 commit comments