enhering

PID class

Sep 8th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. #ifndef PID_H_
  2. #define PID_H_
  3.  
  4.   #include "AVRBase.h"
  5.  
  6.   class PID : public AVRBase {
  7.     public:
  8.  
  9.       PID();
  10.       ~PID();
  11.  
  12.       void SetPID(float fP, float fI, float fD) { m_fP = fP; m_fI = fI; m_fD = fD; }
  13.  
  14.       void SetSetpoint(float fInput)            { m_fSetpoint = fInput; }
  15.       void SetCurrent(float fInput)             { m_fCurrent = fInput; }
  16.  
  17.       void SetConstraints(float fMin, float fMax ) { m_fMinConstraint = fMin; m_fMaxConstraint = fMax; }
  18.  
  19.       float Output() { Update(); return m_fOutput; }
  20.  
  21.       void Update();
  22.  
  23.     private:
  24.  
  25.       float m_fP, m_fI, m_fD;
  26.  
  27.       float m_fDt;
  28.  
  29.       float m_fPrevError;
  30.       float m_fError;
  31.  
  32.       float m_fIntegral;
  33.  
  34.       float m_fSetpoint;
  35.       float m_fCurrent;
  36.  
  37.       float m_fOutput;
  38.       float m_fMinConstraint;
  39.       float m_fMaxConstraint;
  40.  
  41.   };
  42.  
  43. #endif
  44.  
  45. PID::PID() {
  46.   m_fP = 1;
  47.   m_fI = 1;
  48.   m_fD = 1;
  49.  
  50.   m_fError = 0;
  51.   m_fPrevError = 0;
  52.  
  53.   m_fIntegral = 0;
  54.  
  55.   m_fMinConstraint = 0;
  56.   m_fMaxConstraint = 1;
  57. }
  58.  
  59. PID::~PID() {
  60.  
  61. }
  62.  
  63. void PID::Update() {
  64.   m_fOutput = 0;
  65.  
  66.   m_fError = m_fCurrent - m_fSetpoint;
  67.  
  68.   // P
  69.   if (m_fP != 0) {
  70.     m_fOutput = m_fP * m_fError;
  71.   }
  72.   // I
  73.   if (m_fI != 0) {
  74.     m_fIntegral += (m_fError * m_fDt * m_fI);
  75.     m_fOutput += m_fIntegral;
  76.   }
  77.   // D
  78.   if (m_fD != 0) {
  79.     m_fOutput += -1.0 * ((m_fPrevError - m_fError) / m_fDt) * m_fD;
  80.   }
  81.  
  82.   if (m_fOutput < m_fMinConstraint) {
  83.     m_fOutput = m_fMinConstraint;
  84.   }
  85.   if (m_fOutput > m_fMaxConstraint) {
  86.     m_fOutput = m_fMaxConstraint;
  87.   }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment