Я хочу приводить до 10 шаговых двигателей одновременно.Все с постоянной, но индивидуальной скоростью.Между тем, другие расчеты и передача данных должны быть сделаны.
Все степперы имеют свой собственный драйвер с dir / step pin.Я использую AccelStepper для неблокирующих функций для запуска степперов.Очень важно, чтобы степперы работали как можно более гладко.Сначала я просто помещаю функцию runSpeed для каждого степпера в главном цикле, что приводит к заиканию, когда данные записываются в последовательный порт с помощью arduino.Теперь я использую Timer5 от Mega для запуска функции, которая ничего не делает, кроме вызова всех функций runSpeed каждые 200 мкс или около того.Это очень хорошо работает со степперами и остальным кодом, за исключением последовательной связи.Я хочу послать команды на arduino, но с активным прерыванием некоторые байты никогда не достигают arduino.Прямо сейчас я отправляю байт уведомления о том, что данные будут переданы, arduino отвечает и останавливает прерывание, получает команду и снова запускает прерывание.Работает как шарм, за исключением промежуточной паузы 0,5 с.Это должно быть решено.
Теперь я подумал о следующем: 1. Сделать прерывание приемлемым.Средства: Отслеживайте все этапы на каждом двигателе и рассчитывайте, когда двигатель должен выполнить следующий шаг.Сделайте прерывание таймера именно в это время.Конечно, прерывание должно быть отрегулировано после каждого шага любого двигателя.Я боюсь, что спрос на время будет довольно высоким, если не слишком высоким, так что arduino застревает в прерываниях и больше не выполняет другой код.2. Использование второго arduino, который запускает только шаговые схемы в цикле, поэтому синхронизация не вызывает проблем и позволяет получать последовательные данные.Однако, если я хочу, чтобы arduino подтвердил новые настройки для основного arduino, я снова получу короткие паузы ... Решением было бы переключиться на прерывания при отправке данных, иначе использовать основной цикл (отправка данных с обработками прерываний,Прием имеет проблему).
Это моя идея, как это сделать.Но прежде чем приложить все усилия, я хотел бы обсудить это с вами и спросить вас, если у вас есть другое, лучшее решение для меня.
Я приложил примерный код, который Arduino не может получитьболее длинные тексты без пропущенных байтов.
#include "AccelStepper.h"
#include "TimerFive.h"
AccelStepper m1(AccelStepper::DRIVER, 24, 25);
AccelStepper m2(AccelStepper::DRIVER, 26, 27);
AccelStepper m3(AccelStepper::DRIVER, 28, 29);
void setup() {
m1.setMaxSpeed(1000);
m2.setMaxSpeed(1000);
m3.setMaxSpeed(1000);
m1.setSpeed(50);
m2.setSpeed(70);
m3.setSpeed(90);
Timer5.initialize(250);
Timer5.attachInterrupt(run);
}
void run() {
m1.runSpeed();
m2.runSpeed();
m3.runSpeed();
}
void loop() {} {
//some calculations...
if (Serial.available() > 0) Serial.println(Serial.readString());
delay(1000);
}