Schrittmotorendstufe ansteuern

Hallo Leute :slight_smile:

ich müchte eine leadshire Endstufe mittels Arduino ansteuern die Endstufe braucht ein DIR und einen Step-inpulse

mittels eines Kippschalter mit 0-Mitterstellung soll die Laufrichtung vorgegenben werden und mittels eines Potis die Geschwindigkeit. Der Motor soll laufen solange eine Richtung anliegt und die 2 Endschlater geschlossen sind

es soll ein 4A Motor an einer Fräse angetriben werden ( kein CNC sondern nur die X-Achse )

leider habe ich nicht wirklich Ahnung vom Programmierung kann mich das eventuell jemand an die Hand nehmem ggf. gegen ein kleines Endgeld

zur Endstufe:
Signal

PUL - (PUL)
Schritt Impuls. Mit abfallender Flanke wird ein Schritt ausgelöst. Die Impulsbreite sollte >1,2μS sein

DIR - (DIR)
Richtungssignal. High oder Low Pegel. Das Richtungssignal muss 2μS vor dem Schrittimpuls anliegen.

leider habe ich nicht wirklich Ahnung vom Programmierung

Das kannst du ändern!

Lernen ist ein aktiver Prozess.
Wir lernen, indem wir es tun.

Und wir helfen wenn Du mal ein Verständnisproblem hast.

Eigentlich kann man Dein Problem mit einem NE555 und einem 2 Umpol-Schaltern lösen.
Aber Du hast schon recht. Mit Arduino geht es besser.

Wieso gibt es eigentlich keine "Arduino inside" Aufkleber?

Sieh auch einen Notstop Pilzschalter vor.

Grüße Uwe

gute idee :slight_smile:

der Schaltplan ist kein problem nur wenn mir die 4Amper um die uhren fliegen weil ich da falsch gemacht habe wird das teuer ....

mein problem ist hbalt das ich von if.. then einmal abgesehen absolut keinen Plan habe wie das programmtewchnisch zu berekstelligen ist

den Schalter abfragen ist klar aber dann ist auch schon Schluss

Prinziepiell müsste es so gehen

#include <stdint.h>

// pin assignment
const uint8_t stepPin = 2;
const uint8_t dirPin = 3;
const int PotiPin = A5;
const int RechtsPin = 6;
const int LinksPin = 7;
float Speed = 0;

void setup()
{
  digitalWrite(stepPin, HIGH);
  Serial.begin(9600);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(RechtsPin, INPUT_PULLUP);
  pinMode(LinksPin, INPUT_PULLUP);

}

int dir = 1;
void loop()
{
  float Poti = analogRead(PotiPin);
  int  Links = digitalRead(LinksPin);
  int  Rechts = digitalRead(RechtsPin);
  Speed  = Poti * (5.0);

  if (Links == LOW and Rechts == HIGH) {
    Serial.println("Links");
    digitalWrite(dirPin, HIGH);
    delayMicroseconds(3);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2);
    digitalWrite(stepPin, LOW);
  }
  if (Links == HIGH and Rechts == LOW) {
    Serial.println("Rechts");
    digitalWrite(dirPin, LOW);
    delayMicroseconds(3);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2);
    digitalWrite(stepPin, LOW);
  }
  float Zeit = Speed+100;
  Serial.print("Dir = ");
  Serial.println(dir);
  Serial.print("Vorschub ");
  Serial.println(Zeit);
  delayMicroseconds(Zeit);
}

wie hoch würdet Ihr das max. Delay setzen damit der Motor sich immernoch flüssig dreht ?

Du bestimmst die Geschwindigkeit indirekt durch

   Serial.begin(9600);

...
Serial.println("Links") ;
...
Serial.print("Dir = ") ;
Serial.println(dir) ;
Serial.print("Vorschub ") ;
Serial.println(Zeit) ;

Das ergibt effektiv eine loop-Zeit von > 30 ms.

Wenn du das nur selten ausgibst, bremst Serial deine loop nicht aus.

mittels
float Zeit = Speed+x
DelayMicroseconds(Zeit);

soll die Umdrehung eingestellt werden,
hat event. schon jmd Erfahrung mit solchen Sachen und kann mir ungefähr sagen welchen Wert für x man nehmen sollte

nee ist nur für's Testen.
Allerdings hätte ich gerne noch eine Anzeige der Drehgeschwingikeit mittel i2c LCD, dafür kannman dann ja ggf den Delay befehl etwaqsa kleiner machen, da das ganze nur füe den Vorschub der X-Achse ist kommt es auch nicht so drauf an bei paar Umdrehungen wenige ist nicht schlimm

das ist bestimmt nicht der beste Weg das zu lösen, ich kann es aber leider nicht besser