Я ищу информацию о том, как реализовать правильное микширование двух аналоговых сигналов джойстика (ось X и Y) для управления приводом с двумя дифференциальными двигателями («бакоподобный» привод) с использованием uC (ATMega328p в моем случае, но то же самое относится и к любой uC с входами АЦП и ШИМ):
У меня есть аналоговый джойстик, который дает 2 аналоговых значения:
(направление) X: от 0 до 1023
(газ) Y: от 0 до 1023
Положение покоя (направление и нейтральное положение
дроссельной заслонки) 512,512 Дроссельная заслонка вперед / направление влево 0,0
Полное движение вперед-полное вправо - 1023,0
и т. Д.
Двигатели управляются 2-мя возбудителями H-моста, по 2 PWM-вывода для каждого (вперед, назад), например, так:
Левый двигатель: от -255 до 255
Правый двигатель: от -255 до 255
(положительные значения активируют вывод PWM вперед, отрицательные активируют реверс Контакт ШИМ, 0 отключает оба)
Цель состоит в том, чтобы смешать аналоговые сигналы джойстика для получения следующего отклика:
a) Дроссель вперед, нейтральное направление = транспортное средство движется вперед
b) Дроссель вперед, направление налево = транспортное средство движется вперед и поворачивает влево
c) Дроссельная заслонка, направление налево = автомобиль поворачивает влево В МЕСТО, что правый двигатель полностью вперед, левый двигатель полностью задний
... и аналогично для других комбинаций. Конечно, вывод должен быть «аналоговым», то есть он должен позволять постепенный переход, например, из варианта а) в б) в в).
Концепция заключается в следующем:
Ответы:
«Правильное» смешивание открыто для обсуждения :-).
Проблема заключается в том, что вы должны принять решение о том, насколько быстро движется дорожка под чистыми сигналами из одного банка и что делать, если включены сигналы из другого банка. Например, если вы толкаете банк FB (вперед-назад полностью вперед), и если оба двигателя затем работают на полной скорости вперед, как вы справляетесь с добавлением небольшого количества добавляемого банка LR (влево-вправо). чтобы получить вращение, вам нужно, чтобы одна колея двигалась быстрее, чем другая. Поэтому, если вы уже работаете на максимальной скорости движения на обоих моторах, вы должны уменьшить ту или иную скорость колеи, чтобы повернуть. Но если вы остановились, ускорил бы ту или иную дорожку для достижения того же результата.
Итак, все, что было сказано, вот простое решение из моей головы, которое кажется хорошим началом.
Если горшки механически независимы, то оба могут быть на 100% одновременно.
Если оба имеют тип джойстика, если Yaxis = 100% и Xaxis = 0%, то добавление некоторого B обычно уменьшит A. Джойстик может быть сконструирован там, где вышеприведенное неверно, но это необычно.
Предположим, что джойстик относится к тому типу, что увеличение Y% при X = 100% приведет к уменьшению X. Можно сделать и другие предположения.
FB = передний-задний банк. Центр ноль, + Ve для поступательного движения банка
LR = левый правый горшок. Центр ноль. + Ve для банка справа.
K изначально является масштабным коэффициентом 1.
Если какой-либо результат превышает 100%, отрегулируйте K так, чтобы результат = 100%, и используйте то же значение K для другого двигателя.
Как 125 х 0,8 = 100, установить К = 0,8. Затем.
Слева = 125 х 0,8 = 100%. Справа = 80 х 0,8 = 64%.
Затем:
Левый мотор = K x (Front_Back + Left_Right)
Правый мотор = K x (Front_Back - Left_Right)
Санитарные проверки:
LR = 0 (по центру), FB = полный вперед -> Оба двигателя работают полностью вперед.
LR = полный левый, FB = 0 ->
левый двигатель работает полностью назад,
правый двигатель работает полностью вперед.
Автомобиль вращается против часовой стрелки.
FB был 100%, Lr = 0%. Добавьте 10% LR справа.
L = FB + LR = 100% - + 10% R = FB-LR = 100% - - 10%
Если наибольшая ось <100%, масштабировать до = 100%.
Затем масштабируйте другую ось на ту же величину.
источник
Вот решение, которое не требует сложных цепочек if / else, не уменьшает мощность при движении вперед или вращении на месте и обеспечивает плавные кривые и переходы от движения к вращению.
Идея проста. Предположим, что значения (x, y) джойстика являются декартовыми координатами на квадратной плоскости. Теперь представьте меньшую квадратную плоскость, повернутую на 45º внутри.
Координаты джойстика дают вам точку в большем квадрате, а та же самая точка, наложенная на меньший квадрат, дает вам значения двигателя. Вам просто нужно преобразовать координаты из одного квадрата в другой, ограничивая новые значения (x, y) сторонами меньшего квадрата.
Есть много способов сделать преобразование. Мой любимый метод:
Предполагается, что начальные (x, y) координаты находятся в диапазоне -1.0 / + 1.0. Сторона внутреннего квадрата всегда будет равна
l * sqrt(2)/2
, поэтому шаг 4 примерно умножает значения наsqrt(2)
.Вот пример реализации Python.
Первоначальная идея этого метода - с гораздо более сложным методом преобразования - возникла из этой статьи .
источник
Ниже приведен пример реализации алгоритма микширования, описанного ответом Рассела МакМахона:
http://www.youtube.com/watch?v=sGpgWDIVsoE
источник