/* 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; double lastPosition; uint64 previousPIDTime; double integratedError; double windupGuard; public double update(double targetPosition, double currentPosition) { /* calculate time delta */ uint64 currentTime = time_t(); uint64 deltaPIDTime = currentTime - previousPIDTime; previousPIDTime = currentTime; /* 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; previousPIDTime = time_t(); } }