- 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

 

 

 

 

- 보완 되어야 할 부분

 

개념상 하나의 구조체로 모든 변수들을 묶었으나 각각의 변수들이 초기값으로 어떤 값을 가져야 하는지는 고민해보아야 하며, 

 

독립적인 변수들은 구조체로부터 따로 분리해서 관리하거나 알아서 세팅해야 할 것 이다. 

 

by ST_story 2012. 12. 26. 16:12
by ST_story 2012. 12. 11. 23:32
by ST_story 2012. 12. 8. 20:01
| 1 2 3 4 5 |