32 lines
1010 B
C#
32 lines
1010 B
C#
using TestApp.Configuration;
|
|
|
|
namespace TestApp
|
|
{
|
|
internal class PidController
|
|
{
|
|
private DateTime _PreviousUpdateTime;
|
|
private double _PreviousError;
|
|
private double _Integral;
|
|
|
|
public PidSetting PositiveSettings { get; set; } = new PidSetting();
|
|
public PidSetting NegativeSettings { get; set; } = new PidSetting();
|
|
public double SetPoint { get; set; }
|
|
|
|
public double Update(double measurement) {
|
|
var error = measurement - SetPoint;
|
|
var dt = (DateTime.UtcNow - _PreviousUpdateTime).TotalSeconds;
|
|
|
|
var settings = error > 0 ? PositiveSettings : NegativeSettings;
|
|
|
|
var proportional = error * settings.KP;
|
|
_Integral += error * settings.KI * dt;
|
|
var differential = (error - _PreviousError) * settings.KD / dt;
|
|
|
|
_PreviousError = error;
|
|
_PreviousUpdateTime = DateTime.UtcNow;
|
|
|
|
return proportional + _Integral + differential;
|
|
}
|
|
}
|
|
}
|