PID 제어를 슬라이더로 이해하기

작성자

카테고리:

제어공학 수업에서 PID 를 배울 때 대부분은 전달함수와 근궤적을 먼저 만난다. 그러나 현장에서 PID 를 쓰는 방식은 그것과 거리가 멀다. 실제로는 이득 세 개를 만지면서 응답이 어떻게 변하는지 눈으로 보고 결정한다. 이 글은 그 감각을 먼저 얻게 하려는 목적으로 쓴다. 본문 중간에 직접 만질 수 있는 시뮬레이터를 두었으니, 읽으면서 계속 슬라이더를 움직여 보기를 권한다.

1. 제어 문제의 형태

제어란 원하는 값과 실제 값의 차이를 줄이는 일이다. 용어부터 정리한다.

  • 설정값 (SP, set point) r — 우리가 원하는 값. 목표 속도, 목표 위치, 목표 온도.
  • 측정값 (PV, process variable) y — 센서가 읽은 실제 값.
  • 오차 (error) e = r − y
  • 조작량 (MV, manipulated variable) u — 제어기가 내보내는 출력. 모터 전압, 히터 전력.
  • 제어 대상 (plant) — 조작량을 받아 측정값을 만들어 내는 물리계.
   r ──→(+)──→ e ──→ ┌─────────┐ ──→ u ──→ ┌─────────┐ ──→ y ──┬──→
         ↑           │ 제어기   │           │ 제어 대상 │        │
         │           │  PID    │           │  plant  │        │
         │           └─────────┘           └─────────┘        │
         └──────────────────── 센서 ────────────────────────────┘
                                 (−)

<그림 1> 되먹임 제어 루프 (feedback control loop)

PID 제어기는 오차 e 를 세 가지 방식으로 보고, 그 합을 조작량으로 내보낸다.

u(t) = Kp·e(t)  +  Ki·∫e(τ)dτ  +  Kd·de(t)/dt
    비례(P)      적분(I)      미분(D)

말로 바꾸면 이렇다. 비례항은 지금의 오차를 본다. 적분항은 그동안 쌓인 오차를 본다. 미분항은 오차가 변하는 기세를 본다. 세 항이 각각 현재·과거·미래를 담당한다고 설명하는 교재가 많은데, 그 비유는 외우기에는 좋으나 실제 튜닝에는 별 도움이 되지 않는다. 각 항이 응답의 어느 부분을 어떻게 바꾸는지를 몸으로 아는 편이 낫다.

2. 직접 만져 보기

아래가 그 시뮬레이터다. 슬라이더를 움직이면 계단 응답(step response)이 즉시 다시 그려진다. 파란 선이 측정값, 주황 선이 조작량이며, 회색 점선이 설정값이다. 흐린 선은 직전에 그려졌던 곡선이라 변화 방향을 확인할 수 있다.


<그림 2> PID 놀이터. 화면이 좁으면 가로가 넉넉한 기기에서 여는 편이 낫다.

먼저 해 볼 것은 「P 만」 버튼을 누르고 Kp 만 키워 보는 일이다. 응답이 빨라지는 대신 설정값에 닿지 못하고 멈추는 현상이 보일 것이다. 그것이 다음 절의 주제다.

3. 비례 제어 — 지금의 오차

가장 단순한 제어기는 오차에 상수를 곱해 내보내는 것이다.

u = Kp·e = Kp·(r − y)

제어 대상이 1차 지연계(first-order lag)라고 하자. 모터에 전압을 걸었을 때의 속도 응답이 이 형태다.

τ·dy/dt + y = K·u   (τ: 시정수, K: 정상상태 이득)

정상상태(steady state)에서는 dy/dt = 0 이므로 y = K·u 이다. 여기에 u = Kp(r − y) 를 대입하면

y = K·Kp·(r − y)
y·(1 + K·Kp) = K·Kp·r
∴ ess = r − y = r / (1 + K·Kp)

즉 비례 제어만으로는 오차가 절대 0 이 되지 않는다. 오차가 0 이 되면 조작량도 0 이 되어 버리기 때문이다. 모터를 목표 속도로 돌리려면 전압이 계속 걸려 있어야 하는데, 그 전압을 만들어 낼 오차가 필요한 것이다. 이 값을 정상상태 오차(steady-state error) 또는 오프셋(offset)이라 한다.

