Ale писал(а):Вопрос в том, как его реализовывать, и под какие задачи.
Так, тема пида становится баяном, тем не менее давайте начнем с чистого листа, потому что было много сумбурных высказываний, недопониманий и подмен понятий.
Уверен, никто не будет спорить с тезисами:
1. Угол поворота вала пропорционален координате.
2. Воздействие (ШИМ) - величина пропорциональная частоте вращения вала двигателя. Если ШИМ - константа, то и частота - константа.
3. Основная задача контроллера - принимать координаты и выдавать такие значения ШИМ, чтоб траектория построенная по показаниям обратной связи была копией траектории построенной по принятым координатам с некоторым смещением во времени.
4. Изменение координат происходит с ускорением.
Главный вопрос - как реализовать 3 пункт! Задача сводится к придумыванию некой функции ШИМ=функция(принятая координата, координата обратной связи). Или иными словами- какой ШИМ приложить к двигателю чтоб из текущей координаты попасть в принятую координату через время t =константа = период приема новых координат. Для начала рассматриваем замкнутую систему - идеальный двигатель с обратной связью, ни какого трения.
1. Что предлагает kuzevan. Предполагается, что
за период приема координат мы двигаемся равноускоренныо. Такое движение описывается формулой
x=x0+V0*t+a*t*t/2, где t=33мс, и с ней нельзя не согласиться. С другой стороны, изменение ШИМ влечет за собой изменение скорости, то есть ускорение. Подставляя одну формулу в другую получаем искомую функцию ШИМа от координат, начальной скорости и начального ШИМа. Пока вроде все правильно...
2. Как реализовано в существующем контроллере. Предполагается что
в течении времени t = период перерасчета ШИМ мы движемся с постоянной скоростью, ввиду малого t. Такое движение описывается формулой V=(x-x0)/t. Так как скорость пропорциональна ШИМу, то получаем выражение ШИМ=некий коэф*(новая координата -текущая координата). Но период перерасчета ШИМ (микрозадание) < периода получения координат (задание), следовательно, с каждым шагом уменьшается разность координат, и соответственно и скорость будет постепенно уменьшаться. То есть от микрозадания до микрозадания мы будем двигаться с ускорением. Траектория - парабола.
3. Предположенный мною ранее подход. Нечто среднее между п1 и п2. Предполагается что
в течении времени t = период приема координат мы движемся с постоянной скоростью. Такое движение описывается формулой V=(x-x0)/t. Так как скорость пропорциональна ШИМу, то получаем выражение ШИМ=некий коэф*(новая координата -текущая координата).
В отличие от п2 от задания до задания движемся с постоянной скоростью.
В реальной системе, где есть внешние возмущения - трение, нелинейности и тд, которые приводят к тому, что коэффициент в п1,2,3 перестают быть константами, влечет за собой ошибку попадания в заданную координату в нужное время. Как с этим бороться?
Самый простой вариант, это вычислять ошибку в каждом шаге, со знаком! (переезд - недоезд) прибавляя ее к прошлой - интегральная составляющая. Затем, пропорционально ее увеличению вносить корректировку воздействия (ШИМ) в следующем шаге. Правда возможна ситуация, что почувствовать влияние такой корректировки мы сможем уже тогда когда она не нужна. Чтобы этого избежать период приема координат должен быть очень маленьким. Тут мы упираемся в скорости UART. И самый главный минус - мы честно не стабилизируем скорость.
4. Новый подход!
За основу берем п2 -
период перерасчета ШИМ < периода получения координат, то есть внутри цикла приема координат есть несколько циклов перерасчета ШИМ. Но с одной поправкой вытекающей из п3 - скорость, от задания до задания, должна быть константа!
Как это реализовать?
В качестве целевой координаты микрозадания принимать не принятую, а промежуточную координату, которая лежит на пересечении заданной траектории и вертикальной прямой проходящей через точку времени следующего расчета - сводится к решению прямоугольного треугольника (трапеция разделенная на равные маленькие).
Теперь уже можно говорить, что на протяжении периода приема координат интегральная составляющая внесет изменения достаточно быстро (к следующему приему), ну во всяком случае UART нас уже не лимитирует. Имеем полноценный ПИ. Также становится возможным
стабилизация скорости между расчетами ШИМ, и как следствие во всем задании. Достаточно ввести дифференциальную составляющую, которая по сути является разностью скоростей текущего и прошлого микрозадания и чем эта разность больше тем больше противоположенный вклад в суммарное значение ШИМ. Имеем
полноценный ПИД, при котором не о каких остановках или глобальных замедлениях от задания до задания не может быть и речи!