Загрузить файлы в «/»
This commit is contained in:
56
pid_graphics.py
Normal file
56
pid_graphics.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import time
|
||||
|
||||
# Параметры PID-регулятора
|
||||
kp = 0.5 # пропорциональный коэффициент
|
||||
ki = 0.1 # интегральный коэффициент
|
||||
kd = 0.2 # дифференциальный коэффициент (НОВОЕ!)
|
||||
|
||||
# Инициализация переменных
|
||||
setpoint = 50.0 # заданное значение
|
||||
input_val = 0.0 # текущее значение (с датчика)
|
||||
I = 0.0 # интегральная составляющая
|
||||
prev_error = 0.0 # предыдущая ошибка (для D-составляющей)
|
||||
dt = 0.1 # временной шаг
|
||||
|
||||
# Списки для хранения данных для графика
|
||||
time_points = []
|
||||
setpoint_points = []
|
||||
input_points = []
|
||||
out_points = []
|
||||
|
||||
# Симуляция работы PID-регулятора
|
||||
for t in range(100):
|
||||
# Обновляем входное значение (имитация системы)
|
||||
error = setpoint - input_val
|
||||
input_val += error * 0.1 * (1 + 0.1 * t) # имитация изменения системы
|
||||
|
||||
# Расчет управляющего сигнала (PID)
|
||||
P = error # пропорциональная составляющая
|
||||
I += error * dt # интегральная составляющая
|
||||
D = (error - prev_error) / dt # дифференциальная составляющая (НОВОЕ!)
|
||||
out = P * kp + I * ki + D * kd # общий управляющий сигнал
|
||||
|
||||
# Сохраняем предыдущую ошибку для D-составляющей
|
||||
prev_error = error
|
||||
|
||||
# Сохраняем данные для графика
|
||||
time_points.append(t * dt)
|
||||
setpoint_points.append(setpoint)
|
||||
input_points.append(input_val)
|
||||
out_points.append(out)
|
||||
|
||||
time.sleep(dt) # задержка для имитации реального времени
|
||||
|
||||
# Построение графика
|
||||
plt.figure(figsize=(10, 6))
|
||||
plt.plot(time_points, setpoint_points, label='Setpoint', linewidth=2)
|
||||
plt.plot(time_points, input_points, label='Input', linewidth=2)
|
||||
plt.plot(time_points, out_points, label='Output (PID)', linewidth=2)
|
||||
|
||||
plt.title('PID Controller Performance (with D-term)')
|
||||
plt.xlabel('Time (s)')
|
||||
plt.ylabel('Value')
|
||||
plt.legend()
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user