Всем привет, кого не видел) Вопрос следующий: давно хотел как-нибудь использовать ПИД-регулятор в проекте, и вот настал тот час, когда надо, а я не могу понять, как же его присобачить с имеющимися данными. У меня есть драйвер двигателя (BLSD-20), редуктор. Я опрашиваю количество прошедших оборотов двигателем с неким интервалом, и знаю, сколько мне надо получить оборотов, чтобы редуктор повернулся на нужный угол, соответственно, знаю на какой угол в текущий момент отклонился редуктор. Соль в том, что управлять двигателем с помощью драйвера я могу только заданием скорости его вращения. Итого у меня получается диапазон выставления скорости: 0 - 66,(6) оборотов/сек. Один оборот - 3,6 градусов редуктора Начитавшись литературы по ПИД, отлично понял составные части этого регулятора, и тем не менее не понимаю, как задать управляющую величину.
Основной методичкой взял вот этот манускрипт http://robofob.ru/materials/articles/pages/Karpov_mobline1.pdf
Мои размышления такие:
-
Моя задача повернуть на некий угол, пусть будет = 90 град.
-
Значит, в начале движения у меня ошибка 90 град.
-
Я начинаю суммировать все обороты (angle_sum) и получаю ошибку error = 90 - angle_sum
-
Далее пропускаю её через регулятор, должен получить управляющее воздействие, судя по методичке, это снова будет какой-то угол, который надо как-то превратить в скорость.
Теоретическая выкладка из методички
// Параметры пропорционального звена
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;
}
Подскажите, как перейти от теории к практике, какие подводные камни меня ожидают