====== 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 목차로 돌아가기]]