previousMillis = micros() oder previousMillis += intervall? Schrittmotorsteuerug

Setup: Uno + A4988 + Nema 11

Ich möchte einen Schrittmotor konstant auf eine Geschwindigkeit beschleunigen. Dazu habe ich eine lookup Tabelle angelegt, die ich vorher in Excel berechnet habe. Funktioniert auch wunderbar.

Dieser Code ergibt einen ruhigen Lauf des Motors.

#include <avr/pgmspace.h>

static const unsigned long Rampe[]PROGMEM = {
  10000, 5000, 4375, 3956, 3647, 3404, 3207, 3042, 2901, 2779, 2672, 2576, 2491, 2414, 2343, 2279,
  2220, 2165, 2114, 2067, 2023, 1982, 1943, 1906, 1871, 1839, 1808, 1778, 1750, 1723, 1698, 1673, 1650,
  1627, 1606, 1585, 1565, 1546, 1527, 1510, 1492, 1476, 1460, 1444, 1429, 1415, 1400, 1387, 1373, 1360,
  1348, 1336, 1324, 1312, 1301, 1290, 1279, 1269, 1258, 1248, 1239, 1229, 1220, 1211, 1202, 1193, 1185,
  1176, 1168, 1160, 1152, 1145, 1137, 1130, 1123, 1116, 1109, 1102, 1095, 1089, 1082, 1076, 1070, 1064,
  1058, 1052, 1046, 1040, 1034, 1029, 1023, 1018, 1013, 1008, 1003, 997, 993, 988, 983, 978, 973, 969,  
};

const int ArraySize = sizeof(Rampe) / sizeof(Rampe[0]); 
unsigned long previousMotorMillis = 0;
unsigned long time;
int i = 0;

byte enablePin = 9;
byte stepPin = 11;
byte directionPin = 12;

void setup()
{
  pinMode(directionPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, LOW);
  Serial.begin(9600);
}


void loop()
{
  ablauf();
}


void ablauf()
{
  // Beschleunigung
  while (i < ArraySize)
  {
    time = pgm_read_dword(&Rampe[i]);
    stepper();
  }  

  i = 0;
 delay(1000);
}


void stepper()
{
  
  if (micros() - previousMotorMillis >= time )
  { 
    digitalWrite(stepPin, HIGH);
    digitalWrite(stepPin, LOW);
    previousMotorMillis = micros();  //previousMotorMillis += time funktioniert nicht in Kombination mit delay() !! warum?
    i++;
  }
}

Sobald ich aber previousMotorMillis = micros() durch previousMotorMillis +=time ersetze gibt es ein Problem. Beim ersten Durchlauf läuft der Motor wie er soll beschleunigt an. Ab der zweiten Schleife macht der Motor nur noch einen kurzen Ruck, dann Pause, wieder ein Ruck, usw.

Das Problem tritt nur auf wenn das delay(1000) gesetzt ist. Ich verstehe nicht warum das Problem überhaupt auftritt, weil die Schritte des Motors durch die while Schleife vorher abgearbeitet sind bevor der Code das Delay(1000) sieht.

Würde das Problem gerne verstehen- deswegen bin ich dankbar für jede Hilfe.

Mein Compiler mag Deinen Code nicht.

Das ist schade. Ich verwende Arduino 1.8.1.

Und ich mag delay() nicht.
(zumindest nicht, wenn es mich blockiert)

Die Farb-Formatierung hat gestört, die gehört nicht zwischen die Code-Tags.

Die Variable time enthält eine absolute Zahl, während micros() weiterläuft, also relativ zu verwenden ist. Das berücksichtigst Du mit +=, aber Du vergißt, previousMotorMillis zu initialisieren. Eventuell so:

previousMotorMillis = micros();
while (i < ArraySize)

Über die Grundsatzfrage delay() ja/nein können wir gerne nach der Lösung des Problems diskutieren :).

Edit: Farbe im Code entfernt.

SDHC1:
Edit: Farbe im Code entfernt.

Gut, Lösungsvorschlag in #4.

agmue:
Gut, Lösungsvorschlag in #4.

Vielen Dank- das funktioniert 1a!