Mon, 08 Apr 2024 10:57:12 +0200
Removed lcd-buffer create logmessage. Combined Keys and Delay states.
/***************************************************************************** * Copyright (C) 2015..2020 * * Michiel Broek <mbroek at mbse dot eu> * * This file is part of the mbsePi-apps * * This 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 2, or (at your option) any * later version. * * mbsePi-apps 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 ThermFerm; see the file COPYING. If not, write to the Free * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *****************************************************************************/ #include "thermferm.h" #include "pid.h" void InitPID(pid_var *pid, int type) { pid->Err = pid->InputLast = pid->iState = 0.0; pid->Input = pid->OutP = pid->SetP = 0.0; pid->pGain = pid->iGain = pid->dGain = 0.0; pid->idleRange = 0.4; pid->Mode = PID_MODE_NONE; pid->Type = type; pid->iMax = 100.0; } void UpdatePID(pid_var *pid) { if (pid->Mode == PID_MODE_AUTO) { double dInput; if (pid->Type == PID_TYPE_HEAT) pid->Err = pid->SetP - pid->Input; else pid->Err = pid->Input - pid->SetP; dInput = (pid->Input - pid->InputLast); /* * Calculate the integral state with appopriate limiting. */ pid->iState += (pid->iGain * pid->Err); pid->iState -= (pid->pGain * dInput); // Add Proportional on Measurement if (pid->iState > pid->iMax) pid->iState = pid->iMax; else if (pid->iState < 0) pid->iState = 0; pid->OutP = pid->iState - pid->dGain * dInput; pid->InputLast = pid->Input; } else if (pid->Mode == PID_MODE_BOO) { /* * Mode Bang On Off */ pid->InputLast = pid->Input; if (pid->Type == PID_TYPE_HEAT) pid->Err = pid->SetP - pid->Input; else pid->Err = pid->Input - pid->SetP; if (pid->OutP && (pid->Err <= 0.0)) pid->OutP = 0.0; else if ((pid->OutP == 0.0) && (pid->Err > pid->idleRange)) pid->OutP = pid->iMax; pid->iState = 0.0; } else { /* * While in manual mode, stay ready for bumpless switch to * auto. */ pid->InputLast = pid->Input; pid->OutP = pid->iState = 0.0; } if (pid->OutP > pid->iMax) pid->OutP = pid->iMax; if (pid->OutP < 0.0) pid->OutP = 0.0; }