시뮬레이터의 「모터 속도」 대상은 K = 1 이므로 ess = r/(1+Kp) 이다. Ki 와 Kd 를 0 으로 두고 Kp 만 바꾸어 실제로 확인해 보면 다음과 같다.

Kp 이론값 r/(1+Kp) 시뮬레이션 결과
1 0.500 0.5000
3 0.250 0.2500
9 0.100 0.1000

<표 1> 비례 제어의 정상상태 오차 (설정값 r = 1)

표에서 보듯 Kp 를 키우면 오차는 줄어든다. 그렇다면 Kp 를 아주 크게 잡으면 될 것 같지만 그렇지 않다. Kp 를 키울수록 응답이 점점 크게 출렁이기 때문이다. 시뮬레이터에서 「모터 위치」 대상을 고르고 Ki 와 Kd 를 0 으로 둔 채 Kp 만 바꾸어 보면 다음과 같다.

Kp 1 2 3 5 7 9
오버슈트 0.1 % 7.0 % 14.2 % 24.5 % 31.4 % 36.6 %

<표 2> 비례 이득을 키울수록 오버슈트가 커진다 (모터 위치, Ki=Kd=0)

★주 1. 이 대상에서 Kp 를 12 이상으로 더 올려 보면 오버슈트가 41 % 부근에서 더 늘지 않는데, 조작량이 출력 제한에 걸리기 때문이다. 제한을 풀면 Kp = 45 에서 65 % 까지 올라간다. 실제 장비에서도 이런 이유로 이득을 올려도 응답이 기대만큼 나빠지지 않는 것처럼 보이는 경우가 있다. 이 문제는 6-(1) 절에서 다시 다룬다.

덧붙여, 이 대상은 2 차계이므로 이득을 아무리 키워도 수학적으로는 발산하지 않고 출렁임만 심해진다. 진짜 발산은 지연시간이 끼어들 때 일어난다 — 6-(2) 절에서 확인할 수 있다.

4. 적분 제어 — 쌓인 오차

정상상태 오차를 없애려면, 오차가 작더라도 그것이 오래 지속되면 조작량을 계속 키워 주는 장치가 필요하다. 오차를 시간에 대해 누적하면 된다.

uI = Ki·∫e(τ)dτ

오차가 남아 있는 한 적분값은 계속 커지므로, 조작량도 계속 커진다. 이 과정은 오차가 정확히 0 이 될 때까지 멈추지 않는다. 그래서 적분항을 넣으면 정상상태 오차가 사라진다.

대가는 있다. 적분은 과거를 보는 항이므로 본질적으로 느리고, 위상 지연(phase lag)을 만들어 안정도를 떨어뜨린다. Ki 를 과하게 넣으면 설정값을 넘어갔다가 되돌아오기를 반복하는 출렁임이 생긴다. 시뮬레이터에서 Ki 만 계속 키워 보면 응답이 점점 요동치는 것을 볼 수 있다.

5. 미분 제어 — 변화의 기세

미분항은 오차의 변화율을 본다. 측정값이 설정값을 향해 빠르게 접근하고 있으면 미리 제동을 건다.

uD = Kd·de/dt

여기서 흔한 오해를 하나 짚는다. 미분항의 값어치는 「오버슈트를 줄이는 것」이 아니다. 오버슈트만 줄이려면 Kp 를 낮추면 된다. 미분항의 진짜 값어치는 오버슈트를 키우지 않으면서 Kp 를 더 올릴 수 있게 해 주는 것, 즉 같은 안정도에서 더 빠른 응답을 얻게 해 주는 데 있다.

시뮬레이터에서 확인할 수 있는 수치로 보면 분명하다. 「모터 속도」 대상에서 「PI」 프리셋과 「PID」 프리셋을 번갈아 눌러 보라.

프리셋 Kp Ki Kd 오버슈트 정정시간
PI 3 6 0 0.0 % 0.65 s
PID 5 8 0.25 1.4 % 0.47 s

<표 3> 미분항을 넣으면 이득을 더 높이고도 안정하다

