问题描述
我有一个问题,对象的实例化顺序会影响我系统的功能。以下所有代码都编译,但只有一个驱动步进器。我还想指出 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
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
}
}