arduino驱动步进电机步数不对

通过arduino用tmc2208驱动18°步进电机为什么一圈是159步,有没有人遇到过这个问题
目前2208的细分引脚悬空
下面是代码,有没有哪位帮忙看看是啥原因

volatile int delaym;
volatile int step;
volatile int dir;

void setup(){
  delaym = 0;
  step = digitalRead(2);
  pinMode(3, INPUT);
  dir = digitalRead(3);
  pinMode(2, OUTPUT);
}

void loop(){
  dir = HIGH;
  step = HIGH;
  for (int i = 0; i <= 159; i = i + (1)) {
    delaym = 1000;
    digitalWrite(2,HIGH);
    delayMicroseconds(delaym);
    digitalWrite(2,LOW);
    delayMicroseconds(delaym);
  }
  delay(1000);

}

参考GPT和自己的思路:

根据你提供的代码和问题描述,我可以推测驱动步进电机步数不对的原因可能如下:

  1. 引脚设置不正确:你在代码中指定了2和3号引脚作为步进电机的控制引脚和方向引脚。请确保你实际使用的引脚和代码中指定的引脚一致。

  2. 步进电机细分设置不正确:你使用的是tmc2208驱动器,可以使用其细分功能来控制步进电机的旋转角度。请检查你的tmc2208驱动器是否正确设置了细分参数。如果没有设置,步进电机的步数可能会受到影响。

  3. 步进电机的型号不正确:如果你在代码中使用的是默认的步进电机类型,而实际使用的步进电机型号不同,步进电机的步数也可能会不同。

综上所述,你可以尝试重新检查你的引脚设置、tmc2208驱动器的细分设置和步进电机的型号,以确定导致步数错误的原因。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据你提供的代码,看起来你是通过手动控制步进电机的方式进行测试,而没有使用步进电机库函数。因此,你需要检查以下几个问题:

  1. 确认你的步进电机的型号是否为18度/步。
  2. 确认你的驱动器(TMC2208)的细分设置是否正确,与步进电机的型号相匹配。
  3. 确认你的驱动器(TMC2208)的DIR引脚和STEP引脚是否连接正确。

另外,在你的代码中,你使用了一个固定的步数(159步)来控制步进电机的运动。你可以尝试使用步进电机库函数,比如AccelStepper库,来更加方便地控制步进电机的运动和速度。同时,你可以使用Serial.print()函数来输出一些调试信息,以便更好地理解步进电机的运动和问题所在。

参考GPT和自己的思路:根据您提供的代码和情况,可能是您未正确设置步进电机的细分。默认情况下,TMC2208驱动器的细分设置为1/16,而18°步进电机通常有200个步骤,因此需要将步进电机分成3200个细分,以达到一圈需要3200个步骤的目标。

您可以通过将驱动器的MS1,MS2和MS3引脚连接到正确的电平来设置TMC2208的细分。例如,如果将这些引脚全部连接到GND,则细分为1/1;如果将MS1连接到VREF,MS2连接到GND,MS3连接到VREF,则细分为1/16。

在您的代码中,您可以将细分设置为1/16,如下所示:

void setup(){
delaym = 0;
step = digitalRead(2);
pinMode(3, INPUT);
dir = digitalRead(3);
pinMode(2, OUTPUT);
// 设置TMC2208驱动器细分为1/16
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
}

void loop(){
dir = HIGH;
step = HIGH;
for (int i = 0; i <= 3200; i = i + (1)) { // 改为3200步
delaym = 1000;
digitalWrite(2,HIGH);
delayMicroseconds(delaym);
digitalWrite(2,LOW);
delayMicroseconds(delaym);
}
delay(1000);
}

您需要将MS1、MS2和MS3引脚连接到正确的电平,这里假设连接到数字引脚4、5和6上。

根据你提供的代码和描述,有以下几点可能导致电机步数不准确:

