我想同时驱动多达 10 个步进电机。所有这些都具有恒定但单独的速度。同时还要进行其他计算和数据传输。
所有步进器都有自己的带有 dir/step pin 的驱动程序。我将 AccelStepper 用于非阻塞功能来运行步进器。步进器尽可能平稳地运行非常重要。首先,我只是将每个步进器的 runSpeed 函数放在主循环中,导致当 arduino 将数据写入串行时出现卡顿。我现在使用 Mega 的 Timer5 来运行一个函数,该函数除了每 200 µs 左右调用一次所有 runSpeed 函数外什么都不做。这对步进器和除串行通信外的其余代码非常有效。我想向 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);
}