Arduino AccelStepper库:即时速度永远不会达到设定速度

问题描述

@H_502_0@我正在尝试开发一种arduino代码,该代码通过串行通信使用C#程序运行步进电机。我还使用Accelstepper库,尤其是moveto()和run()函数。我从C#发送了3500和200.000的maxSpeed和step值,并且电动机立即开始运行。我确定它可以完成所有步骤,但是过了一会儿,我注意到步进电机从未达到其最大速度,并且卡在了3200-3300范围内。因此,由于完成时间增加了。如果我给出的步数超过200.000,则估计完成时间与实际完成时间之间的差距将成倍增加。如果我将速度设为1000,则实际速度或多或少为970。由于需要扭矩,我不得不使用加速功能。然后我搜索了这个问题,有人说这是由于Accelstepper库引起的,该库包含run()函数和我在循环部分中编写的其他内容。特别是我无法确定问题的原因是Arduino,AccelStepper库还是我编写的代码。你能帮我解决问题吗? 注意:使用Arduino Mega 2560。 Arduino代码如下:

#include <AccelStepper.h>
#include <stdio.h>
#define STEP_PIN_C 5 //31
#define DIRECTION_PIN_C 23 //32
#define ENABLE_PIN_C 24 //33
#define SET_acceleration 600.0
AccelStepper stepper(1,STEP_PIN_C,DIRECTION_PIN_C);
unsigned long oldTime=0;
unsigned long Now;
float newSpeed;
float maxSpeed = 3500.0;
bool newDataBit,runAllowed = false,addingProg=false,mainProg=false;
char commandChar;
long currentPosition;
long int steps = 0,mainNewStep,addednewStep,memmainStep;
void checkSerial();
void checkRunning();
void stopMotor();
void runMotor();
void sendInfo();
const unsigned long delayTime = 1000;
unsigned long timer;
int count = 0;
bool running = false;

void setup()
{
  Serial.begin(9600);
  pinMode(ENABLE_PIN_C,OUTPUT);
  digitalWrite(ENABLE_PIN_C,HIGH);
  stepper.setCurrentPosition(0);             //initial value
  stepper.setMaxSpeed(0.0);                  //initial value
  stepper.setacceleration(SET_acceleration); //initial value
}

void loop()
{
  sendInfo();
  checkRunning();
  checkSerial();
}
void checkRunning()
{

  if (runAllowed == true) 
  {
    if (stepper.distancetoGo() == 0)
    {
      stopMotor();
      checkSerial();
    }
    else 
    {
      runMotor();
      checkSerial();
    }
  } 
}
void checkSerial()
{
  if (Serial.available())
  {
    newDataBit = true;
    commandChar = Serial.read();
  }
  if (newDataBit == true)
  {
    ///DoStuff depends on what is received as commandChar via serial port
    mainProgram(stepper.currentPosition(),newSpeed,mainNewStep);
    newDataBit = false;
  }
}


void runMotor(){
  digitalWrite(ENABLE_PIN_C,LOW);
  stepper.run();
  running = true;
}
void stopMotor(){
  stepper.setCurrentPosition(0);
  digitalWrite(ENABLE_PIN_C,HIGH);
  stepper.stop();
  running = false;
  timer = millis() + delayTime;
}

void mainProgram(long currentPositionValue,float maxSpeedValue,long stepValue)
{ 
  mainProg = true;
  if (stepper.distancetoGo() == 0) //YOLUMU TAMAMLADIM
  {
    addingProg = false; 
    steps = stepValue;
    stepper.setCurrentPosition(currentPositionValue);
    //stepper.setSpeed(0);
    stepper.setMaxSpeed(maxSpeedValue);
    stepper.moveto(steps);
  }
  else
  {
    steps = stepValue + steps;
    stepper.setCurrentPosition(currentPositionValue);
    //stepper.setSpeed(0);
    stepper.setMaxSpeed(newSpeed);
    stepper.moveto(steps);
  }
}
void sendInfo(){
  Now = millis();
  if(Now-oldTime > 1000){ //saniyede 1
     Serial.print(stepper.currentPosition());
     Serial.print(" ");
     Serial.print(stepper.isRunning());
     Serial.print(" ");
     Serial.println(stepper.speed());
     oldTime = Now;
  }
}

解决方法

来自AccelStepper documentation

可以可靠支持的最快电机速度约为4000 在Arduino(如Uno)上以16 MHz的时钟频率每秒每秒步进 等

这是如果您除了运行步进器之外什么都不做。 您检查串行接口并每秒发送多条线路。两者都很贵。