【问题标题】:Class Instantiation only works globally but not in set up类实例化仅在全局范围内有效,但在设置中无效
【发布时间】: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: 使用的硬件

阿杜诺

TOS100 Stepper Shield

User manual for tmc260a chip on the shield

【问题讨论】:

  • 了解类实例化和变量作用域。
  • 工作示例使用全局声明,就像第三个示例一样。然而,第三个例子不起作用。第二个示例也完全包含在设置中。所以我不确定你的评论是否有帮助

标签: arduino arduino-uno arduino-ide arduino-c++


【解决方案1】:

有趣的问题.. 即使在第二种情况下步进器是设置内部的局部变量,考虑到变量的范围(根据我有限的知识),从设置内部调用函数应该可以工作。指针也一样..

我使用模拟器做了一些尝试,因为我现在没有 Arduino 和步进/伺服。 这 3 个案例在 wokwi Arduino simulator 上对我有用,但我不确定模拟器是否真的代表了真正的 Arduino 行为。 这是我使用指针模拟的示例代码:

#include <Servo.h>
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  Servo * myservo = new Servo();  // create servo object to control a servo
  myservo->attach(9);  // attaches the servo on pin 9 to the servo object
  move(myservo);
}

void loop() {
  delay(50);
}

void move(Servo * myfbservo){
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myfbservo->write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

【讨论】:

  • 你的模拟是正确的!但是,步进电机具有在构造过程中配置的外部驱动器。我相信这可能是我忘记提及的一个很大的不同。我用使用的硬件更新了问题
猜你喜欢
  • 2021-04-17
  • 2022-10-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多