[아두이노] PID 제어의 함정: 왜 출력값만 단순히 자르면(Clamping) 안 될까?
아두이노로 온도를 제어할 때, 주변부 보호를 위해 "블럭 온도가 50도를 넘으면 무조건 출력을 차단해!"라는 식의 조건문을 넣는 경우가 많습니다. 하지만 PID 제어에서 이런 **단순 클램핑(Clamping)**은 예기치 못한 폭주를 불러올 수 있습니다. 오늘은 그 이유와 해결책을 알아봅니다. 1. 단순 클램핑의 복수: 'Integral Windup' 현상 목표 온도는 25도인데, 주변부 보호를 위해 PTC 블럭의 출력을 강제로 제한했다고 가정해 봅시다. 이때 PID 제어기의 내부에서는 어떤 일이 벌어질까요? 불만의 누적: PID의 I(적분) 항은 목표값에 도달하지 못하면 오차를 계속해서 쌓아 올립니다. 출력 억제: 소프트웨어로 출력을 강제 차단했기 때문에 실제 온도는 오르지 않습니다. 적분항의 폭주: PID는 "전력을 더 쏟아부어야 해!"라며 내부적으로 적분값을 최대치까지 쌓아둡니다. 이를 Windup(와인드업) 현상이라고 합니다. 대참사: 드디어 온도가 목표치에 도달하여 제한이 풀리는 순간, 쌓여있던 엄청난 적분값 때문에 출력이 급발진하며 온도가 목표치를 훌쩍 넘어버리는 심각한 오버슈트 가 발생합니다. 2. 해결책: "PID 엔진에 직접 한계를 알려주라" 가장 좋은 방법은 PID 연산이 끝난 '결과'를 건드리는 것이 아니라, PID 연산 과정 자체에 개입 하는 것입니다. ① 동적 출력 제한 (Dynamic Output Limits) 아두이노 PID 라이브러리의 SetOutputLimits(min, max) 함수를 실시간으로 활용하는 방식입니다. 로직: PTC 블럭의 온도가 45도에서 50도 사이로 진입하면, PID가 낼 수 있는 max 출력값 자체를 서서히 낮춥니다. 효과: 라이브러리 내부에서 "아, 지금은 여기까지가 최대구나"라고 인식하며 적분항을 스스로 조절(안티 와인드업)합니다. 덕분에 제한이 풀려도 온도가 튀지 않습니다. ② 캐스케이...