MobaTools Library: Version 2.1 1 mit Verwalten von Tastern/Schaltern

Ach, das lass ich jetzt mal drin. Da sieht man, dass bei den MobaTools ein delay nicht stört 8) .
Ist ja immerhin ein Vorteil der MobaTools...

Gerade wollte ich mir das Beispiel ProportionalControl vornehmen, da wirft mir der Compiler so viele Meldungen raus, daß ich den entscheidenden Fehler nicht erkennen kann:

/*  Demo zum Anschluß eines unipolaren Stepmotors 28BYJ-48
    Der Schrittmotor folgt den Bewegungen eines Potentiometer
*/
#include <MobaTools.h>
Stepper4 Step1(4096);           // HALFSTEP ist default
const byte analogPin = A0;

void setup() {
  Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  Step1.setSpeed( 60 );       // = 6 U/Min
}

void loop() {
  long winkel = analogRead(analogPin) * 270L / 1024;
  Step1.write(winkel);               // Bewegung
}
[sup]F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp: In function 'void stepperISR(uint8_t)':
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:192:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                        if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                      ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:220:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                   ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:230:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                   ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:180:24: warning: enumeration value 'INACTIVE' not handled in switch [-Wswitch]
                 switch ( stepperDataP->rampState ) {
                        ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:180:24: warning: enumeration value 'RAMPSTART' not handled in switch [-Wswitch]
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:38:13: warning: unused variable 'i' [-Wunused-variable]
     uint8_t i, spiChanged, changedPins, bitNr;
             ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:39:14: warning: unused variable 'tmp' [-Wunused-variable]
     uint16_t tmp;
              ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp: In function 'void initSPI()':
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:332:10: warning: unused variable 'tmp' [-Wunused-variable]
     byte tmp;
          ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp: At global scope:
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:403:65: warning: unused parameter 'minStepTime' [-Wunused-parameter]
 void Stepper4::initialize ( int steps360, uint8_t mode, uint8_t minStepTime ) {
                                                                 ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp: In member function 'uint16_t Stepper4::setSpeedSteps(uint16_t, int16_t)':
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:608:14: warning: unused variable 'fullRampLen' [-Wunused-variable]
     uint16_t fullRampLen;
              ^
F:\Arduino\libraries\MobaTools\src\MoToSoftled.cpp: In function 'void softledISR(uint8_t)':
F:\Arduino\libraries\MobaTools\src\MoToSoftled.cpp:135:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
F:\Arduino\libraries\MobaTools\src\MoToSoftled.cpp:140:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
F:\Arduino\libraries\MobaTools\src\MoToSoftled.cpp:148:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
F:\Arduino\libraries\MobaTools\src\MoToSoftled.cpp:156:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp: In member function 'void Stepper4::rotate(int8_t)':
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:913:20: warning: enumeration value 'INACTIVE' not handled in switch [-Wswitch]
             switch ( _stepperData.rampState ) {
                    ^
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:913:20: warning: enumeration value 'RAMPSTART' not handled in switch [-Wswitch]
F:\Arduino\libraries\MobaTools\src\MoToStepper.cpp:913:20: warning: enumeration value 'SPEEDDECEL' not handled in switch [-Wswitch]
Der Sketch verwendet 8780 Bytes (27%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 281 Bytes (13%) des dynamischen Speichers, 1767 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
[/sup]

Funktionieren tut es wohl. Wo steckt mein Fehler?

Ok, sollte ich wohl auch mal alle warnings einschalten beim Testen. Ich hab's nur auf 'Standard' stehen. Bei 'alle' ist er schon sehr pingelig. Aber da werde ich auf alle Fälle mal drüberschauen. Bei so Sachen wie 'unused variable' kann man dann ja auch den source vereinfachen.
Es ist immer gut, einen unabhängigen Tester zu haben, DANKE!

agmue:
Funktionieren tut es wohl. Wo steckt mein Fehler?

Wenn es funktioniert, welchen Fehler meinst Du?

MicroBahner:
Wenn es funktioniert, welchen Fehler meinst Du?

Den, über den der Compiler so erzürnt ist. So viel Text bekomme ich sonst nur, wenn ich mich an OOP versuche ::slight_smile:

So findet es der Compiler netter:

#include <MobaTools.h>
Stepper4 Step1(4096);           // HALFSTEP ist default
const byte analogPin = A0;

void setup() {
  Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  Step1.setSpeed( 60 );       // = 6 U/Min
  Step1.setRampLen(0);        // Beschleunigung
}

void loop() {
  long winkel = analogRead(analogPin) * 270L / 1024;
  Step1.write(winkel);               // Bewegung
}

Aber wie soll man keine Beschleunigung erklären?

Mysteriös wird es dann mit Step1.setRampLen(10); (war die Idee, um die Warnungen zu umgehen)

  • Programmstart, Poti auf 0, Motor ohne Bewegung
  • Drehe Poti auf Wert X, Motor dreht auf geschätzt passende Position
  • Der Motor bleibt nicht stehen, die TreiberLEDs flackern, sondern bewegt sich langsam in entgegengesetzte Richtung.

Das Verhalten ist reproduzierbar, nach der ersten Drehung bleibt der Motor nicht stehen und reagiert auch nicht auf neue Winkel. Motor und Poti werden vom UNO versorgt. Spontaner Verdacht: Der ständige Aufruf von write verträgt sich nicht mit der Rampe.

Ok, schau ich mir an.
Edit: Ich kann den Fehler reproduzieren, und deine Vermutung scheint zu stimmen: mit einem kleinen delay im loop tritt es nicht mehr auf.
Muss ich jetzt genauer untersuchen. Danke

Der Fehler lässt sich sehr gut reproduzieren - auch ohne Poti. Er tritt auf, wenn 2 unterschiedliche Absolutpositionen in extrem kurzen Abstand vorgegeben werden. Z.B. so:

void loop() {
  Step1.write(100);
  Step1.write(99);
  delay(5000);
}

Das geht evtl. 1 oder 2mal gut, und dann verhaspelt er sich. Auch ohne Rampe ist das nicht OK, der Effekt ist nur anders. Mit einem delay(20) dazwischen passiert nichts mehr.
Die Ursache ist mir noch nicht klar, das bedarf einer intensiveren Fehlersuche :grin:

Hast Du gut gefunden. Wie sagt der Ami: 'good catch' 8)

MicroBahner:
Hast Du gut gefunden. Wie sagt der Ami: 'good catch' 8)

Ich hatte überhaupt nicht gesucht, wollte nur etwas Programmierspaß haben. Aber auch das blinde Huhn findet bekanntlich ein Körnchen.

MicroBahner:
Die Ursache ist mir noch nicht klar, das bedarf einer intensiveren Fehlersuche :grin:

Ich drängle nicht und wünsche Dir viel Erfolg!

agmue:
Ich hatte überhaupt nicht gesucht,

Na, das sind doch beste Voraussetzungen. Wenn man gezielt sucht, findet man bekanntlich nie das was man sucht, sondern eh immer was anderes :smiley: .

agmue:
wollte nur etwas Programmierspaß haben.

Ein kleines delay() :wink: reicht, und der Spaß kann weitergehen...

Hi

Schuss ins Blaue: Interrupt und Sollwert-Übergabe in >1Byte - der Interrupt 'schaut' den Sollwert an, wo Der noch nicht fertig geschrieben wurde - Stichwort atomar.
Habe mir die Lib aber nicht angeschaut - also nicht hauen, wenn Das bereits mit gesperrten Interrupts verarbeitet wird.

MfG

postmaster-ino:
also nicht hauen, wenn Das bereits mit gesperrten Interrupts verarbeitet wird.

Ok, ich lass den Knüppel im Sack :grin: .
Nee, wenn da so grundsätzliche Fehler drin wären, würde es ständig rauchen.

Hallo agmue,
wenn Du magst, kannst Du mal schauen, ob du mit dem aktuellen Masterstand auf GitHub wieder Spaß hast.
Und kurbel mal kräftig am Poti :smiley: .
Edit: ein kleiner, aber geiler Sketch, der die Lib richtig fordert 8) .

(Die Geschichte mit den warnings ist noch unverändert - da ist mehr zu tun, das gibt dann im nächsten Release )

Ja, das sieht gut aus!

Um die Warnungen nicht zu sehen und weil der Motor mit Rampe schneller drehen kann - ein klares Argument für die Rampe - ein mögliches Beispielprogramm:

/*  Demo zum Anschluß eines unipolaren Stepmotors 28BYJ-48
    Der Schrittmotor folgt den Bewegungen eines Potentiometer
*/
#include <MobaTools.h>
Stepper4 Step1(4096);           // HALFSTEP ist default
const byte analogPin = A0;

void setup() {
  Step1.attach( 4, 5, 6, 7 ); // Anschluß an digitalen Ausgängen; Treiber IN1,IN2,IN3,IN4
  Step1.setSpeed( 240 );      // = 24 U/Min
  Step1.setRampLen(50);       // Beschleunigung
}

void loop() {
  long winkel = analogRead(analogPin) * 360L / 1024;
  Step1.write(winkel);               // Bewegung
}

agmue:
Um die Warnungen nicht zu sehen

Vielleicht noch ein Hinweis zu den Warnungen, die beim Compilieren der Lib ausgegeben werden: Mit deinem Sketch kannst Du das nicht beeinflussen, das liegt allein im Code der Lib und in deinen Einstellungen in der IDE.
Dass die Warnungen nicht immer ausgegeben werden, liegt daran, dass die Dateien der Lib nicht jedesmal übersetzt werden, wenn Du deinen Sketch compilierst. Die Lib wird nur compiliert, wenn sich dort etwas geändert hat, oder wenn Du die Zielplattform änderst. Z.B. von UNO auf Micro oder Nano.

Hi

Habe das Beispiel 'etwas' modifiziert und bin auf ein mir akut nicht erklärbares Phänomen gestoßen.
Der Sketch lässt den Mini-Stepper alle 5 Sekunden 20 Umdrehungen 'rechts herum' machen.
Ausgabe im Terminal zeigen, wo der Stepper hin soll und wo Er aktuell ist.
Wenn nach den 5 Sekunden das Ziel noch nicht erreicht wurde, wird die IST-Position und ein Punkt ausgegeben.

/*  Demo zum Anschluß eines unipolaren Stepmotors 28BYJ-48
    Der Schrittmotor folgt den Bewegungen eines Potentiometer
*/
#include <MobaTools.h>
//Mini-Stepper aka eBay 352673071758
//hat Steps/U 40 HalfSteps
//10 u/sek (6000 10tel U pro Min) klappt noch :) bei 185 Ohm Serienwiderstand
//Rampe 20 Steps lang klappt noch, bei 'Mehr' sieht man aber 'mehr'
//Stepper stupide per Vorwiderstand 370 Ohm an 7 und 8, 9 und 10 per Drahtrücke
//(2x 370 Ohm parallal überlebt der Nano auch direkt)
//Coil A 7-9, Coil B 8-10
//hat aber nahezu NULL Kraft :) (Spulenwiderstand ~200 Ohm)
//  Stepper4 Step1(40);           // 40 HALFSTEP pro Umdrehung
//  Step1.attach( 7, 8, 9, 10 ); // Coil A, Coil B, Coil A, Coil B
//  Step1.setSpeed( 7200 );      // :10=r/Min :600=r/Sek
//  Step1.setRampLen(40);       // 40=1 Umdrehungen
//nur der nakte Stepper, ohne irgendwas als Abtrieb/Zeiger/o.Ä.
//bei setSpeed 7200 gab's Schrittverluste - Zahnrad 'lag an Papier an', damit man 'was hört'

Stepper4 Step1(40, HALFSTEP);          // HALFSTEP ist default, wenn weg gelassen
const uint32_t diff = 5000;             //alle x ms die Soll-Position erhöhen

void setup() {
  Serial.begin(9600);
  Step1.attach( 7, 8, 9, 10 ); // Coil A ist an 7&9, Coil B an 8&10
  Step1.setSpeed( 6000 );      // = in x10 U/Min
  Step1.setRampLen(120);       // Beschleunigung (120=3 Umdrehungen a 40)
}

void loop() {
  static uint32_t altmillis = millis() - diff;  //löst direkt die Erhöhung des Ziel aus
  static int32_t winkel = 0;
  if (millis() - altmillis >= diff) {
    altmillis = millis();                //egal was ist, die nächste Prüfung nach 'diff'
    boolean lf = false;                //für's Terminal, lf ausgeben ja/nein
    if (Step1.stepsToDo() == 0) {
      lf = true;
      winkel += 7200;
      Serial.print("Ziel:");
      Serial.print(winkel);
      Step1.write(winkel);               // Bewegung
      Serial.print(" ist:");
    } else {
      Serial.print('.');
    }
    long ziel = Step1.read();
    Serial.print(ziel);
    if (lf) Serial.println();
  }
}

Ausgabe im Terminal:

Ziel:7200 ist:0
22:38:50.315 -> Ziel:14400 ist:7200
...
22:42:00.719 -> Ziel:288000 ist:280800
22:42:05.687 -> Ziel:295200 ist:288000
22:42:10.687 -> .271566.253566.235575.217575.199575.181575.163575.145575.127575.109575.91575.73575.55575.37575.19575.1575.-16425.-34425.-52416.-70416.-88416.-106416.-124416.-142416.-160416.-178416.-196416.-214416.-232416.-250416.-268416.-286416Ziel:302400 ist:-294624
22:44:55.781 -> Ziel:309600 ist:-287424
...

22:48:10.828 -> Ziel:590400 ist:-6624
22:48:15.844 -> Ziel:597600 ist:576
22:48:20.812 -> Ziel:604800 ist:7776
...
22:51:30.906 -> Ziel:878400 ist:281376
22:51:35.922 -> Ziel:885600 ist:288576
22:51:40.890 -> .272214.254214.236214.218205.200205.182214.164214.146214.128214.110214.92214.74214.56214.38214.20214.2214.-15786.-33786.-51786.-69786.-87786.-105777.-123777.-141777.-159777.-177786.-195786.-213777.-231777.-249777.-267777.-285777Ziel:892800 ist:-294048
22:54:25.969 -> Ziel:900000 ist:-286848
22:54:30.984 -> Ziel:907200 ist:-279648
...
22:57:36.015 -> Ziel:1173600 ist:-13248
22:57:41.047 -> Ziel:1180800 ist:-6048
22:57:46.015 -> Ziel:1188000 ist:1152
22:57:51.031 -> Ziel:1195200 ist:8352
...

Mir will momentan nicht auffallen, wo der Sketch/die Lib auf 18 Bit begrenzt - zumindest scheint Es so, daß, sobald Bit 18 benutzt wird, intern mit einer negativen Position gerechnet wird - somit dreht der Stepper 'eine halbe Stunde lang' in Gegenrichtung, bis Er wieder auf Soll ist.
Danach macht Er brav Seine 10 Umdrehungen und wartet darauf, daß die 5 Sekunden bis zum Positionswechsel überstanden wurden.
Bei long müssten eigentlich 'ein paar mehr' Stellen möglich sein.

Wer sieht, was mir bisher verborgen bleibt?

Auch hatte ich das Problem, wenn ich die Winkel EINZELN erhöhe, Er mir alle 4 Schritte 'zurück' springt - der Stepper hat nur 40 Steps/Umdrehung, hätte eher erwartet, daß 'laaaange Zeit' Nichts passiert und dann halt alle paar Sekunden ein Schritt in 'die richtige Richtung' ausführt - bei größeren Winkeln (aka +60°) keinerlei Probleme.
Soll aber eher ein Nebenproblem sein.

MfG

Hallo,
erstmal danke, dass Du dich auch mit den MobaTools beschäftigst und testest. Je mehr Ideen für Testsketche, umso besser 8) .

