Go Down

Topic: MobaTools Library: Stepper mit Rampe - V1.1.3 freigegeben  (Read 1 time) previous topic - next topic

postmaster-ino

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
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

MicroBahner

also nicht hauen, wenn Das bereits mit gesperrten Interrupts verarbeitet wird.
Ok, ich lass den Knüppel im Sack  :smiley-mr-green: .
Nee, wenn da so grundsätzliche Fehler drin wären, würde es ständig rauchen.
Gruß, Franz-Peter

MicroBahner

#32
Aug 03, 2019, 05:55 pm Last Edit: Aug 03, 2019, 06:26 pm by MicroBahner
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  :D .
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 )
Gruß, Franz-Peter

agmue

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:

Code: [Select]
/*  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
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

MicroBahner

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.
Gruß, Franz-Peter

postmaster-ino

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.
Code: [Select]

/*  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:
Code: [Select]

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
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

MicroBahner

#36
Aug 04, 2019, 09:34 am Last Edit: Aug 04, 2019, 09:44 am by MicroBahner
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.

Gruß, Franz-Peter

agmue

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 :)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

#38
Aug 04, 2019, 10:38 am Last Edit: Aug 04, 2019, 11:17 am by postmaster-ino
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.
Code: [Select]

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' :)

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 ;)

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 ;)

PPS: In der PDF schreibst Du, daß FULLSTEP Standard ist, in den Beispielen HALFSTEP (zumindest deutsche PDF)
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

Code: [Select]
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".
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

#40
Aug 04, 2019, 12:46 pm Last Edit: Aug 04, 2019, 03:06 pm by postmaster-ino
Hi
Code: [Select]

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.
Code: [Select]

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
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

MicroBahner

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)
Gruß, Franz-Peter

MicroBahner

Da habe ich schon x-mal drübergelesen, aber es ist bislang nicht in mein Bewußtsein gewandert.
So ist es mit wohl auch immer gegangen...
PPS: In der PDF schreibst Du, daß FULLSTEP Standard ist, in den Beispielen HALFSTEP (zumindest deutsche PDF)
Aber wenigstens einer der aufpasst  8) , wird geändert.

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!
Wenn Du deinen Sketch ohne Änderungen nochmal kompiliert hättest, wären die Warnungen auch weg gewesen  ;) .



Gruß, Franz-Peter

postmaster-ino

Hi
...
Wenn Du deinen Sketch ohne Änderungen nochmal kompiliert hättest, wären die Warnungen auch weg gewesen  ;) .
Merke: Wenn zu viel ROT, dann halt ein 2.tes Mal kompilieren ;)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Tommy56

Damit ist aber nicht die Ursache beseitigt, sondern nur die Anzeige.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up