동작 원리
PID 제어기는 기준값과 측정값의 오차로 출력을 계산합니다. 비례항은 현재 오차에, 적분항은 정상 상태 오차를 없애는 데, 미분항은 오차가 변하는 속도에 반응합니다. 전력전자에서는 PI 제어기가 전류 루프와 전압 루프의 주력입니다.
이 생성기는 고정 샘플링 주기 dt에 대한 이산 시간 구현 코드를 만들어, 제어 인터럽트에 바로 넣을 수 있게 합니다. C(ISR과 TI C2000 CLA용 직접 접근 방식 포함), C++, Python, Arduino 중에서 고를 수 있고, 안티와인드업, 피드포워드, 입력·출력 제한을 켤 수 있습니다.
여기서 안티와인드업은 적분 누적값을 ±windup_limit로 제한하는 방식이라, 출력이 포화된 동안 적분값이 계속 커지지 않습니다. 그래서 포화에서 벗어날 때 큰 오버슈트를 막습니다. Ki × 한계값이 출력 범위와 비슷하도록 한계값을 정하세요. 출력 제한은 명령값을 PWM 듀티 범위 같은 구간으로 자릅니다.
설계 절차
- 1샘플링 주기 dt를 실제 인터럽트 주기에 맞추고 일정하게 유지합니다.
- 2PI 제어기로 시작합니다. 원하는 교차 주파수에 맞춰 Kp를 정한 뒤, 적분 영점이 교차 주파수보다 낮도록 Ki를 더합니다.
- 3출력 제한을 구동기의 물리적 범위로 설정합니다. 예를 들어 PWM 듀티는 0~1입니다.
- 4안티와인드업을 켜고, Ki에 한계값을 곱한 값이 출력 범위와 대략 일치하도록 적분 한계를 정합니다.
- 5플랜트에 추가 위상 앞섬이 필요할 때만 미분항을 더하고, 미분이 잡음을 증폭하므로 먼저 측정값을 필터링합니다.
공식
- 연속 시간 PID
- u(t) = Kp·e(t) + Ki·∫e dt + Kd·de/dt
- 이산 적분 (직사각형)
- I[k] = I[k−1] + e[k] · dt
- 이산 미분
- D[k] = (e[k] − e[k−1]) / dt
- 출력
- u[k] = Kp·e[k] + Ki·I[k] + Kd·D[k]
계산 예시
20 kHz로 샘플링하는 전류 루프라면 dt = 50 µs로 두고 PI를 고른 뒤, 안티와인드업을 켜고 출력을 듀티 범위 0~1로 제한합니다. 생성된 함수는 PWM 인터럽트마다 한 번씩 전류 기준값과 측정 전류를 넣어 호출하면 됩니다.
흔한 실수
- 실제 인터럽트 주파수와 맞지 않는 dt를 써서 Ki와 Kd가 엉뚱한 크기로 스케일링되는 것입니다.
- 제어기가 동작하는 중에 적분 상태를 처리하지 않고 게인을 바꾸어 출력에 튐이 생기는 것입니다.
- 미분을 측정값이 아니라 오차에 적용하는 것입니다. 기준값이 바뀔 때마다 스파이크가 생깁니다.
- 출력 제한과 안티와인드업을 빼먹는 것입니다. 포화 이후 큰 오버슈트로 이어집니다.
자주 묻는 질문
PI와 PID 중 무엇을 써야 하나요?
전력 변환기의 전류·전압 루프는 대부분 PI를 씁니다. 미분항은 측정 잡음과 스위칭 리플을 증폭하므로, 플랜트에 추가 위상 앞섬이 필요할 때만 씁니다.
Kp와 Ki는 어떻게 정하나요?
플랜트 모델과 원하는 교차 주파수에서 출발합니다. 전류 루프는 보통 스위칭 주파수의 1/10 이하로 잡고, 보드 선도에서 위상 여유를 확인하세요.
샘플링 시간이 왜 중요한가요?
이산 적분과 미분은 dt로 스케일링됩니다. 실제 인터럽트 주기와 다른 dt를 쓰면 실효 이득이 바뀝니다.
계산 결과는 공학적 추정치입니다. 데이터시트, 시뮬레이션, 측정으로 설계를 확인하세요.