package com.aelitis.azureus.core.util.loopcontrol.impl;
import com.aelitis.azureus.core.util.loopcontrol.LoopControler;
public class PIDLoopControler implements LoopControler {
double pGain;
double iGain;
double dGain;
double iState;
double iMin = -5000;
double iMax = 5000;
double dState;
public PIDLoopControler(double pGain,double iGain, double dGain) {
this.pGain = pGain;
this.iGain = iGain;
this.dGain = dGain;
}
public double updateControler(double error, double position) {
//Proportional
double pTerm = pGain * error;
iState += error;
if(iState > iMax) iState = iMax;
if(iState < iMin) iState = iMin;
double iTerm = iGain * iState;
double d = dState - position;
double dTerm = dGain * d;
dState = position;
double result = pTerm + iTerm - dTerm;
System.out.println("PID p,i,d (" + pGain + "," + iGain + "," + dGain +") : is,ds (" + iState + "," + d + ") p,i,d (" + pTerm + "," + iTerm + "," + dTerm + ") => " + result);
return result;
}
public void reset() {
dState = 0;
iState = 0;
}
}
|