
위의 사진 처럼 Feedback system에서 pid 제어기는 controller의 역할을 할 수 있도록 input으로 error신호를 받고 output으로 plant에 가는 신호를 만든다. 에러 신호, e(t)를 받고 만들어지는 신호를 u(t)라고 하면 아래의 식으로 계산되고 우리는 각항의 계수를 조절해서 최적의 값을 찾는다.
위의 식을 그대로 해석하면 control signal인 u는 error의 크기의 propotioanl gain(Kp)배와 error의 적분의 integral gain(Ki)배 그리고 error의 미분의 derivative gain(Kd)배의 합이다.
controller가 영향을 줄 때까지 closed loop를 순회한다고 생각하면 된다.
PID controller의 전달함수는 위의 식을 라플라스 변환을 해서 얻을 수 있다.
매트랩으로는 아래의 방법으로 전달함수를 만들 수 있다.
kp = 1;
ki = 1;
kd = 1;
%1)
s=tf('s');
sys = kp + ki/s + kd*s
%2)
C=pid(kp,ki,kd);
sys=tf(C)
1. P, I, D 각 항의 특징
porpotional gain(Kp)는 control signal을 비례적으로 증가시킨다. 즉 목표값에 좀더 빠르게 도달하고 반응하도록 만드는 역할을 한다. 하지만 너무 과하면 overshoot이 만들어질 수 있다. 또한 Kp를 증가시키면 steady-state error를 감소시킬 수는 있지만 완전히 제거하지는 못한다.
derivative gain(Kd)는 error를 예측한다. Kp만 사용한다면 error가 증가하는 경우에만 input signal을 증가시킬 수 있다. 하지만 Kd를 적절하게 사용하면 error의 기울기가 가파르면 input signal이 더 커지게 되고 반대로 추가적인 damping을 줄 수 있다. 하지만 이러한 derivative항은 steady-state error에 영향을 주지는 못하며 만약 센서에 noise가 추가되어 error신호의 기울기가 작게 진동하는 경우 input 신호를 크게 증폭시킬 수 있다.
integral gain(Ki)는 steady-state error의 값을 감소시킨다. 만약 일정한 steady error가 존재하면 적분기에서 이러한 error는 쌓이게 되고 control signal을 증가시켜 error를 감소시킨다. 하지만 이러한 적분항은 시스템을 더 느리게 하거나 진동하게 만들 수 있는데 에러의 부호가 바뀌는 경우 에러가 실제보다 적은 것으로 인식이 되어서 이러한 현상이 일어난다.
아래 표로 정리할 수 있다.
| 각각을 증가시 | Rise Time | OverShoot | Settling Time | Steady-State Error |
| Kp | 감소 | 증가 | 조금 감소 | 감소 |
| Ki | 감소 | 증가 | 증가 | 감소 |
| Kd | 조금 변화 | 감소(damping) | 감소 | 변화X |
Kp : 빠르게 반응, steady-state error감소(완전히 제거 불가능)
Ki : steady-state error 제거 가능, 시스템이 느려질 가능성(settling time 증가)
Kd : damping의 역할(settling time, overshoot 감소), 좀더 빠르게 반응(rise time 조금 감소)
2. mas-spring-damper system과 PID
질량이 m(1kg)인 물체에 스프링(k=20)과 댐퍼(b=10)가 붙어있다. 1N이 가해질 때 response를 나타내고 closed loop system에 PID controller가 부착된 경우 각 항의 계수 값을 변경하면서 그 결과를 비교하여라.
시스템의 전달함수는 아래의 식으로 표현된다.
위의 문제를 매트랩에 넣고 step input을 가하면 아래와 같은 결과가 나온다.
sys=tf([1],[1,10,20]);
step(sys);

시스템의 DC gain은 1/20이므로 0.05가 steady-stare value가 된다. steady-state error는 0.95로 크고 rise time은 대략 1초가 걸리고 settling time은 1.5초가 걸린다. 여기서 우리는 아래를 만족하는 controller를 만들어보자
- rise time 감소
- settling time 감소
- steady-state error 제거
위에서는 open loop ststem이다 이를 closed loop system으로 변경하고 PID 제어기의 각 계수가 만드는 변화를 확인해보자. C(S)를 constroller하고 했을 때 closed loop system의 전달함수 식이다.
1)Proportional control
비례제어만 추가하면 controller의 전달함수는 아래처럼 표현되고 이를 정리하면 전체 closed loop system의 전달함수는 다음과 같다.
매트랩에 아래 코드를 이용해서 결과를 확인해보자
sys=tf([1],[1,10,20]);
Kp=300;
C=pid(Kp);
T=feedback(C*sys,1);
step(T);

Kp로 인해서 rise time, steady-state error가 감소하고 overshoot이 증가했음을 확인할 수 있다.
2)Proportional-Derivative control
여기에 미분제어까지 포함하면 controller의 전달함수는 아래처럼 표현되고 이를 정리하면 전체 closed loop system의 전달함수는 다음과 같다.
매트랩에 아래 코드를 이용해서 결과를 확인해보자
Kp=300;
Kd=10;
C=pid(Kp,0,Kd);
T=feedback(C*sys,1);
t = 0:0.01:1.4;
step(T,t);

