/// <summary> /// Construct a PID with parameters p, i and d. /// </summary> /// <param name="p"></param> /// <param name="i"></param> /// <param name="d"></param> public PID(float p, float i, float d) { Name = "Unnamed"; P = p; I = i; D = d; _prevError = new ErrorSample(float.NaN, 0); }
/// <summary> /// Construct a PID with parameters p, i and d. /// </summary> /// <param name="p"></param> /// <param name="i"></param> /// <param name="d"></param> public PID(float p, float i, float d) { Name = "Unnamed"; P = p; I = i; D = d; _prevError = new ErrorSample(float.NaN, 0); }
public MainWindow() { InitializeComponent(); CurrentDataContext = new MainViewModel(delegate(double aError) { errorChart.ErrorStat.Add(ErrorSample.Generate(aError)); }); DataContext = CurrentDataContext; }
/// <summary> /// Call this method (only once) before each call to compute methods. /// Note that this method should only be called for each main loop cycle, so make sure to not run Compute() more than once in the loop for each PID. /// </summary> /// <param name="error"></param> /// <param name="totalTicks">TimeSpan ticks (100ns).</param> private void UpdateDifferentialAndIntegralErrors(float error, long totalTicks) { long ticksDelta = totalTicks - _prevError.TotalTicks; // Avoid division by zero if (ticksDelta > 0) { var elapsedSeconds = (float)TimeSpan.FromTicks(ticksDelta).TotalSeconds; if (float.IsNaN(_prevError.Value)) { _prevError.Value = error; } _differentialError = (error - _prevError.Value) / elapsedSeconds; _integralError += (error * elapsedSeconds); } // Remember error for next timestep _prevError = new ErrorSample(error, totalTicks); }
/// <summary> /// Call this method (only once) before each call to compute methods. /// Note that this method should only be called for each main loop cycle, so make sure to not run Compute() more than once in the loop for each PID. /// </summary> /// <param name="error"></param> /// <param name="totalTicks">TimeSpan ticks (100ns).</param> private void UpdateDifferentialAndIntegralErrors(float error, long totalTicks) { long ticksDelta = totalTicks - _prevError.TotalTicks; // Avoid division by zero if (ticksDelta > 0) { var elapsedSeconds = (float) TimeSpan.FromTicks(ticksDelta).TotalSeconds; if (float.IsNaN(_prevError.Value)) _prevError.Value = error; _differentialError = (error - _prevError.Value)/elapsedSeconds; _integralError += (error*elapsedSeconds); } // Remember error for next timestep _prevError = new ErrorSample(error, totalTicks); }