====== PID 제어 ====== PID 제어 기능을 사용하여 목표값(SetValue)과 현재값(InputValue)의 차이를 기반으로 출력값을 계산할 수 있습니다. ==== PidConfig ==== ''PidConfig pidno, kp, ki, kd, outmin, outmax'' ^ 파라미터 ^ 설명 ^ | ''pidno'' | PID 채널 번호 (0 ~ 7) | | ''kp'' | 비례 게인 (×100 스케일 정수, 예: 150 → 1.50) | | ''ki'' | 적분 게인 (×100 스케일 정수, 예: 10 → 0.10) | | ''kd'' | 미분 게인 (×100 스케일 정수, 예: 5 → 0.05) | | ''outmin'' | 출력 최소값 (일반적으로 0) | | ''outmax'' | 출력 최대값 (예: PWM 사용 시 10000) | 지정한 PID 채널의 제어 파라미터를 설정합니다. 8개의 채널이 있으며 각 채널은 독립적으로 동작합니다. ==== 게인 값 타입 ==== kp, ki, kd는 정수(integer) 값으로 입력합니다. 내부적으로는 실수로 변환되어 연산되며, 입력 값은 100을 기준으로 스케일된 값입니다. 예: 150 → 1.50 10 → 0.10 5 → 0.05 ==== PidRun ==== ''output = PidRun(pidno, setvalue, inputvalue)'' ^ 파라미터 ^ 설명 ^ | ''output'' | 계산된 출력값 (반환값, outmin~outmax 범위) | | ''pidno'' | PID 채널 번호 | | ''setvalue'' | 목표값 (제어하려는 기준 값) | | ''inputvalue'' | 현재 측정값 (센서 또는 입력 값) | PID 연산을 수행하고 계산된 출력값을 반환합니다. ==== 사용 예 ==== Dim temp As Integer Dim output As Integer Dim setpoint As Integer setpoint = 800 Freepin 12 Pidconfig 0, 100, 0, 0, 0, 1000 Do temp = Tadin(0) output = Pidrun(0, setpoint, temp) Pwm 12, 1000, output Print "in:", Dec temp, " out:", Dec output, Cr Wait 100 Loop ==== 설명 ==== - SetValue와 InputValue의 차이를 기반으로 PID 연산을 수행합니다. - 반환된 output 값은 outmin과 outmax 범위로 제한됩니다. - 일반적으로 output은 pwm 듀티 제어 등에 사용됩니다. ==== 주의사항 ==== - PID는 일정한 주기로 호출해야 안정적으로 동작합니다. - 기본값은 kp=100, ki=0, kd=0으로 시작하는 것을 권장합니다. - 시스템 특성에 따라 kp, ki, kd 값을 조정해야 합니다. ===== PID 제어가 왜 필요한가요? ===== 단순히 ON/OFF만 사용하는 제어는 목표값 근처에서 계속 흔들리거나(진동), 목표값에 정확히 도달하지 못하는 경우가 많습니다. 예를 들어 히터를 사용하여 온도를 50°C로 유지한다고 가정해봅시다. 단순 ON/OFF 방식은: * 49°C → 히터 ON * 51°C → 히터 OFF 이런 방식으로 반복되어 온도가 계속 오르내리게 됩니다. PID 제어는 현재 오차(Error)를 계산하여, 출력 세기를 자동으로 조절합니다. 예를 들어: * 목표 온도와 차이가 크면 → 강하게 가열 * 목표 온도에 가까워지면 → 출력을 줄임 * 목표값을 넘으려 하면 → 출력을 미리 감소 이렇게 동작하여 목표값에 더 빠르고 안정적으로 도달할 수 있습니다. PID는 다음과 같은 곳에 많이 사용됩니다. * 온도 제어 (히터, 인큐베이터, 온도 유지) * 모터 속도 제어 (RPM 유지) * 압력/유량 제어 * 수위(Level) 유지 * 위치 제어 ==== PID 구성 요소 ==== PID는 다음 3가지 요소를 조합합니다. * **P (비례 제어)** : 현재 오차가 클수록 강하게 반응 * **I (적분 제어)** : 작은 오차가 계속될 때 누적 보정 * **D (미분 제어)** : 변화 속도를 보고 과도한 오버슈트를 줄임 처음에는 아래처럼 시작하는 것을 권장합니다. kp = 100 ki = 0 kd = 0 즉, **P 제어만 먼저 동작**시켜보고, 목표값 근처에서 흔들리거나 오차가 남는 경우에만 ''ki'' 와 ''kd'' 를 조금씩 추가하는 방식이 가장 쉽고 안정적입니다. [[..:index|← CUBLOC2 목차로 돌아가기]]