지난 12편(FOC 펌웨어 구현)에서 MCU에 FOC를 올릴 때 챙길 것들을 봤다면, 이번 편은 FOC 성능을 실제로 좌우하는 d·q축 PI 전류제어기 게인을 어떻게 정하는가입니다. "Kp, Ki를 감으로 올렸다 내렸다"에서 벗어나, 모터 파라미터(R, L)와 원하는 대역폭만으로 계산하는 방법을 정리합니다.
핵심 요약
① 전류 루프의 플랜트는 축마다 1/(Ls+R)인 1차 시스템이다.
② PI의 영점으로 모터의 전기 극점을 상쇄하면 Kp = L·ωc, Ki = R·ωc로 게인이 바로 나온다.
③ 대역폭 ωc는 PWM·샘플링 지연을 고려해 보통 제어 주파수의 1/10~1/20 이하로 잡는다.
1. 전류 루프의 플랜트 모델
PMSM의 d·q축 전압 방정식은 다음과 같습니다.
v_d = R·i_d + L_d·di_d/dt − ω_e·L_q·i_q
v_q = R·i_q + L_q·di_q/dt + ω_e·(L_d·i_d + ψ_f)
뒤쪽의 ω_e 항(교차 결합 항과 역기전력)을 피드포워드로 따로 보상한다고 가정하면, 각 축은 단순한 RL 회로가 됩니다.
G(s) = I(s) / V(s) = 1 / (L·s + R)
전기적 시정수는 τ = L/R, 극점은 s = −R/L 입니다.
2. 극점-영점 상쇄로 게인 계산하기
PI 제어기를 다음처럼 쓰면 영점이 s = −Ki/Kp 에 생깁니다.
C(s) = Kp + Ki/s = Kp · (s + Ki/Kp) / s
이 영점을 모터 극점 위치(−R/L)에 맞추면, 즉 Ki/Kp = R/L 로 두면 개루프 전달함수가 깔끔하게 정리됩니다.
C(s)·G(s) = Kp / (L·s)
폐루프 = ωc / (s + ωc), ωc = Kp / L
결과적으로 전류 루프가 대역폭 ωc인 1차 저역통과 필터처럼 동작하고, 오버슈트 없는 응답을 얻습니다. 게인 식은 다음과 같습니다.
| 게인 | 식 | 단위 |
|---|---|---|
| Kp | L · ωc | V/A |
| Ki | R · ωc | V/(A·s) |
IPMSM처럼 L_d ≠ L_q 이면 d축은 L_d, q축은 L_q로 축별로 따로 계산합니다.
3. 대역폭 ωc는 얼마로 잡나
이론상 ωc를 키울수록 빨라지지만, 실제 디지털 제어에는 지연이 있습니다. 전류 샘플링 → 연산 → 다음 PWM 주기 반영까지 보통 약 1.5 샘플 주기(1.5·Ts)의 지연이 생기고, 이것이 위상 여유를 깎아 먹습니다.
- 실무 가이드: 전류 루프 대역폭 f_c ≈ 제어(샘플링) 주파수의 1/10 ~ 1/20
- 속도 루프는 다시 전류 루프 대역폭의 1/5 ~ 1/10 수준으로
- 전류 센싱 필터(RC, 디지털 LPF)가 있다면 그 지연도 함께 고려
4. 계산 예시
예를 들어 R = 50 mΩ, L = 200 µH, PWM·제어 주파수 20 kHz(Ts = 50 µs)인 모터라고 하겠습니다. 대역폭을 제어 주파수의 1/20인 1 kHz로 잡으면:
ωc = 2π × 1000 ≈ 6283 rad/s
Kp = L·ωc = 200e-6 × 6283 ≈ 1.26 V/A
Ki = R·ωc = 0.05 × 6283 ≈ 314 V/(A·s)
이산화 시 Ki·Ts = 314 × 50e-6 ≈ 0.0157
MCU 코드에서는 적분기에 매 주기 Ki·Ts·error를 더하므로, 미리 Ki·Ts를 상수로 계산해 두면 연산이 줄어듭니다.
5. 구현 코드 (이산 PI + Anti-windup)
typedef struct {
float kp; /* V/A */
float ki_ts; /* Ki * Ts */
float integ; /* 적분 누적값 [V] */
float out_max; /* 출력 한계 [V] */
} PI_t;
float PI_Run(PI_t *pi, float ref, float fb, float ff)
{
float err = ref - fb;
float p = pi->kp * err;
float out = p + pi->integ + ff;
/* 출력 포화 */
float sat = out;
if (sat > pi->out_max) sat = pi->out_max;
if (sat < -pi->out_max) sat = -pi->out_max;
/* 포화되지 않았거나, 포화를 풀어주는 방향일 때만 적분 (clamping) */
if ((sat == out) || ((out > 0.0f) != (err > 0.0f))) {
pi->integ += pi->ki_ts * err;
}
return sat;
}
d·q축 출력 전압은 최종적으로 DC 링크 전압으로 정해지는 전압 원(√(v_d² + v_q²) ≤ V_dc/√3) 안에 있어야 합니다. 보통 d축을 우선 확보하고 남은 전압을 q축에 주는 방식으로 제한합니다.
6. 디커플링 피드포워드
극점-영점 상쇄 설계는 교차 결합 항이 보상됐다는 전제 위에 있습니다. 고속에서 이 항을 빼먹으면 d·q 전류가 서로 끌려다니며 응답이 틀어집니다.
ff_d = −ω_e · L_q · i_q
ff_q = ω_e · (L_d · i_d + ψ_f)
위 코드의 ff 인자로 넣어주면 됩니다. 저속 위주 응용이라도 ψ_f 항(역기전력)만큼은 넣어두면 q축 적분기 부담이 크게 줄어듭니다.
7. 튜닝 후 검증 체크리스트
- d축 스텝 응답: 로터를 구속하거나 i_q = 0에서 i_d 지령을 스텝으로 주고, 상승시간이 약 2.2/ωc 근처인지 확인
- 오버슈트: 거의 없어야 정상. 크다면 L 값이 실제보다 크게 잡혔거나 지연이 큰 것
- 인덕턴스 포화: 고전류에서 L이 줄면 대역폭이 자동으로 커져 발진할 수 있음 → 전류 구간별 게인 스케줄링 검토
- 온도에 따른 R 변화: 구리 저항은 온도에 따라 변하므로 저속·고온에서 적분 응답 확인
- 노이즈: Kp가 크면 전류 센싱 노이즈가 전압 지령으로 그대로 증폭됨
정리
PI 전류제어기 게인은 모터 R·L 측정 → 대역폭 결정 → Kp = L·ωc, Ki = R·ωc 세 단계면 출발점이 나옵니다. 그 다음은 실측 스텝 응답으로 L 오차와 지연을 확인하며 미세 조정하면 됩니다. 다음 편에서는 이 전류 루프 위에 올라가는 속도 제어기 튜닝을 다룰 예정입니다.
이전 글: FOC 펌웨어 구현 | 모터제어 12편 · MTPA와 약자속 제어 | 모터제어 11편
※ 예시 수치는 설명용 가정값입니다. 실제 모터는 R·L을 측정(LCR 미터, 전압 펄스 응답 등)해서 사용하세요.
'모터제어' 카테고리의 다른 글
| FOC 펌웨어 구현: MCU에서 실제로 돌릴 때 챙겨야 할 것들 | 모터제어 12편 (0) | 2026.10.03 |
|---|---|
| MTPA와 약자속 제어(Field Weakening): IPMSM 고속 운전 원리 | 모터제어 11편 (0) | 2026.10.03 |
| 센서리스 추정 알고리즘 시뮬레이션: BEMF Observer와 PLL로 각도 추정 | 모터제어 10편 (0) | 2026.10.03 |
| FOC 시뮬레이션(MATLAB/Simulink)으로 보는 PMSM 정밀 제어 | 모터제어 9편 (0) | 2025.04.12 |
| 센서리스 FOC 원리: 홀센서·엔코더 없이 로터 위치 추정 | 모터제어 8편 (0) | 2025.04.12 |