1、电机驱动板的细分引脚没有接入,这会导致电机步进角度变化,从而影响步数准确性。建议接入细分引脚。

2、步进电机的电气特性可能与代码中假设的不同,例如,可能实际的步进角度为17度,而不是18度。这也会影响步数准确性。

3、电机运动过程中可能会有误差,例如电机不能准确地达到所需的步进位置。这可能与电机的质量、驱动板的精度、电压等因素有关。

建议先确认驱动板的细分引脚是否接入,并对电机进行测试,检查其实际步进角度是否与假设一致。如果以上两个因素都排除了,那么可能需要进一步检查其他因素,例如驱动电压是否稳定等。

参考GPT和自己的思路,
首先,你的代码中没有使用TMC2208驱动器,而是直接使用Arduino的IO口来驱动步进电机。这可能会导致步进电机步数不准确。

其次,你的步进电机的步距角是18度,所以一圈应该有20个步进,而不是159步。你需要在代码中将步数修改为20步,才能使步进电机旋转一圈。

另外,你在代码中设置了一个固定的延迟时间delaym,这可能会影响步进电机的转速和准确性。建议使用更高级别的控制库,如AccelStepper或Stepper,以获得更好的步进电机控制精度和灵活性。

最后,需要注意的是,你的代码中的dir变量没有用到,如果想要改变步进电机的方向,需要根据需要修改dir变量的值,并将其传递给步进电机驱动器。

以下是修改过的代码,使用AccelStepper库来驱动步进电机:

#include <AccelStepper.h>

// 步进电机引脚定义
#define STEP_PIN 2
#define DIR_PIN 3

// 步进电机参数
#define STEPS_PER_REVOLUTION 20 // 步进电机每圈的步数
#define SPEED 1000 // 转速(步/秒)

AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  // 初始化步进电机
  stepper.setMaxSpeed(SPEED);
  stepper.setAcceleration(SPEED);

  pinMode(DIR_PIN, OUTPUT);
}

void loop() {
  // 设置方向
  digitalWrite(DIR_PIN, HIGH);

  // 转动一个圈
  stepper.move(STEPS_PER_REVOLUTION);
  stepper.runToPosition();

  delay(1000);
}

这个代码中使用了AccelStepper库来驱动步进电机,可以更加精确地控制步进电机的旋转。在setup()函数中,我们使用setMaxSpeed()和setAcceleration()函数来设置步进电机的最大速度和加速度。在loop()函数中,我们使用move()函数来让步进电机旋转一个圈,并使用runToPosition()函数等待步进电机旋转完成。最后,我们使用delay()函数暂停1秒钟,等待下一次旋转。

根据您提供的信息,可能存在以下几个原因导致步进电机步数不准确:

步进电机的实际步距与设计值不同,导致需要的步数与实际步数不一致。
TMC2208驱动器的微步细分设置不正确,导致步进电机的步数不准确。
电机驱动方式设置不正确,例如全步进还是半步进等。
Arduino程序的编写存在问题,导致步进电机步数不准确。
为了排除这些可能的原因,请尝试以下步骤:

确认步进电机的型号和实际步距,并将实际步距输入到程序中,确保程序计算的步数与实际步数一致。
确认TMC2208驱动器的微步细分设置是否正确,可以参考TMC2208的手册或者驱动器厂商提供的文档进行设置。
确认电机驱动方式设置是否正确,可以参考电机的规格书或者厂商提供的文档进行设置。
检查Arduino程序的编写是否存在问题,例如是否使用了正确的库函数、是否正确设置了引脚等。
如果以上步骤都已经确认无误,还存在步数不准确的问题,可以尝试更换其他驱动器或者电机,或者咨询相关厂商或技术支持人员进行解决。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先需要确定一下你使用的是什么型号的 TMC2208 驱动器,以及分辨率设置是多少?因为一些 TMC2208 驱动器(如 TMC2208-LA)默认分辨率是 16 次微步,而一些步进电机(如 NEMA 17)标称的步距角是 1.8 度 / 步,因此指令共需要 200 步才能完成一次完整的旋转,而 16 次微步则需要 3200 步。

