-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathPID.py
More file actions
70 lines (51 loc) · 1.83 KB
/
PID.py
File metadata and controls
70 lines (51 loc) · 1.83 KB
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
import time
class PID():
Kp = 0
Ki = 0
Kd = 0
dt = 1
limit = 0
def __init__(self, P = 0, I = 0, D = 0, dt = 1, limit = 0):
self.Kp = P
self.Ki = I
self.Kd = D
self.dt = dt
self.limit = limit
self.clear()
def clear(self):
self.__last_error = 0
self.__integral_error = 0
self.__last_time = time.time()
def update(self, error):
current_time = time.time()
delta_time = current_time - self.__last_time
if delta_time == 0: return 0
dt = self.dt / delta_time
self.__integral_error += error * dt
delta_error = (error - self.__last_error) / dt
output = self.Kp * error + self.Ki * self.__integral_error + self.Kd * delta_error
if self.limit != 0:
output = max(min(output, self.limit), -self.limit) / self.limit
self.__last_error = error
self.__last_time = current_time
return output
def __str__(self):
return 'PID (P = ' + str(self.Kp) + ', I = ' + str(self.Ki) + ', D = ' + str(self.Kd) + ')'
if __name__ == '__main__':
current_temp = 0
target_temp = 40
controller = PID(8, 0.3, 1, 1, 10)
print(controller)
max_value = -9999
min_value = 99999
while True:
time.sleep(1)
error = target_temp - current_temp
output = controller.update(error)
current_temp += output * 7
if max_value < current_temp: max_value = current_temp
if min_value > current_temp: min_value = current_temp
current_temp *= 0.9
print('Power: ' + str(round(output, 2)) + \
'\tTemp: ' + str(round(current_temp, 2)) + \
'\tMAX: ' + str(round(max_value, 2)) + '\tMIN: ' + str(round(min_value, 2)))