Запускайте неблокирующие степперы с последовательной связью на arduino - PullRequest
1 голос
/ 02 мая 2019

Я хочу приводить до 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);
}
...