Синхронное управление несколькими шаговыми двигателями с помощью C ++

В настоящее время я работаю над проектом atmega 2560, где мне нужно синхронно управлять несколькими шаговыми двигателями. Это означает, что иногда только один двигатель вращается за раз, а иногда несколько двигателей должны вращаться одновременно на один и тот же угол. Планируя свой подход, я столкнулся с проблемой, которую не знаю, как решить. Итак, я решил посмотреть, может ли кто-нибудь дать мне ценный совет. Я пишу программу на C ++ и хотел создать класс для шаговых двигателей (см. Прилагаемый UML), у которого есть метод rotate (), чтобы, как вы догадались, повернуть шаговый двигатель на определенный угол в определенном направлении. Теперь, конечно, возникает проблема с синхронизацией, потому что мне нужно реализовать функцию таким образом, чтобы она не блокировала какой-либо другой код и позволяла мне одновременно включать несколько двигателей. Я придумал два возможных подхода:

  1. Использование таймеров atmega и прерываний для создания сигнала ШИМ, который поворачивает двигатели на один шаг за прерывание. Чтобы иметь возможность включать сразу несколько двигателей, я подумал о создании таблицы для активных шаговых двигателей. Каждый раз, когда вводится ISR, он проверяет, какие шаговые двигатели должны двигаться, и передает сигнал ШИМ на соответствующие контакты. Конечно, мне как-то нужно было бы отслеживать количество шагов, которые еще осталось выполнить (возможно, путем введения другой переменной-члена).
  2. Не использовать прерывания вообще и просто избегать максимально возможной блокировки кода, не используя циклы while и используя системное время для задержек.

Теперь мой вопрос ко всем вам: какая возможность, по вашему мнению, будет работать лучше всего, или, если есть что-то еще, я мог бы попробовать? Я почти уверен, что смогу реализовать любой из вышеперечисленных, но я просто не совсем доволен ими обоими. Было бы правильным использовать счетчики и прерывания, чтобы гарантировать точное время. Однако подход с использованием внешней таблицы для активных шаговых двигателей делает программу менее простой для понимания. Вдобавок у меня были проблемы с приспособлением ISR к объектно-ориентированному миру.

Мы высоко ценим любые идеи или вклад.

С уважением Axodarap


person Axodarap    schedule 01.01.2019    source источник
comment
Похоже, вам нужен конечный автомат.   -  person user4581301    schedule 01.01.2019
comment
@ user4581301 Я не понимаю, как конечный автомат решит мою проблему с синхронизацией. : /   -  person Axodarap    schedule 01.01.2019
comment
Вариант 2 похож на библиотеку AccelStepper.   -  person David Grayson    schedule 02.01.2019


Ответы (1)


Я бы порекомендовал вам использовать ISR.

  1. Использование ISR упрощает добавление новых функций. Всякий раз, когда вы хотите добавить новую функциональность, вы пишете ее, и ваши ISR по-прежнему выполняются в той же ситуации / времени / синхронусе / асинхронном режиме.
  2. Работа с двигателями вынуждает вас использовать систему, зависящую от времени, особенно когда нет обратной связи по положению / углу.

В чем проблема с хранением данных о степперах? Вам не нужна внешняя таблица для активных степперов, иначе я вас неправильно понял. Вы можете использовать статические переменные в ISR, чтобы предотвратить их исчезновение после выполнения.

person dunajski    schedule 22.01.2019