atmega — синхронное управление несколькими степперами с помощью переполнения стека

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

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

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

Любые идеи или вклады высоко ценятся.

С наилучшими пожеланиями
Axodarap

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]