미분항 덕분에 Kp 를 3 에서 5 로, Ki 를 6 에서 8 로 올리고도 오버슈트가 1.4 % 에 그쳤고, 정정시간은 0.65 초에서 0.47 초로 27 % 빨라졌다. 이것이 D 를 쓰는 이유다.

★주 2. 실제 구현에서 미분은 오차 e 가 아니라 측정값 y 에 걸고 부호를 뒤집는다(derivative on measurement). 설정값이 계단으로 변할 때 de/dt 가 순간적으로 무한대가 되어 조작량에 충격이 실리는 현상(derivative kick)을 막기 위해서다. 이 시뮬레이터도 그렇게 구현되어 있다.

6. 현장에서 반드시 걸리는 세 가지

교과서의 PID 와 현장의 PID 를 가르는 것은 대부분 아래 세 가지다. 시뮬레이터 하단의 옵션으로 각각을 켜고 끄며 확인할 수 있다.

(1) 출력 포화와 적분 와인드업

실제 액추에이터의 출력에는 한계가 있다. 모터 드라이버의 최대 전류, 히터의 최대 전력 같은 것이다. 제어기가 계산한 조작량이 이 한계를 넘으면 잘려 나간다. 이것을 포화(saturation)라 한다.

문제는 이때 적분항이다. 출력은 이미 한계에 걸려 더 낼 것이 없는데도 오차는 여전히 남아 있으므로 적분값은 계속 쌓인다. 나중에 측정값이 설정값에 도달해도, 부풀어 오른 적분값을 도로 깎아 내리는 데 시간이 걸려 크게 넘어갔다 돌아온다. 이 현상이 적분 와인드업(integral windup)이다.

대책은 포화 중에 적분을 멈추는 것이다(안티 와인드업, anti-windup). 시뮬레이터에서 「출력 제한」을 ±1.2 정도로 낮추고 Ki 를 크게 올린 뒤 「안티 와인드업」 체크를 껐다 켜 보라. 같은 이득에서 오버슈트가 19.3 % 에서 0.8 % 로 떨어진다.

(2) 지연시간

조작량을 바꿔도 측정값이 즉시 반응하지 않고 일정 시간 뒤에야 움직이기 시작하는 경우가 있다. 이를 지연시간(dead time, 낭비시간)이라 한다. 컨베어로 재료가 이송되는 시간, 배관 내 유체의 이동 시간, 통신 주기, 센서의 처리 시간이 모두 여기 해당한다.

지연시간은 PID 가 가장 다루기 어려워하는 상대다. 제어기는 이미 지나간 정보를 보고 판단하게 되므로, 이득을 조금만 올려도 쉽게 발진한다. 시뮬레이터에서 「지연시간」 슬라이더를 0.3 초로 올려 보면 멀쩡하던 응답이 무너지는 것을 볼 수 있다. 지연시간이 시정수에 비해 크면 PID 로는 한계가 있고, 스미스 예측기(Smith predictor) 같은 별도 구조가 필요해진다.

(3) 측정 잡음과 미분

미분은 잡음을 증폭한다. 센서 신호에 섞인 작은 떨림도 미분하면 큰 값이 되어 조작량을 요동치게 만든다. 이 요동은 액추에이터의 수명을 깎고 소음과 발열을 만든다.

시뮬레이터에서 「측정 잡음」을 2 % 로 올린 뒤 Kd 를 넣었다 뺐다 해 보라. Kd 가 있을 때 조작량 그래프가 눈에 띄게 거칠어진다. 실제로 측정해 보면 조작량의 총 변동량이 10 배 이상 차이 난다.

그래서 실무의 미분항에는 반드시 저역통과 필터(low-pass filter)가 함께 붙는다. 상용 제어기에서 「미분 필터 계수」나 N 값으로 노출되는 항목이 그것이다. 잡음이 심한 공정에서는 아예 Kd 를 0 으로 두고 PI 로만 운전하는 경우도 흔하다.

★주 3. 온도 제어처럼 느리고 잡음이 있는 공정에서는 PI 가 표준이고, 모션 제어처럼 빠르고 센서가 깨끗한 경우에 PID 가 제 값을 한다. 「PID 니까 세 항을 다 써야 한다」는 생각은 버리는 편이 좋다.

7. 플랜트가 이미 적분기를 가진 경우

