В настоящее время я работаю над проектом atmega 2560, где мне нужно синхронно управлять несколькими шаговыми двигателями. Это означает, что иногда только один двигатель вращается за раз, а иногда несколько двигателей должны вращаться одновременно на один и тот же угол. Планируя свой подход, я столкнулся с проблемой, которую не знаю, как решить. Итак, я решил посмотреть, может ли кто-нибудь дать мне ценный совет. Я пишу программу на C ++ и хотел создать класс для шаговых двигателей (см. Прилагаемый UML), у которого есть метод rotate (), чтобы, как вы догадались, повернуть шаговый двигатель на определенный угол в определенном направлении. Теперь, конечно, возникает проблема с синхронизацией, потому что мне нужно реализовать функцию таким образом, чтобы она не блокировала какой-либо другой код и позволяла мне одновременно включать несколько двигателей. Я придумал два возможных подхода:
- Использование таймеров atmega и прерываний для создания сигнала ШИМ, который поворачивает двигатели на один шаг за прерывание. Чтобы иметь возможность включать сразу несколько двигателей, я подумал о создании таблицы для активных шаговых двигателей. Каждый раз, когда вводится ISR, он проверяет, какие шаговые двигатели должны двигаться, и передает сигнал ШИМ на соответствующие контакты. Конечно, мне как-то нужно было бы отслеживать количество шагов, которые еще осталось выполнить (возможно, путем введения другой переменной-члена).
- Не использовать прерывания вообще и просто избегать максимально возможной блокировки кода, не используя циклы while и используя системное время для задержек.
Теперь мой вопрос ко всем вам: какая возможность, по вашему мнению, будет работать лучше всего, или, если есть что-то еще, я мог бы попробовать? Я почти уверен, что смогу реализовать любой из вышеперечисленных, но я просто не совсем доволен ими обоими. Было бы правильным использовать счетчики и прерывания, чтобы гарантировать точное время. Однако подход с использованием внешней таблицы для активных шаговых двигателей делает программу менее простой для понимания. Вдобавок у меня были проблемы с приспособлением ISR к объектно-ориентированному миру.
Мы высоко ценим любые идеи или вклад.
С уважением Axodarap