Ich denke, dass ich das Problem, dass Du hast, zufällig gestern gefunden habe - Bei der Umrechnung von Winkel in Steps gabs noch ein Problem mit int statt long. Habe ich leider erst kurz nach dem letzten Release (1.1.2) gefunden. In der aktuellen master auf GitHub sollte das bereits bereinigt sein.
Ich werde mir dein Beispiel aber nochmal genauer anschauen. Das mit den EINZEL Winkeln sollte ja auch nicht so sein.

MicroBahner:
Vielleicht noch ein Hinweis zu den Warnungen, die beim Compilieren der Lib ausgegeben werden: Mit deinem Sketch kannst Du das nicht beeinflussen, das liegt allein im Code der Lib und in deinen Einstellungen in der IDE.

Das ist mir klar, nur wollte ich Dir schöne Beispiele stricken, wo Warnungen nicht so gut aussehen. Also suchte ich nach einer Variante, die keine Warnungen erzeugt. Da sich die Warnungen auf die Rampe bezogen, habe ich dann meinen Sketch mit einer Rampe versehen. Siehe da, keine Warnungen mehr, jupidu!

Über diesen Umweg konnte ich die Geschwindigkeit deutlich von grenzwertigen 10 U/Min auf sichere 24 U/Min erhöhen. Ein "netter Nebeneffekt" der Rampe :slight_smile:

