Arduino 如何使步进电机返回到起始位置?

Arduino 如何使步进电机返回到起始位置?,arduino,stepper,Arduino,Stepper,我使用的是带有TB6600驱动器的Arduino 2560、NEMA23步进电机。驱动器设置为1/32步分割。默认情况下,电机每转200步 我想输入步长、步数和稳定时间。 一旦循环完成了我想要返回到起点的步骤数。 计划是拍摄多幅图像并在Photoshop中叠加 到目前为止,除了回到起点……有些时候,一切正常。 如果我不走得太远,这意味着步数和步数的组合,电机将返回到起点。如果超过“X”距离,最后一步将继续向前移动,而不是向后移动。我还没有完全测试“X”距离是多少 示例:如果使用步长为5000的5

我使用的是带有TB6600驱动器的Arduino 2560、NEMA23步进电机。驱动器设置为1/32步分割。默认情况下,电机每转200步

我想输入步长、步数和稳定时间。 一旦循环完成了我想要返回到起点的步骤数。 计划是拍摄多幅图像并在Photoshop中叠加

到目前为止,除了回到起点……有些时候,一切正常。 如果我不走得太远,这意味着步数和步数的组合,电机将返回到起点。如果超过“X”距离,最后一步将继续向前移动,而不是向后移动。我还没有完全测试“X”距离是多少

示例:如果使用步长为5000的5个步骤,则代码返回到起点。如果我将步长更改为7,并将步长保持在5000,它不会返回,而是向前移动

以下是完整的代码:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h>

LiquidCrystal_I2C lcd(0x27,20,4);

//parameters for keypad
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = 
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {3,4,5,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,8,9,10}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int j;
long stepSize=0;
long numSteps=0;
int settleTime=0;
int stepsPR=6400;
int DelayCamClose=10;
int DelayAfterCam=500;
int relayCam=A0;  //pin to relay to trigger camera

Stepper focusStack(stepsPR, 13,12);

//get keypad entry
int GetNumber()
{
  int num = 0;
  char key = keypad.getKey();
  while(key != '#')
   {
    switch (key)
     {
       case NO_KEY:
        break;
         case '0': case '1': case '2': case '3': case '4':
         case '5': case '6': case '7': case '8': case '9':
            lcd.print(key);
            num = num * 10 + (key - '0');
            break;
         case '*':
            num = 0;
            lcd.setCursor(0,1);
            lcd.print("          ");
            lcd.setCursor(0,1);
            break;
        }
      key = keypad.getKey();
   }
   return num;
}
void setup()
{  
    lcd.init();  //initialize the lcd
    lcd.backlight();  //open the backlight
    pinMode(relayCam, OUTPUT);
    digitalWrite (relayCam,HIGH); 
}

void loop()
{   
   {
     lcd.clear();
     lcd.setCursor (0,0);
     lcd.print("Set Settle Time");    
     lcd.setCursor (0,1);
     settleTime = GetNumber();
    }
   {
     lcd.clear();
     lcd.setCursor (0,0);
     lcd.print("Set Step Size");    
     lcd.setCursor (0,1);
     stepSize = GetNumber();
    }
    {
     lcd.clear();
     lcd.setCursor (0,0);
     lcd.print("Set Number Of Steps");    
     lcd.setCursor (0,1);
     numSteps = GetNumber();
    }
    j=1;
    while (j<=numSteps)
    {
     focusStack.step(stepSize);
     delay(settleTime);
     digitalWrite (relayCam,LOW);  //opens the camera shutter
     delay  (DelayCamClose);  //wait time to close camera shutter
     digitalWrite (relayCam,HIGH);  //close camera shutter
     delay (DelayAfterCam);
     j=j+1;
    } 
    { 
     focusStack.step(-stepSize*numSteps); //returns to start
    }
 }
例如int和float,但这并没有解决问题。 我也变了

focusStack.step(-stepSize*numSteps); //returns to start

但这只能逆转问题,正如预期的那样

我也尝试过使用AccelStepper库,但这带来了一系列完全不同的问题


任何帮助都将不胜感激。我对编程还是相当陌生。

发现了这个问题。由于步长和numSteps是整数,因此数学将翻转32767(16位)以上的任何结果。任何超过32767的值都会导致溢出并转换为负值


现在,我只需要将步进机微步设置为允许足够的行程并保持在32767限制下的值。

了解步进机,然后重新考虑。部分步进不是你的朋友。开环步进器没有“零”。我理解步进器,可能没有你理解的程度。我也知道他们没有零。问题是在某些情况下我可以返回到“零”。我只是不明白,为什么如果我超过x距离,马达会向前移动,移动的距离与它应该向后移动的距离相同。问题是最后一行的数学,我只是不知道问题是什么,也不知道如何解决。无论如何,感谢阅读。这可能是由于使用微步时出现齿槽,特别是在改变方向时。做个实验看看这是不是真的。更改代码(可能还有驱动模块上的DIP开关设置,以执行完整步骤,本机200。然后重复。如果归零问题消失,则是微步问题。此外,还有一些加速曲线(特别是在改变方向时)可能导致零损耗。请记住,即使没有电阻,电枢本身也有旋转动量。谢谢。当我超过32767时,我尝试了几乎所有微步的组合,并且所有的动作都指向翻转符号。它现在按照我希望的方式工作。循环完成步骤后,现在返回起点。下一步是将步长转换为实际距离。
focusStack.step(-stepSize*numSteps); //returns to start
focusStack.step(stepSize*numSteps); //returns to start