【发布时间】:2021-10-06 03:17:03
【问题描述】:
我有一个问题,即对象的实例化顺序会影响我的系统的功能。以下所有代码都可以编译,但只有一个启动步进器。我还想指出,Arduino Stepper library 指定在设置之前要实例化的类。我认为同样的原因也适用于TMC26XStepper。
我自己的研究让我认为情况正好相反。我的理解是在调用 Arduino 运行时环境 init() 之前调用 setup() 之前实例化的对象。这将导致 pinMode() 等方法尚不可用。再次考虑默认的 Arduino 步进器库,构造函数调用 pinMode(),这似乎是错误的。
为什么一定要按这个顺序?
在 setup() 之前实例化 TMC26XStepper 类的工作代码:
#include <SPI.h>
#include <TMC26XStepper.h>
TMC26XStepper tmc26xStepper = TMC26XStepper(200, 2, 6, 7, 800);
void setup() {
Serial.begin(9600);
tmc26xStepper.setSpreadCycleChopper(0, 24, 8, 6, 0);
tmc26xStepper.setRandomOffTime(0);
tmc26xStepper.setMicrosteps(16);
tmc26xStepper.setStallGuardThreshold(2, 0);
tmc26xStepper.setSpeed(400);
tmc26xStepper.start();
moveNSteps(tmc26xStepper, 1000);
moveNSteps(tmc26xStepper, -1000);
}
void loop() {
}
void moveNSteps(TMC26XStepper stepper, int steps) {
int microSteps = 16;
stepper.step(steps * microSteps);
while (stepper.getStepsLeft() != 0 && stepper.isMoving()) {
stepper.move();
}
}
此代码编译但步进电机不旋转。唯一的区别是 TMC26XStepper 对象的实例化位置:
#include <SPI.h>
#include <TMC26XStepper.h>
void setup() {
TMC26XStepper tmc26xStepper = TMC26XStepper(200, 2, 6, 7, 800);
Serial.begin(9600);
tmc26xStepper.setSpreadCycleChopper(0, 24, 8, 6, 0);
tmc26xStepper.setRandomOffTime(0);
tmc26xStepper.setMicrosteps(16);
tmc26xStepper.setStallGuardThreshold(2, 0);
tmc26xStepper.setSpeed(400);
tmc26xStepper.start();
moveNSteps(tmc26xStepper, 1000);
moveNSteps(tmc26xStepper, -1000);
}
void loop() {
}
void moveNSteps(TMC26XStepper stepper, int steps) {
int microSteps = 16;
stepper.step(steps * microSteps);
while (stepper.getStepsLeft() != 0 && stepper.isMoving()) {
stepper.move();
}
}
这也编译但不转动电机:
#include <SPI.h>
#include <TMC26XStepper.h>
TMC26XStepper *tmc26xStepper
void setup() {
tmc26XStepper= new TMC26XStepper(200, 2, 6, 7, 800);
Serial.begin(9600);
tmc26xStepper->setSpreadCycleChopper(0, 24, 8, 6, 0);
tmc26xStepper->setRandomOffTime(0);
tmc26xStepper->setMicrosteps(16);
tmc26xStepper->setStallGuardThreshold(2, 0);
tmc26xStepper->setSpeed(400);
tmc26xStepper->start();
moveNSteps(tmc26xStepper, 1000);
moveNSteps(tmc26xStepper, -1000);
}
void loop() {
}
void moveNSteps(TMC26XStepper* stepper, int steps) {
int microSteps = 16;
stepper->step(steps * microSteps);
while (stepper->getStepsLeft() != 0 && stepper->isMoving()) {
stepper->move();
}
}
编辑1: 使用的硬件
阿杜诺
【问题讨论】:
-
了解类实例化和变量作用域。
-
工作示例使用全局声明,就像第三个示例一样。然而,第三个例子不起作用。第二个示例也完全包含在设置中。所以我不确定你的评论是否有帮助
标签: arduino arduino-uno arduino-ide arduino-c++