Что внутри у сервопривода?
Что внутри у сервопривода?
Сервоприводу достаточно задать угол – дальше он сам поворачивает вал и удерживает положение. Внутри работают двигатель, редуктор, датчик положения и управляющая электроника. Датчик измеряет угол, регулятор сравнивает его с заданием и управляет двигателем, чтобы устранить разницу.
Чтобы посмотреть, как это устроено, соберем в Engee две параллельные ветви: готовый блок RC Servo и привод из отдельных физических блоков с внешним регулятором. Подадим им одинаковое задание и сравним движение валов. Сначала выполним несколько крупных поворотов, а затем попробуем сместить вал всего на десятую градуса – здесь и проявятся различия.
Две ветви, одно задание
На рисунке ниже сверху расположен блок RC Servo. Угол задается длительностью импульса: сигнал проходит через пересчет в коэффициент заполнения и генератор ШИМ 50 Гц. Двигатель, редуктор и обратная связь уже входят в блок сервы.
Снизу – двигатель постоянного тока с отдельным редуктором и регулятором MotorController. Датчик измеряет угол и скорость выходного вала и возвращает их в регулятор. У каждой ветви свои электрическая и механическая опоры, решатель и нагрузка. Общий источник ServoTarget задает угол обеим ветвям.
Внешняя инерция одинакова: 0,0002 кг·м². Вязкое сопротивление тоже одинаковое, напряжение питания – 4,8 В. В нижней ветви передаточное отношение редуктора равно 320, регулятор настроен под скорость сервы. Внутри него ошибка положения задает требуемую скорость, а ошибка скорости – напряжение двигателя.
Рисунок 1 – Сверху RC Servo, снизу двигатель с отдельным регулятором и редуктором.
Поворачиваем оба вала
Для начала попросим оба привода сделать несколько поворотов: из нулевого положения перейти на 30°, затем на 90° и вернуться к 45°. Между командами оставим по две секунды, а после последнего поворота дадим приводам еще три секунды на удержание положения. За движением будем следить по датчикам на выходных валах.
Запустим ServoMotorBranches и соберем показания обоих датчиков вместе с заданием. Для графиков переведем углы из радиан в градусы.
using DataFrames, CSV, Plots
engee.open("/user/servo_position_compare/ServoMotorBranches.engee"; force=true)
engee.run("ServoMotorBranches")
a = collect(branches_motor)
s = collect(branches_servo)
r = collect(branches_motor_target)
d = DataFrame(time_s=a.time, target_deg=r.value, basic_deg=a.value .*180/pi, servo_deg=s.value .*180/pi, difference_deg=(a.value .-s.value) .*180/pi);
На верхнем графике сравним, как оба вала следуют за заданием. Чтобы разглядеть небольшие расхождения, ниже выведем разность их углов: из показаний двигателя с регулятором вычтем показания сервы (рисунок 2).
p1 = plot(d.time_s, d.target_deg; label="Задание", linestyle=:dot, color=:black, ylabel="Угол, °")
plot!(p1, d.time_s, d.basic_deg; label="Двигатель с регулятором", color=:royalblue)
plot!(p1, d.time_s, d.servo_deg; label="RC Servo", linestyle=:dash, color=:darkorange)
p2 = plot(d.time_s, d.difference_deg; label=false, ylabel="Разность углов, °", xlabel="Время, с", color=:purple)
comparison_plot = plot(p1, p2; layout=(2,1), size=(1000,650), margin=4Plots.mm)
Рисунок 2 – Углы выходных валов и их разность.
Почему сервопривод дрожит около заданного угла?
В сервоприводе датчик постоянно измеряет положение, а регулятор сравнивает его с заданием и поправляет вал. Около цели двигатель может попеременно включаться и отключаться: вал еще движется по инерции, проходит заданное положение и получает команду на коррекцию.
В RC Servo порог отключения задает Angle resolution. Здесь он равен 0,1°. При ошибке меньше этого значения двигатель отключается; последующее движение механики может снова вывести вал за порог. В нижней ветви скорость дополнительно учитывается во внешнем регуляторе, и на графике ее угол держится ровнее.
На больших поворотах кривые почти совпадают. Самое большое расхождение между углами в этом опыте – 0,92°. После выхода на 45° у сервы остаются небольшие колебания, которые видны на нижнем графике.
А если повернуть всего на десятую градуса?
С большими поворотами разобрались. Теперь посмотрим, как приводы справятся с перемещением всего на десятую градуса. Сначала дадим им четыре секунды, чтобы выйти на 45°, затем попросим повернуться до 45,1°, еще через две секунды – до 45,2°, а на восьмой секунде – до 46°.
Повторим этот опыт с двумя значениями Angle resolution: 0,1° и 0,5°. Настройку поменяем только у сервопривода; двигатель с регулятором будет каждый раз получать то же задание. Оба прогона выполнит функция из branches_micro_tools.jl, а в конце вернет исходные параметры модели.
include("/user/servo_position_compare/branches_micro_tools.jl")
micro = run_branch_micro_steps();
Первый поворот к 45° уже видели, поэтому на рисунке 3 оставим только участок с малыми перемещениями. При таком увеличении видно, как сервопривод отвечает на каждый шаг задания и насколько сильно колеблется ее вал.
fine = filter(r -> r.resolution_deg == 0.1 && r.time_s >= 3.5, micro)
coarse = filter(r -> r.resolution_deg == 0.5 && r.time_s >= 3.5, micro)
micro_plot = plot(fine.time_s, fine.target_deg; label="Задание", color=:black, linewidth=2, xlabel="Время, с", ylabel="Угол, °", size=(1000,500), legend=:outerright)
plot!(micro_plot, fine.time_s, fine.basic_deg; label="Двигатель с регулятором", linestyle=:dash, color=:gray)
plot!(micro_plot, fine.time_s, fine.servo_deg; label="RC Servo: порог 0,1°", color=:royalblue)
plot!(micro_plot, coarse.time_s, coarse.servo_deg; label="RC Servo: порог 0,5°", color=:darkorange)
Рисунок 3 – Малые перемещения при двух значениях порога отключения сервы.
При пороге 0,1° сервопривод следует мелким изменениям задания, но размах колебаний составляет около 0,45° – больше шага 0,1°. Двигатель с регулятором отрабатывает эти шаги без заметных колебаний в выбранном масштабе.
При пороге 0,5° вал сервопривода остается около 44,15°, когда задание меняется с 45° на 45,1°. Следующий шаг, до 45,2°, вызывает перемещение примерно до 46,06°. После задания 46° вал остается на той же отметке.
Что показали опыты?
Двигатель с редуктором отрабатывает заданный угол благодаря датчику и обратной связи. В собранной ветви эту работу выполняет MotorController: сравнивает положение с заданием, учитывает скорость и управляет напряжением двигателя. У готового RC Servo управление положением находится внутри блока.
На поворотах 30–90° движение ветвей получилось близким: максимальная разность углов составила 0,92°. При шаге 0,1° различия стали заметнее. Двигатель с регулятором отработал малое перемещение, а колебания сервы оказались больше самого шага. При пороге 0,5° переход с 45° на 45,1° вообще не сдвинул ее вал.
Готовый RC Servo удобен для проверки движения механизма с выбранной сервой. Ветвь из отдельных блоков позволяет менять закон управления и отдельно исследовать влияние двигателя, редуктора и нагрузки.