From dfbb403fcd4d3d6ceec22d2e70091686c53606f3 Mon Sep 17 00:00:00 2001 From: Sebastian Reichel Date: Thu, 7 Jun 2012 19:54:38 +0200 Subject: initial code import --- ctrl/pid-controller.vala | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ctrl/pid-controller.vala (limited to 'ctrl/pid-controller.vala') diff --git a/ctrl/pid-controller.vala b/ctrl/pid-controller.vala new file mode 100644 index 0000000..e77cda5 --- /dev/null +++ b/ctrl/pid-controller.vala @@ -0,0 +1,55 @@ +/* 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; + + private double constrain(double x, double a, double b) { + return a > x ? a : b < x ? b : x; + } + + 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(); + } +} -- cgit v1.2.3