미분항을 추가한 결과 overshoot이 감소하고 settling time 또한 감소했을을 확인할 수 있다. rise time과 steady-state error도 미세하게 영향을 받았다.
미분항은 추가적인 damping의 역할을 한다.
3)Proportional Integral control
다음은 PI control로 비례제어와 적분제어만을 사용한 경우이다. controller의 전달함수는 아래처럼 표현되고 이를 정리하면 전체 closed loop system의 전달함수는 다음과 같다.
Kp를 30으로 줄이고 Ki를 70으로 해서 아래 매트랩 코드를 통해서 결과를 확인해 보자
sys=tf([1],[1,10,20]);
Kp=30;
Ki=70;
C=pid(Kp,Ki);
T=feedback(C*sys,1);
t = 0:0.01:1.4;
step(T,t);

적분항 또한 시스템을 빠르게 하기 때문에(rise time 감소, overshoot 증가) Kp를 줄이고 Ki를 추가했다.
가장 중요한 점은 적분항을 추가함으로 steady-state error가 감소했다는 점이다. 하지만 settling time은 증가했음을 확인할 수 있다.
4)Proportional - Integral - Derivative control
이제 pid모두 사용해 보자. controller의 전달함수는 아래처럼 표현되고 이를 정리하면 전체 closed loop system의 전달함수는 다음과 같다.
Kp는 350, Ki는 300, Kd는 50으로 해서 아래 매트랩 코드를 통해 결과를 확인해보자
sys=tf([1],[1,10,20]);
Kp=350;
Ki=300;
Kd=50;
C=pid(Kp,Ki,Kd);
T=feedback(C*sys,1);
t = 0:0.01:1.4;
step(T,t);
axis([0 1.4 0 1.2])

3. PID controller을 설계하는 순서
- open-loop response를 그리고 어떤 것을 개선해야 할지를 정한다.
- rise time을 줄이기 위해서는 proportional control을 추가한다.
- overshoot을 줄이기 위해서는 derivative control을 추가한다.
- steady-state error를 줄이기 위해서는 integral control을 추가한다.
- 원하는 response를 얻을 때까지 Kp, Ki, Kd의 값을 조절한다(이때 각 제어기의 특성을 파악하면 좋다)
controller를 설계할 때 pid 모두 사용하지 않아도 되며 간단할 수록 좋다.
4. 자동으로 적절한 PID 값 찾기
위의 방법을 사용해서 하나씩 해보면서 각 계수로 적절한 값을 찾아도 되지만 matlab에는 이를 위한 더 강력한
도구가 존재한다.
pidtune()함수로 적절한 값을 얻거나 pidTuner()로 gui를 이용해서 적절한 값을 구할 수 있다.
이 방법으로 구해지는 값은 response time, bandwidth(반응할 수 있는 주파수의 범위) 등의 성능(performance)와 stability margins 등의 견고성(robustness)의 균형을 이루는 값이다.
고정적으로 알고리즘은 60degree의 phase margin을 갖도록 설계되어 있다.
다음과 같이 매트랩에서 사용할 수 있고 그 결과이다.
sys=tf([1],[1,10,20]);
Kp=350;
Ki=300;
Kd=50;
C=pid(Kp,Ki,Kd);
T=feedback(C*sys,1);
%pidtune(sys,'p')
pidTuner(sys,'p');

위의 코드를 실행하면 다음과 같은 화면이 나온다.
우측 위쪽에 파라미터 표시를 누르면 현재 설정된 각 계수의 값이 나타난다. 처음 코드에서 Kp값만을 조절하기로 했으므로 Kp값에 대해서만 나온다.
또한 위에서 응답시간을 줄이면 Kp는 커지면서 시스템은 빨라지고 응답시간을 늘리면 Kp는 작아지면서 시스템은 느려진다. 처음에 나온 값은 성능과 견고함이 균형을 이룬 값으로 phase margin이 60도인 값이다.
다음과 같은 코드를 실행하면 현재 주어진 controller와 변경된 값을 비교할 수 있게 해준다.
sys=tf([1],[1,10,20]);
Kp=350;
Ki=300;
Kd=50;
C=pid(Kp,Ki,Kd);
T=feedback(C*sys,1);
pidTuner(sys,C);

여기서 기준 응답을 우리가 처음 제공한 controller의 반응이고 조정된 응답은 파라미터 표시에서 값을 변경했을 때 나타나는 값이다.
좌측 위의 영역을 주파수로 바꾸면 대역폭(bandwidth)와 위상여유(phase margin)을 변경할 수 있다. bandwidth를 높이면 시스템이 빠르게 반응할 수 있지만 센서의 노이즈로 인해서 민감해 질 수 있고 phase margin을 높이면 시스템이 더 안정적으로 바뀌지만 시스템의 성능이 저하될 수 있다.
'control tutorials > introduction' 카테고리의 다른 글
| Simscape (0) | 2025.01.19 |
|---|---|
| Simulink Control (0) | 2025.01.15 |
| Frequency Domain (0) | 2025.01.14 |
| Root Locus(근궤적) (0) | 2025.01.14 |
| Simulink Modeling (0) | 2024.11.28 |