/* Copyright 2012, Sebastian Reichel * Copyright 2012, Ted Carancho * * Ported from AeroQuad * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ public class PID { double P; double I; double D; Timer timer; double lastPosition; double integratedError; double windupGuard; public void calibrate(double P, double I, double D) { this.P = P; this.I = I; this.D = D; } public double update(double targetPosition, double currentPosition) { /* delta time in seconds */ double deltaPIDTime = timer.ellapsed() / 1000000.0; /* calculate error */ double error = targetPosition - currentPosition; integratedError += error * deltaPIDTime; integratedError = constrain(integratedError, -windupGuard, windupGuard); double dTerm = D * (currentPosition - lastPosition) / (deltaPIDTime * 100); lastPosition = currentPosition; return P * error + I * integratedError + dTerm; } public void clear() { integratedError = 0; timer.start(); } }