Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.97 KB | None | 0 0
  1. public class PID
  2.     {
  3.         private double LastInput;
  4.         private double LastSampleTime;
  5.         private double ErrorSum;
  6.         private double Kp;
  7.         private double Ki;
  8.         private double Kd;
  9.         private double Setpoint;
  10.         private double MinOutput;
  11.         private double MaxOutput;
  12.         private double PTerm;
  13.         private double ITerm;
  14.         private double DTerm;
  15.         private double deadband;
  16.         private double Output;
  17.  
  18.         void __init__ (double LastInput, double LastSampleTime, double ErrorSum, double Kp, double Ki, double Kd, double Setpoint, double MinOutput, double MaxOutput)
  19.         {
  20.             this.LastInput = LastInput;
  21.             this.LastSampleTime = LastSampleTime;
  22.             this.ErrorSum = ErrorSum;
  23.             this.Kp = Kp;
  24.             this.Ki = Ki;
  25.             this.Kd = Kd;
  26.             this.Setpoint = Setpoint;
  27.             this.MinOutput = MinOutput;
  28.             this.MaxOutput = MaxOutput;
  29.             this.PTerm = 0;
  30.             this.ITerm = 0;
  31.             this.DTerm = 0;
  32.             this.deadband = 0;
  33.         }
  34.  
  35.         PID Update(double SampleTime, double Input)
  36.         {
  37.             var Error = this.Setpoint - Input;
  38.             PTerm = Kp * Error;
  39.             ITerm = 0;
  40.             DTerm = 0;
  41.             var in_deadband = Math.Abs(Error) < deadband;
  42.  
  43.             if (LastSampleTime < SampleTime)
  44.             {
  45.                 if (in_deadband == false)
  46.                 {
  47.                     var dt = SampleTime - this.LastSampleTime;
  48.                     if (Ki > 0 || Ki <0)
  49.                     {
  50.                         ITerm = (ErrorSum + Error * dt) * Ki;
  51.                     }
  52.  
  53.                     var ChangeRate = (Input - LastInput) / dt;
  54.  
  55.                     if (Kd > 0 || Kd < 0)
  56.                     {
  57.                         DTerm = -ChangeRate * Kd;
  58.                     }
  59.                 }
  60.             }
  61.  
  62.             Output = PTerm + ITerm + DTerm;
  63.  
  64.             if (Output > MaxOutput)
  65.             {
  66.                 Output = MaxOutput;
  67.  
  68.                 if ((Ki < 0 || Ki > 0) && LastSampleTime < SampleTime)
  69.                 {
  70.                     ITerm = Output - Math.Min(PTerm + DTerm, MaxOutput);
  71.                 }
  72.             }
  73.             else if (Output < MinOutput)
  74.             {
  75.                 Output = MinOutput;
  76.  
  77.                 if ((Ki > 0 || Ki < 0) && LastSampleTime < SampleTime)
  78.                 {
  79.                     ITerm = Output - Math.Max(PTerm + DTerm, MinOutput);
  80.                 }
  81.             }
  82.  
  83.             LastSampleTime = SampleTime;
  84.             LastInput = Input;
  85.  
  86.             if (Ki < 0 || Ki > 0)
  87.             {
  88.                 ErrorSum = ITerm / Ki;
  89.             }
  90.             else
  91.             {
  92.                 ErrorSum = 0;
  93.             }
  94.  
  95.             return Output;
  96.         }
  97.  
  98.         void Reset()
  99.         {
  100.             this.ErrorSum = 0;
  101.             ITerm = 0;
  102.             LastSampleTime = MaxOutput;
  103.         }
  104.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement