在arduino上通过串行通信运行无阻塞步进器

时间:2019-05-02 06:27:17

标签: arduino stepper arduino-c++

我想同时驱动多达10个步进电机。所有这些都具有恒定但独立的速度。同时要进行其他计算和数据传输。

所有步进器都有自己的带有dir / step引脚的驱动程序。我将AccelStepper用于非阻塞功能来运行步进器。步进电机尽可能平稳运行非常重要。 首先,我只是将runSpeed函数放在主循环中的每个步进器上,导致当arduino将数据写入串行时出现卡顿现象。现在,我使用Mega的Timer5运行一个功能,但每200微秒左右调用一次所有runSpeed函数。这对步进器和其余代码(串行通信除外)非常有效。我想将命令发送到arduino,但由于中断处于活动状态,因此某些字节从未到达arduino。现在,我正在发送一个通知字节,通知数据将被传输,arduino回答并停止中断,接收命令并再次启动中断。除中间有0.5 s的步进暂停外,其工作原理类似于吊饰。这是要解决的。

现在我想到了以下几点: 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);
}

0 个答案:

没有答案