在你的代码中,你使用了等待 1000 微秒的延迟,而你的步进电机每秒钟只能运行大约 600 圈左右。因此,你的步进电机每秒钟只会运行大约 95 步左右,远远少于一个完整转动所需要的 200 步或 3200 步(取决于 TMC2208 的分辨率设置)。这里需要做如下调整:

  1. 确定电机的标称步距角以及 TMC2208 的分辨率设置;
  2. 根据步距角和分辨率计算出每圈需要的步数;
  3. 根据你的延迟时间计算出电机每秒钟能够运转多少圈;
  4. 在循环中,根据计算出的每圈步数和转速来控制步进电机的运动。

下面是一个示例代码:

#include <AccelStepper.h>

// Define the pins used by the stepper motor driver
#define STEPPER_DIR_PIN 3
#define STEPPER_STEP_PIN 2

// Define the microstep resolution of the stepper motor driver
#define DRIVER_MICROSTEP_RESOLUTION 16

// Define the degrees per step of the stepper motor
#define MOTOR_DEGREES_PER_STEP 1.8

// Define the number of degrees the motor should turn
#define MOTOR_DEGREES_TO_TURN 360

// Define the maximum speed in steps per second
#define MAX_SPEED 1000

// Define the acceleration in steps per second per second
#define ACCELERATION 500

// Create an instance of the AccelStepper class
AccelStepper stepper(AccelStepper::DRIVER, STEPPER_STEP_PIN, STEPPER_DIR_PIN);

void setup() {
  // Set the number of microsteps per step on the driver
  stepper.setMaxSpeed(MAX_SPEED);
  stepper.setAcceleration(ACCELERATION);
}

void loop() {
  // Calculate the number of steps required to turn MOTOR_DEGREES_TO_TURN degrees
  float steps = DRIVER_MICROSTEP_RESOLUTION * MOTOR_DEGREES_TO_TURN / MOTOR_DEGREES_PER_STEP;
  
  // Set the direction of the motor
  stepper.setDirection(steps > 0 ? 1 : -1);

  // Set the speed based on the number of steps required and the maximum speed
  stepper.setSpeed(abs(steps / 2) > MAX_SPEED ? MAX_SPEED : abs(steps / 2));

  // Move the motor by the calculated number of steps
  stepper.move(steps);

  // Run the motor until it reaches the target position
  while (stepper.distanceToGo() != 0) {
    stepper.run();
  }
  
  // Wait for a moment before the next move
  delay(1000);
}

这个代码使用了 Arduino 的 AccelStepper 库,这个库可以让步进电机在满足最大速度和加速度的情况下移动,非常方便。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^问题分析:
根据代码,步进电机的步数是通过循环控制的,每次循环步数加1,循环次数为159次,因此一圈的步数应该是159步。但是实际情况是一圈的步数为160步,与预期不符。
可能原因:
1. 电机驱动器的细分设置不正确,导致步进电机的步数不准确。
2. 电机驱动器的细分引脚未连接,导致步进电机的步数不准确。
3. 步进电机的机械结构问题,导致步进电机的步数不准确。
解决方法:
1. 检查电机驱动器的细分设置是否正确,可以通过手册或者官方网站查询相关信息。
2. 检查电机驱动器的细分引脚是否连接正确,可以通过手册或者官方网站查询相关信息。
3. 检查步进电机的机械结构是否正常,可以通过拆卸电机进行检查。
4. 可以尝试使用其他的驱动器或者步进电机进行测试,以确定问题所在。
总结:
步进电机的步数不准确可能是由多种原因导致的,需要仔细检查每个环节,找到问题所在并进行解决。同时,可以通过更换驱动器或者步进电机进行测试,以确定问题所在。