类实例化仅适用于全局但不适用于设置

问题描述

我有一个问题,对象的实例化顺序会影响我系统的功能。以下所有代码都编译,但只有一个驱动步进器。我还想指出 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,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,800);
  Serial.begin(9600);
  tmc26xStepper.setSpreadCycleChopper(0,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,800);
  Serial.begin(9600);
  tmc26xStepper->setSpreadCycleChopper(0,0);
  tmc26xStepper->setRandomOffTime(0);
  tmc26xStepper->setMicrosteps(16);
  tmc26xStepper->setStallGuardThreshold(2,0);
  tmc26xStepper->setSpeed(400);
  tmc26xStepper->start();
  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 uno

TOS100 Stepper Shield

User manual for tmc260a chip on the shield

解决方法

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

我使用模拟器做了一些尝试,因为我现在没有 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
  }
}