W7_PIDController

!pip install control
Collecting control
  Downloading control-0.10.0-py3-none-any.whl (513 kB)
[?25l     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/513.9 kB ? eta -:--:--
     ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.0/513.9 kB 1.2 MB/s eta 0:00:01
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 512.0/513.9 kB 7.9 MB/s eta 0:00:01
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 513.9/513.9 kB 6.5 MB/s eta 0:00:00
[?25hRequirement already satisfied: numpy>=1.23 in /usr/local/lib/python3.10/dist-packages (from control) (1.25.2)
Requirement already satisfied: scipy>=1.8 in /usr/local/lib/python3.10/dist-packages (from control) (1.11.4)
Requirement already satisfied: matplotlib>=3.6 in /usr/local/lib/python3.10/dist-packages (from control) (3.7.1)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (4.50.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (1.4.5)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (24.0)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (9.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (3.1.2)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=3.6->control) (1.16.0)
Installing collected packages: control
Successfully installed control-0.10.0
import numpy as np
import control as ctl
import matplotlib.pyplot as plt

Motor Model

Jθ̈+bθ̇=K⋅iLdidt+R⋅i=V−Kθ̇ \begin{aligned} J \ddot{\theta} + b \dot{\theta} &= K \cdot i \\ L \frac{di}{dt} + R \cdot i &= V - K \dot{\theta} \end{aligned}

(J⋅s2+b⋅s)⋅Θ(s)=K⋅I(s)(L⋅s+R)⋅I(s)=V(s)−K⋅s⋅Θ(s) \begin{aligned} (J \cdot s^2 + b \cdot s) \cdot \Theta(s) &= K \cdot I(s) \\ (L \cdot s + R) \cdot I(s) &= V(s) - K \cdot s \cdot \Theta(s) \end{aligned}

G(s)=s⋅Θ(s)V(s)=K(J⋅s+b)(L⋅s+R)+K2G(s) = \frac{s \cdot \Theta(s)}{V(s)} = \frac{K}{(J\cdot s+b)(L\cdot s+R)+K^2}

PID Controller

C(s)=Kp+Kis+Kds=Kds2+Kps+Kis C(s) = K_{p} + \frac {K_{i}} {s} + K_{d}s = \frac{K_{d}s^2 + K_{p}s + K_{i}} {s}

Controller performance specification

J = 0.01
b = 0.1
K = 0.01
R = 1
L = 0.5
s = ctl.tf([1,0],[1])
G = K/((J*s+b)*(L*s+R)+K**2)

Kp = 500
Ki = 300
Kd = 30
C = Kp + Ki/s + Kd*s
sys_cl = ctl.feedback(C*G,1)

t,y = ctl.step_response(sys_cl,np.arange(0,0.5,0.01))
plt.plot(t,y)
plt.xlabel('Time')
plt.title('Response of a Cruise System')
plt.axis([0, 0.5, 0, 1.1])

info = ctl.step_info(sys_cl)
for item in info:
  print(item,format(info[item],'.2f'))
RiseTime 0.03
SettlingTime 0.09
SettlingMin 0.91
SettlingMax 1.02
Overshoot 2.07
Undershoot 0.00
Peak 1.02
PeakTime 0.08
SteadyStateValue 1.00
<Figure size 640x480 with 1 Axes>
실행 결과