Schritt-Takt-Steuerung Arduino -> Treiber -> Motor

Moin,

ich versuche einen Nanotec Schrittmotor (ST8918D6708-A) mit einem Motortreiber (C5-E-2-21) anzutreiben, welcher sich im Takt-Richtungsmodus befindet und die Signale dafür von einem Arduino Uno empfangen soll. Der Schrittmotor ist dabei auf 48V parallel angeschlossen.

Ich habe mittlerweile einen Code mit dem es immerhin möglich ist den Motor mit einer Geschwindigkeit von ca. 850 Schritten pro Sekunde zu fahren, allerdings bräuchte ich eine Drehzahl von knapp 1000 U/min (wären dann ca. 3333 Schritte pro Sekunde). Die Geschwindigkeit ist mit diesem Motor definitiv möglich, da ich diese mit dem selben Motortreiber bereits über die Nanotec Software "Plug & Drive 2.1.7" gefahren bin. Stelle ich die Geschwindigkeit im Code auf mehr als 900 Schritte pro Sekunde blockiert der Motor.

Den Code hänge ich mit an. Falls jemand eine Idee hat würde mir das sehr helfen.

MfG

#include <AccelStepper.h>

// Pins für den Schrittmotortreiber
const int stepPin = 2;
const int dirPin = 3;
const int enablePin = 4;

// Schritte pro Umdrehung des Schrittmotors
const int stepsPerRevolution = 200; // Anpassen an deinen Motor

// Schrittmotor initialisieren
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

// Variablen für Geschwindigkeit und Beschleunigung
float maxSpeed = 800.0; // Maximale Geschwindigkeit in Schritte pro Sekunde
float acceleration = 100.0; // Beschleunigung in Schritte pro Sekunde^2

void setup() {
  // Setze die Pins für den Schrittmotor
  pinMode(enablePin, OUTPUT);
  
  // Setze die maximale Geschwindigkeit und Beschleunigung
  stepper.setMaxSpeed(maxSpeed);
  stepper.setAcceleration(acceleration);

  // Initialisiere die serielle Kommunikation
  Serial.begin(9600);
  
  // Enable Pin auf LOW setzen, um den Treiber zu aktivieren
  digitalWrite(enablePin, LOW);
  
  // Debug-Ausgabe der initialen Einstellungen
  Serial.print("Initial max speed: ");
  Serial.println(maxSpeed);
  Serial.print("Initial acceleration: ");
  Serial.println(acceleration);
}

void loop() {
  // Lese Befehle über die serielle Schnittstelle ein
  if (Serial.available() > 0) {
    char command = Serial.read();
    
    switch (command) {
      case 'F': // Bewege vorwärts
        Serial.println("Accelerating forward to max speed");
        setMotorSpeed(true); // Beschleunige vorwärts
        break;
      case 'B': // Bewege rückwärts
        Serial.println("Accelerating backward to max speed");
        setMotorSpeed(false); // Beschleunige rückwärts
        break;
      case 'S': // Stoppe den Motor
        Serial.println("Stopping");
        stepper.stop(); // Stoppe den Motor sanft
        stepper.setSpeed(0); // Setze die Geschwindigkeit auf 0
        break;
      case 'R': // Setze die Geschwindigkeit
        if (Serial.available() > 0) {
          maxSpeed = Serial.parseFloat();
          Serial.print("Setting speed to ");
          Serial.println(maxSpeed);
          stepper.setMaxSpeed(maxSpeed);
        }
        break;
      case 'A': // Setze die Beschleunigung
        if (Serial.available() > 0) {
          acceleration = Serial.parseFloat();
          Serial.print("Setting acceleration to ");
          Serial.println(acceleration);
          stepper.setAcceleration(acceleration);
        }
        break;
    }
  }

  // Schrittmotor weiter bewegen, falls ein Befehl aktiv ist
  stepper.runSpeed();
}

// Funktion zum Setzen der Geschwindigkeit
void setMotorSpeed(bool forward) {
  if (forward) {
    stepper.setSpeed(maxSpeed);
  } else {
    stepper.setSpeed(-maxSpeed);
  }
  // Debug-Ausgabe der aktuellen Einstellungen
  Serial.print("Current speed: ");
  Serial.println(stepper.speed());
}

Da würde ich an Deiner Stelle nochmal drüber nachdenken.

Gruß Tommy

Dass da lt. Datenblatt das Drehmoment schon extrem in die Knie gegangen ist, ist dir klar?

Ausserdem wird der Motor das niemals ohne Beschleunigungsrampe erreichen.

Da gibt es keine Beschleunigung.
Schau dir die Doku von AccelStepper mal genauer an, da passt einiges in deinem Code nicht. Oder steig um auf die MobaTools.

1 Like
stepper.setMinPulseWidth(100);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.