Created
July 28, 2019 16:07
-
-
Save aemarkov/284995fda2ca10772774a20a88103506 to your computer and use it in GitHub Desktop.
Simple implementation of the PID-controller on C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PID <T> | |
{ | |
private float _kGain; // P (пропорциональный) коэффициент | |
private float _iGain; // I (интегральный) коэффициент | |
private float _dGain; // D (дифференциальный) коэффициент | |
private T _dState; // Значение с предыдущего шага, используется для вычисления D-составляющей | |
private T _iSTate; // Накопленная ошибка, используется для вычисления I-составляющей | |
private T _iMax; // Минимальное и максимальное значение накопленной ошибки, чтобы | |
private T _iMin; // она не улетела куда-то очень далеко | |
public PID(/*...*/) | |
{ | |
// Какой-то конструктор, передать коэффициенты или еще что-нибудь | |
} | |
/// <summary> | |
/// Расчитывает управление с помощью ПИД-регулятора | |
/// </summary> | |
/// <param name="current">Текущее положение системы</param> | |
/// <param name="target">Целевое положение системы</param> | |
/// <returns> | |
/// </returns> | |
public Calc(T current, T target) | |
{ | |
T error = target - current; | |
// Расчет П-составляющей | |
// Она просто пропрциональна отклонению | |
var pTerm = _pGain * error; | |
// Расчет И-составлющей | |
// Она пропорциональна суммарному накопленному отклонению | |
// И составляющая позволяет учесть какую-то систематическую ошибку, | |
// например, постоянно приложннную силу | |
_iState += error; | |
if(_iState > _iMax) _iState = _iMax; | |
if(_iState < _iMin) _iState = _iMin; | |
var iTerm = _iGain * _iState; | |
// Рассчет Д-составляющей | |
// Она пропорциональна скорости изменения положения системы | |
// (производной, по-сути) | |
var dTerm = _dGain * (current - _dState); | |
_dState = current; | |
return pTerm + iTerm + dTerm; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment