Tue, 15 Sep 2015 17:26:26 +0200
Switched to new device read code. Removed the incomplete support for the DS2408 1-wire chip.
/***************************************************************************** * Copyright (C) 2015 * * 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->ErrLast = 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 pTerm, dTerm, iTerm; if (pid->Type == PID_TYPE_HEAT) pid->Err = pid->SetP - pid->Input; else pid->Err = pid->Input - pid->SetP; /* * Calculate the integral state with appopriate limiting. * Use ErrLastLast as iState */ pid->iState += pid->Err; if (pid->iState > PID_WINDUP_GUARD) pid->iState = PID_WINDUP_GUARD; else if (pid->iState < -PID_WINDUP_GUARD) pid->iState = -PID_WINDUP_GUARD; pTerm = pid->pGain * pid->Err; iTerm = pid->iGain * pid->iState; dTerm = pid->dGain * (pid->Err - pid->ErrLast); pid->OutP = pTerm + dTerm + iTerm; pid->ErrLast = pid->Err; } else if (pid->Mode == PID_MODE_BOO) { /* * Mode Bang On Off */ pid->ErrLast = pid->Err; 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->ErrLast = pid->Err = 0.0; pid->OutP = pid->iState = 0.0; } if (pid->OutP > pid->iMax) pid->OutP = pid->iMax; if (pid->OutP < 0.0) pid->OutP = 0.0; }