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