/// <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);
 }
Exemplo n.º 3
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);
        }