Синхронное управление несколькими степперами с помощью C ++ - PullRequest
0 голосов
/ 01 января 2019

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

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

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

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

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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

...