Hi

Mit der Version aus der IDE (V1.1.2) hatte ich gar keine Warnungen erhalten, mit der neuen Version ist's etwas roter geworden.
Hauptsächlich unbenutzte Variablen oder unbehandelte cases (enums), die oberen Meldungen sind Vergleiche signed<->unsigned.

E:\Arduino\sketchbook\libraries\MobaTools\src\MoToSoftled.cpp: In function 'void softledISR(uint8_t)':
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToSoftled.cpp:133:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;

                                                  ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToSoftled.cpp:138:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToSoftled.cpp:146:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToSoftled.cpp:154:50: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                             if ( ledDataP->aStep > LED_STEP_MAX ) ledDataP->aStep = LED_STEP_MAX;
                                                  ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp: In function 'void stepperISR(uint8_t)':
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:190:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                        if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                      ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:218:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                   ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:228:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     if ( stepperDataP->aCycRemain > (stepperDataP->stepsInRamp + RAMPOFFSET) ) {
                                                   ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:178:24: warning: enumeration value 'INACTIVE' not handled in switch [-Wswitch]
                 switch ( stepperDataP->rampState ) {
                        ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:178:24: warning: enumeration value 'RAMPSTART' not handled in switch [-Wswitch]
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:36:13: warning: unused variable 'i' [-Wunused-variable]
     uint8_t i, spiChanged, changedPins, bitNr;
             ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:37:14: warning: unused variable 'tmp' [-Wunused-variable]
     uint16_t tmp;
              ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp: In function 'void initSPI()':
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:330:10: warning: unused variable 'tmp' [-Wunused-variable]
     byte tmp;
          ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp: At global scope:
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:401:65: warning: unused parameter 'minStepTime' [-Wunused-parameter]
 void Stepper4::initialize ( int steps360, uint8_t mode, uint8_t minStepTime ) {
                                                                 ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp: In member function 'uint16_t Stepper4::setSpeedSteps(uint16_t, int16_t)':
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:642:14: warning: unused variable 'fullRampLen' [-Wunused-variable]
     uint16_t fullRampLen;
              ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp: In member function 'void Stepper4::rotate(int8_t)':
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:944:20: warning: enumeration value 'INACTIVE' not handled in switch [-Wswitch]
             switch ( _stepperData.rampState ) {
                    ^
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:944:20: warning: enumeration value 'RAMPSTART' not handled in switch [-Wswitch]
E:\Arduino\sketchbook\libraries\MobaTools\src\MoToStepper.cpp:944:20: warning: enumeration value 'SPEEDDECEL' not handled in switch [-Wswitch]

Habe die ganzen Leerzeilen raus genommen, sonst sind die Meldungen 'Original' :slight_smile:

MfG

PS: Wirst Du bereits getestet haben, aber mein Überlauf (bei 288-tausend) ist jetzt weg - zumindest bis 750-tausend 1.5 Millionen keine Beanstandungen :wink:

Mit der GitHub-Version gehen die Einzel-Grad ebenfalls in die gleiche Richtung.
Bei nur 40 HalbSteps pro Umdrehung zwar nicht sekündlich (wie sollte Das auch klappen), oder gleichmäßig, aber alle 2...3 Sekunden (bei diff=1000 und +=1) geht's 'einen Ruck' weiter.
Als Sekundenzeiger düften 366° besser aussehen :wink:

PPS: In der PDF schreibst Du, daß FULLSTEP Standard ist, in den Beispielen HALFSTEP (zumindest deutsche PDF)

Stepper4::Stepper4(int steps ) {
    // constuctor for stepper Class, initialize data
    Stepper4::initialize ( steps, HALFSTEP, 1 );
}

"Wird der Parameter weggelassen, wird FULLSTEP angenommen."
"If the parameter is omitted, FULLSTEP is assumed."

Da habe ich schon x-mal drübergelesen, aber es ist bislang nicht in mein Bewußtsein gewandert. Die meisten Informationen filtert unser Gehirn halt aus. Die Gehirne, die das nicht so konsequent machen, bescheren ihren Eigentümern "Kopfzerbrechen".

Hi

10:59:44.430 -> Ziel:7200 ist:0
10:59:48.944 -> Ziel:14400 ist:7200
...
12:01:45.576 -> Ziel:5364000 ist:5356800
12:01:50.591 -> Ziel:5371200 ist:5364000
12:01:55.560 -> .5343975.5322375.5300775.5279166.5257566.....
12:43:21.404 -> Ziel:5385600 ist:-5359005
12:43:26.420 -> Ziel:5392800 ist:-5351805

Bei 5 Millionen-batsch erneut ein Überlauf, noch weit entfernt von 31/32 Bit, selbst Mal 40 (Schritte/Umdrehung in meinem Fall) komme ich 'nur' auf ein gesetztes Bit 27.
Wobei diff 5000, Winkel +=7200, Geschwindigkeit 7200 (ohne Schrittverlust mit angebäpptem Magnet als Zeiger.

14:08:11.472 -> Ziel:5371200 ist:5364000
14:08:16.440 -> .5347584.5329593......
14:58:02.534 -> Ziel:5385600 ist:-5359005

Warum ich jetzt 50 statt 42 Minuten 'zurück' brauche, ... kA

MfG

Ja, das ist die Crux, wenn man kein float verwenden will, und nur Ganzzahlberechnungen nutzt .....

Da gibt's in der Tat bei der Umrechnung Winkel->Steps einen berechnungsinternen Überlauf.
Da werde ich bei großen Winkeln die Berechnungsreihenfolge ändern müssen. Das hatte ich an anderer Stelle auch schon, hier ist es mir durch die Lappen gegangen. Danke für's finden 8)