이 절은 학부 수업에서 잘 다루지 않지만 현장에서는 자주 만나는 상황이다.

모터의 위치를 제어한다고 하자. 속도를 적분하면 위치이므로, 제어 대상 안에 이미 적분기가 하나 들어 있다. 이런 계를 1형 계통(type 1 system)이라 한다.

이 경우 비례 제어만으로도 정상상태 오차가 0 이 된다. 오차가 0 이 되어 조작량이 0 이 되더라도, 적분기가 그때까지의 값을 그대로 붙들고 있기 때문이다. 앞 절에서 본 「오차가 있어야 조작량이 나온다」는 논리가 여기서는 성립하지 않는다.

따라서 이 경우 Ki 는 필요 없을 뿐 아니라 해롭다. 적분기를 하나 더 얹는 셈이라 위상 지연이 겹치면서 출렁임만 커진다. 시뮬레이터의 「모터 위치」 대상에서 Kp 를 12, Kd 를 2.0 으로 고정하고 Ki 만 바꾸어 보면 다음과 같다.

Ki 오버슈트 정정시간 정상상태 오차
0 0.7 % 0.61 s 0.0000
0.5 1.5 % 0.59 s −0.0071
1.5 3.2 % 2.90 s −0.0137
3 5.6 % 4.36 s −0.0134
6 10.1 % 3.61 s −0.0055

<표 4> 적분형 플랜트에서 Ki 를 키울수록 나빠진다 (Kp=12, Kd=2.0)

Ki 를 0 에서 6 으로 올리는 동안 정상상태 오차는 전혀 개선되지 않았고(원래 0 이었으므로), 오버슈트는 0.7 % 에서 10.1 % 로, 정정시간은 0.61 초에서 3.61 초로 나빠지기만 했다. 위치 제어 루프를 PD 로 짜는 관행에는 이런 근거가 있다.

★주 4. 실제 장비에서 위치 루프에 Ki 를 조금 넣는 경우가 있는데, 이는 계단 응답을 개선하려는 것이 아니라 마찰이나 중력 같은 외란을 보상하기 위한 것이다. 목적이 다르므로 값도 아주 작게 잡는다.

8. 튜닝 순서

정해진 정답은 없으나, 아래 순서로 하면 대체로 실패하지 않는다.

  1. Ki = 0, Kd = 0 으로 두고 Kp 만 올린다. 응답이 출렁이기 시작하는 지점을 찾고, 그 값의 절반 정도로 되돌린다.
  2. Kd 를 넣어 출렁임을 잡는다. 잡음이 심한 계에서는 이 단계를 건너뛴다.
  3. Kd 덕분에 여유가 생겼으면 Kp 를 다시 올린다. 2~3 단계를 몇 번 오간다.
  4. 마지막으로 Ki 를 조금씩 넣어 정상상태 오차를 없앤다. 필요한 최소량만 쓴다. 플랜트가 적분형이면 이 단계는 생략한다.
  5. 포화·지연·잡음을 실제 조건으로 놓고 재확인한다. 이상적인 조건에서 맞춘 이득은 현장에서 대개 그대로 쓰이지 않는다.

지글러-니콜스(Ziegler–Nichols) 같은 고전적 정식화 방법도 있다. 시뮬레이터에 해당 프리셋을 넣어 두었는데, 눌러 보면 알겠지만 응답이 빠른 대신 오버슈트가 상당히 크다. 이 방법은 1942 년에 공정 제어를 대상으로 제안된 것으로, 출발점을 잡는 용도로는 쓸 만하나 최종값으로 쓰기에는 공격적이다.

맺으며

PID 는 이론이 어려워서가 아니라 세 이득이 서로 얽혀 있어서 어렵게 느껴진다. 하나를 바꾸면 나머지 둘의 적정값도 함께 움직이기 때문이다. 이런 종류의 감각은 수식을 들여다봐서는 좀처럼 생기지 않고, 손으로 돌려 보아야 붙는다.

시뮬레이터는 계속 열어 둘 것이니 필요할 때 다시 와서 만져 보아도 된다. 다뤄 주었으면 하는 주제나 이상한 점이 있으면 댓글로 남겨 주기 바란다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

어제 방문자 : 3 명오늘 방문자 : 1 명전체 방문자 : 584 명