-
Notifications
You must be signed in to change notification settings - Fork 4
/
pid.py
78 lines (53 loc) · 1.88 KB
/
pid.py
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# p=PID(3.0,0.4,1.2)
# p.setPoint(5.0)
# while True:
# pid = p.update(measurement_value)
class PID:
""" Discrete PID control """
def __init__(self, P=2.0, I=0.0, D=1.0, Derivator=0, Integrator=0, Integrator_max=500, Integrator_min=-500):
self.Kp = P
self.Ki = I
self.Kd = D
self.Derivator = Derivator
self.Integrator = Integrator
self.Integrator_max = Integrator_max
self.Integrator_min = Integrator_min
self.set_point = 0.0
self.error = 0.0
def update(self, current_value):
""" Calculate PID output value for given reference input and feedback """
self.error = self.set_point - current_value
self.P_value = self.Kp * self.error
self.D_value = self.Kd * (self.error - self.Derivator)
self.Derivator = self.error
self.Integrator = self.Integrator + self.error
if self.Integrator > self.Integrator_max:
self.Integrator = self.Integrator_max
elif self.Integrator < self.Integrator_min:
self.Integrator = self.Integrator_min
self.I_value = self.Integrator * self.Ki
PID = self.P_value + self.I_value + self.D_value
return PID
def setPoint(self, set_point):
""" Initilize the setpoint of PID """
self.set_point = set_point
self.Integrator = 0
self.Derivator = 0
def setIntegrator(self, Integrator):
self.Integrator = Integrator
def setDerivator(self, Derivator):
self.Derivator = Derivator
def setKp(self, P):
self.Kp = P
def setKi(self, I):
self.Ki = I
def setKd(self, D):
self.Kd = D
def getPoint(self):
return self.set_point
def getError(self):
return self.error
def getIntegrator(self):
return self.Integrator
def getDerivator(self):
return self.Derivator