И это всё МОЁ

Всем привет, кого не видел)
Вопрос следующий: давно хотел как-нибудь использовать ПИД-регулятор в проекте, и вот настал тот час, когда надо, а я не могу понять, как же его присобачить с имеющимися данными.
У меня есть драйвер двигателя (BLSD-20), редуктор. Я опрашиваю количество прошедших оборотов двигателем с неким интервалом, и знаю, сколько мне надо получить оборотов, чтобы редуктор повернулся на нужный угол, соответственно, знаю на какой угол в текущий момент отклонился редуктор.
Соль в том, что управлять двигателем с помощью драйвера я могу только заданием скорости его вращения. Итого у меня получается диапазон выставления скорости: 0 - 66,(6) оборотов/сек. Один оборот - 3,6 градусов редуктора
Начитавшись литературы по ПИД, отлично понял составные части этого регулятора, и тем не менее не понимаю, как задать управляющую величину.


Основной методичкой взял вот этот манускрипт
http://robofob.ru/materials/articles/pages/Karpov_mobline1.pdf


Мои размышления такие:




  1. Моя задача повернуть на некий угол, пусть будет = 90 град.




  2. Значит, в начале движения у меня ошибка 90 град.




  3. Я начинаю суммировать все обороты (angle_sum) и получаю ошибку
    error = 90 - angle_sum




  4. Далее пропускаю её через регулятор, должен получить управляющее воздействие, судя по методичке, это снова будет какой-то угол, который надо как-то превратить в скорость.




Теоретическая выкладка из методички


[code=cpp]


// Параметры пропорционального звена


static double kp = 10; // Коэффициент пропорционального звена


// Параметры интегратора


static double ki = 0.001; // Коэффициент интегрального звена


#define iMin -0.2 // Минимальное значение интегратора


#define iMax 0.2 // Максимальное значение интегратора


static double iSum = 0; // Сумма ошибок (значение, накопленное в интеграторе)


// Параметры дифференциатора


static double kd = 1; // Коэффициент дифференциального звена


static double old_y = 0; // Предыдущее значение сигнала


static double PIDctl (double error, double y)
{

double up, ui, ud;


// Пропорциональная компонента
up = kp * error;

// Интегральная компонента
iSum = iSum + error; // Накапливаем (суммируем)
if (iSum < iMin) iSum = iMin; // Проверяем граничные значение
if (iSum > iMax) iSum = iMax;
ui = ki * iSum;

// Дифференциальная компонента
ud = kd * (y - old_y);
old_y = y;

return up + ui + ud;

}


[/code]


И почему-то не сработало форматирование, за что заранее приношу свои извинения у читающих