글
- PID Control : 측정한 Input 과 원하는 Setpoint 간의 오차를 최소화 하도록 Output을 조정한다.
ex) 자동차에 비유할 경우 Input = 현재 속도, Setpoint = 원하는 속도, Output = 페달을 밟는 정도가 되겠다.
- PID Equation
위의 식만 있으면 모든게 ok
- 어떻게 구현하는가
* 오차 : Setpoint - Input
* 적분 : ( 오차 * 시간변화량 )을 더해나간다.
* 미분 : ( 오차 - 이전의 마지막 오차 ) / 시간변화량
- 구현하자
#ifndef MYPID_H
#define MYPID_H
struct var{
double Input, Output, SetPoint;
double errSum, lastErr;
unsigned long lastTime;
double Kp, Ki, Kd;
void Init( double p, double i, double d ){
Kp = p;
Ki = i;
Kd = d;
}
};
void Calculate( struct var &a )
{
// Calculate timeChange
unsigned long now = millis();
double timeChange = ( double ) ( now - a.lastTime );
// Calculate error
double error = a.SetPoint - a.Input;
// Calculate Integral
a.errSum += ( error * timeChange );
// Calculate Difference
double dErr = ( error - a.lastErr ) / timeChange;
// Calculate Output
a.Output = a.Kp * error + a.Ki * a.errSum + a.Kd * dErr;
// Remember for next time
a.lastErr = error;
a.lastTime = now;
}
#endif
- 보완 되어야 할 부분
개념상 하나의 구조체로 모든 변수들을 묶었으나 각각의 변수들이 초기값으로 어떤 값을 가져야 하는지는 고민해보아야 하며,
독립적인 변수들은 구조체로부터 따로 분리해서 관리하거나 알아서 세팅해야 할 것 이다.
RECENT COMMENT