Библиотека Arduino AccelStepper: мгновенная скорость никогда не достигает заданной скорости

Я пытаюсь разработать код Arduino, который запускает шаговый двигатель с программой С# через последовательную связь. Я также использую библиотеку Accelstepper, особенно функции moveTo() и run(). Я отправил значения maxSpeed ​​и step в виде 3500 и 200 000 из C#, и двигатель сразу же заработал. Я уверен, что он выполняет все шаги, но через некоторое время я заметил, что шаговый двигатель никогда не достигает своей максимальной скорости и зависает в диапазоне 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;
  }
}

person Akın Şibay    schedule 14.10.2020    source источник


Ответы (1)


Из документации AccelStepper:

Самая высокая скорость двигателя, которую можно надежно поддерживать, составляет около 4000 шагов в секунду при тактовой частоте 16 МГц на Arduino, таких как Uno и т. Д.

Это если вы ничего не делаете, кроме запуска степпера. Вы проверяете свой последовательный интерфейс и отправляете несколько строк каждую секунду. И то, и другое довольно дорого.

person Piglet    schedule 15.10.2020