-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalculatePID.ino
64 lines (51 loc) · 1.46 KB
/
CalculatePID.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
double CalculatePID(double Input, double Kp, double Ki, double Kd, double Setpoint, double &LastError, double &Integral, double OutputMin, double OutputMax) {
double error = Setpoint - Input;
//anti-windup: back-calculation
if (Integral > OutputMax) {
Integral = OutputMax;
} else if (Integral < OutputMin) {
Integral = OutputMin;
}
double derivative = error - LastError;
double Output = Kp * error + Integral + Kd * derivative;
//anti-windup: back-calculation
if (Output > OutputMax) {
if (Ki > 0) { //undo integration
Integral -= (Output - OutputMax) / Ki;
}
Output = OutputMax;
} else if (Output < OutputMin) {
if (Ki > 0) { //undo integration
Integral -= (Output - OutputMax) / Ki;
}
Output = OutputMin;
}
LastError = error;
Integral += error * Ki;
// --- PID INFO ---
// - Serial format -
/*Serial.print("error | ");
Serial.print(error);
Serial.print(" | Setpoint | ");
Serial.print(Setpoint);
Serial.print(" | Input ");
Serial.println(Input);*/
// - Plot format -
if (tunning) {
Serial.print("PTerm:");
Serial.print(Kp * error);
Serial.print(",");
Serial.print("ITerm:");
Serial.print(Integral);
Serial.print(",");
Serial.print("DTerm:");
Serial.print(Kd * derivative);
Serial.print(",");
Serial.print("Output:");
Serial.print(Output);
Serial.print(",");
Serial.print("Setpoint:");
Serial.println(Setpoint);
}
return Output;
}