Sketch Hilfe Arduino

Hallo Zusammen, ich brauche Hilfe bei einem Sketch der Motor soll bei Start langsam beschleunigen. Wie kann ich in dieses Sketch diese Funktion einfügen?

const int STEP_PIN = 5;
const int Enable_PIN = 6;
const int DIR_PIN = 4;
float val = 8; //Gewünschte Drehzahl/Sekunde
int d = 0; //Pulszahl/Umdrehung

void setup()
{
pinMode(STEP_PIN, OUTPUT);
pinMode(Enable_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
digitalWrite(STEP_PIN, LOW);
digitalWrite(Enable_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
}
void loop()
{
d = 999997/(val*6400);
//Serial.println(d);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(3);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(d);

}

Vielen Dank

Welcher Motortyp?

Da ein Arduino normalerweise keinen Motor direkt antreiben kann, welchen Motortreiber verwendest Du?

Sollte es sich um einen Schrittmotor handeln, so hat die Programmbibliothek MobaTools eine Beschleunigungsrampe eingebaut.

z.B. AccelStepper (wo der wohl seinen Namen her haben mag?)
Oder eine der Alternativen....

Ansonsten:
Kundig machen und selber tun.

Hallo
Sieht nach Stepper aus , am Besten du verwendest eine lib dazu
Empfehlung MobaTools
Heinz

Ich verwende Nema 34 mit cl86t

Mobatool habe ich probiert nur die Geschwindigkeit ist zu niedrig

Unter der Annahme, Du hast alles richtig gemacht, stelle ich die Behauptung auf, schneller geht es mit Deiner Hardware nicht.

Selbstverständlich sollst Du meine Behauptung in Zweifel ziehen und widerlegen, dafür ist sie da.

Mit dem Sketch da oben läuft er ohne Last ganz gut mit MobaTools Geschwindigkeit 2000 ist maximal einzige was mir fehlt ist ein Befehl zum langsamen Start.

Satzzeichen retten Leben!

Dieser "Befehl" könnte Subtrahieren sein. Du fängst bei sagen wir d=1000 an und subtrahierst einen Wert, bis Du bei d<999997/(val*6400) ankommst, dann setzt Du d=999997/(val*6400);

Danke für deine Antwort. Leider versteh ich nicht ganz wie ich anfangen soll. Kannst du mir vielleicht ein konkretes Beispiel dafür geben? :sweat_smile:

Ungetestet:

const int STEP_PIN = 5;
const int Enable_PIN = 6;
const int DIR_PIN = 4;
float val = 8; //Gewünschte Drehzahl/Sekunde
unsigned int d = 1000; // zusätzliche Pause/Umdrehung
unsigned int delta = 10;

void setup()
{
  pinMode(STEP_PIN, OUTPUT);
  pinMode(Enable_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  digitalWrite(STEP_PIN, LOW);
  digitalWrite(Enable_PIN, LOW);
  digitalWrite(DIR_PIN, HIGH);
}
void loop()
{
  unsigned int sollZeit = 999997 / (val * 6400);
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(3);
  digitalWrite(STEP_PIN, LOW);
  delayMicroseconds(d);

  if (d - delta < sollZeit)
  {
    d = sollZeit;
  } else {
    d -= delta;
  }
}

Falsche Kommentare sind noch schlimmer als gar keine.
Wenn ich deinen Sketch anschaue, dürften die 6400 die Pulszahl / Umdrehung sein:
d = 999997/(val*6400);
und 'd' eher die Zeit zwischen 2 Steps. Wenns genauer werden soll. musst Du dann aber noch die anderen Zeitverzögerungen im loop berücksichtigen, z.B. die delay(Microscond(3). Dein 999997 hilft dir da nichts, die 3µs darfst Du erst vom Ergebnis abziehen.
Du kommst dabei auf eine Steprate von >50kHz. Das ist schon sehr ambitioniert. Auf einem UNO geht das weder mit Accelstepper noch mit MobaTools.
Welchen Prozessor verwendest Du? Soll der am Ende auch noch was anderes machen, als nur die Stepimpulse erzeugen?

P.S. benutze bite Codetags, wenn Du Programmcode postest.

P.P.S Auch float-Berechnungen kosten auf einem UNO viel Zeit. Das fällt in deinem bisherigen Sketch nicht auf, da der Compiler das wegoptimiert ( weil 'val' sich nicht ändert ). Ansonsten braucht allein die Berechnung von 'd' schon mehr Zeit, als Du Verzögerung zwischen den Steppulsen haben willst.

Wenn sich val nicht ändert und d ein Interger ist, könnte man den Wert doch zu Beginn Konstant festlegen. Da braucht es dann keine Rechnung mehr, was die Laufzeit stört.

Naja, das ist ja die Frage ob das auch in Zukubft so bleibt. Ich nehme mal an, dass der Sketch noch erweitert werden soll. Derzeit erkennt der Compiler ja schon, dass sich val nicht ändert und macht die Berechnung von 'd' zur Compilezeit. Wenn 'val' immer eine ganzzahlige Konstante bleiben sollte, macht es eh keinen SInn, die als 'float' zu definieren.

P.S: wenn val kein float ist, muss man dem Compiler aber anders klarmachen, dass er die Berechnung von 'd' als 'long machen muss ( wegen dem 999997 ). z.B.
d = 999997UL/(val*6400);
D.h. auch in dem 'Mini-Sketch' gibt's noch einiges zu klären :grinning:

1 Like

Es soll nur den Motor drehen.

Kann man den Sketch so schreiben dass der Motor z.B. erste 10 Umdrehungen mit 0,5 u/s dann die nächste 20 Umdrehungen mit 3 u/s und dann als letztes mit 9 u/s. Es soll zum Schluss mit 8-9 u/s konstant bleiben. Ich bin ganz neu auf dem Gebiet und verstehe es noch nicht ganz wie die ganzen Sketch funktionieren.

Und nach welchen Vorgaben? Einfach vom Einschalten dann mit konstanter Geschwindigkeit? Wann Beschleunigen? nur beim Einschalten? Ändert sich die Drehzahl nie?
Erzähl mal ein bisschen mehr über dein Projekt, sonst ist das alles nur raten. Wir können weder auf deinen Basteltisch, noch in deinen Kopf schauen.

Es soll direkt beim einschalten langsam anfangen zudrehen sagen wir erste 10 sec mit 0,5 U/sec, dann 20 sec mit 2 u/sec, dann 20 sec mit 5/sec und als letztes auf Dauer mit 8-9 u/sec. Zwischendurch soll er nicht anhalten. Dass Problem der Motor wird verwendet als Antrieb und wenn ich direkt mit 8 u/sec anfange dann stoppt der Motor weil er kommt auf seine Umdrehungen nicht. Wenn ich einstelle 0,5/sec dann kein Problem er seht,aber es ist Zuwenig Umdrehungen.

Was tut mein Programm aus #12?

Ja. Anstelle stufenweise fände ich kontinuierlich besser.

Darum verwenden die Bibliotheken auch eine Beschleunigungsrampe, vollkommen normal also.