Maximale Geschwindigkeit für Stepper mit MobaTools

Hallo zusammen,

ich habe mir ein Gerät zum Ansteuern/Testen von Schrittmotoren bzw. der Mechanik gebaut. Soweit funktioniert das auch schon und der Stepper dreht sich.

Den Stepper steuere ich mit den MobaTools an. Da er sich nur drehen soll, benutze ich stepper.rotate() und stepper.setSpeed().

Nun habe ich aber festgestellt, daß stepper.setSpeed() keine Werte größer als +/- 1000 verarbeitet. Bei allem, was größer als 1000 ist, erhöht sich die Geschwindigkeit des Steppers nicht.

Die Geschwindigkeit gebe ich mittels eines Encoders vor und lasse mir den Wert für stepper.setSpeed() auf einem kleinen OLED-Display anzeigen. Der übergebene Wert wird zwar größer als 1000, aber der Stepper dreht sich nicht schneller.

In der Doku zu den MobaTools steht, daß man die Schrittrate erhöhen kann, wenn man das #define in der MobaTool.h ändert:

Unter Berücksichtigung der Gesamtbelastung kann die maximale Steprate für AVR und ESP8266 ( über #defines in MobaTools.h ) auch noch etwas ‚getuned‘ werden.

Allerdings scheint das nur für speedSteps zu wirken und nicht für setSpeed.

Kann ich die Schrittate/Geschwindigkeit des Schrittmotors mit den MobaTools irgendwie erhöhen, ohne daß ich den Steppertreiber von 1/16 Schritt auf 1/8 oder 1/4 Schritt umstellen muss?
(Nach Änderung in der MobaTools.h habe ich die IDE schon neu gestartet, aber das hat auch nicht geholfen)

Hier noch der aktuelle Code des Ganzen:


#define T1    2
#define T2    3
#define T3    4
#define T4    5
#define ENC_T 7
#define STEP  8
#define DIR   9
#define ENA   10
#define ENC_A 11
#define ENC_B 12



#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;

#include <MobaTools.h>
MoToStepper stepper1( 1600, STEPDIR );

#include <Bugtton.h>
const uint8_t buttonCount = 4;
const uint8_t buttonPins[buttonCount] = {T1, T2, T3, T4};
Bugtton buttons(buttonCount, buttonPins, 25);


#include <SimpleRotary.h>
SimpleRotary rotary(ENC_A, ENC_B, ENC_T);

byte i;
int speed = 0;          // Geschwindigkeit
bool ch_speed = true;   // Geschwindigkeit hat sich geändert
int dir = 0;            // Richtung 
int dir_old = 0;        // Richtung vor Änderung
bool halt = false;      // Stop


void setup() {

// ---- OLED ----
  Wire.begin();
  Wire.setClock(400000L);  
#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
  oled.setFont(Adafruit5x7);
    

// ---- Schrittmotor ----  
  stepper1.attach( STEP, DIR);
  stepper1.attachEnable( ENA, 10, LOW );  
  stepper1.setRampLen(75); // 
  stepper1.rotate(0);   
}

// stepper1.rotate(0)   -1 links,  0 halt,  1 rechts
// stepper1.setSpeed()  Geschwindigkeit in Impulsen pro Sekunde

// i = rotary.rotate()  0 = not turning, 1 = CW, 2 = CCW
// i = rotary.push()    0 = not pushed, 1 = pushed

//  oled.clear();
//  oled.println("");
//  oled.set2X();
//  oled.set1X();
//  oled.setRow(1);
//  oled.setCol(1);

// i = buttons.rose(nr);
// i = buttons.fell(nr);


// ----------------------------------------------------------------
void loop() {
  buttons.update();
  
  i = rotary.rotate();     // Encoder abfrage und Geschwindigkeit neu schreiben
  if (i == 1) {
    speed = speed - 10;
    ch_speed = true;
  }
  
  if (i == 2) {
    speed = speed + 10;
    ch_speed = true;
  }


  if (buttons.rose(2)) {   // Taste H - Start / Stop
    halt = !halt;
    ch_speed = true;
  }

  if  (buttons.rose(1)) {  // Taste A - Geschwindigkeit null
    speed = 0;
    halt = true;
    ch_speed = true; 
  }

  

  if (buttons. rose(3)) {  // Taste D - Richtung
    speed = speed * -1;
    ch_speed = true;
  }
  
  if (ch_speed) {          // Geschwindigkeit hat sich geändert
    ch_speed = false;
    
    speed = constrain (speed, -3000, 3000);
    oled.setCol (0);
    oled.setRow (0);
    oled.print(speed);
    oled.print(F("     "));
    oled.setCol(0);
    oled.setRow(2);
    if (halt) {
      oled.print("HALT ");
    }
    else {
      oled.print("RUN  ");
    }    
    if (speed == 0) dir = 0;
    if (speed > 0) dir = 1;
    if (speed < 0) dir = -1;
    if (dir != dir_old) {
      dir_old = dir;
    }    
    if (halt) {
      stepper1.rotate (0);
    }
    else {
      stepper1.rotate (dir);
    }
    stepper1.setSpeed (abs(speed));   
  }
    
}



  

Die maximale Schrittrate für AVR-Prozessoren ist 2500 Schritte/Sek. Das bedeutet bei setSpeedSteps einen Maximalwert von 25000 ( Schritte/10 Sek ).
Verwendet man setSpeed, wird die Geschwindigkeit des Steppers als Umdr/Min angegeben ( mit Faktor 10, um eine höhere Auflösung zu haben ). Letztendlich wird das aber intern auch nur auf die Schritte/Sek. umgerechnet, und hat damit letztendlich die gleiche Begrenzung wie bei setSpeedSteps.

Die MobaTools können bis zu 6 Stepper mit dieser Schrittrate gleichzeitig ansteuern. Hat man nur einen oder zwei, kann man in der Tat die Grenze durch ändern eines #define etwas nach oben schieben ( maximal 5000 Steps/Sek. bei AVR ). Dazu muss in der MobaTools.h der define CYCLETIME verändert werden:

#elif defined ARDUINO_ARCH_AVR ////////////////////////////////////////////////////////
//#define NO_TIMER3             // never use Timer 3
#define CYCLETIME       200     // Min. irq-periode in us ( default is 200 ), 

ändern in

#elif defined ARDUINO_ARCH_AVR ////////////////////////////////////////////////////////
//#define NO_TIMER3             // never use Timer 3
#define CYCLETIME       100     // Min. irq-periode in us ( default is 200 ), 
1 Like

Super.
Vielen Dank, das hat geklappt. Jetzt komme ich auf 1870 als Maximalwert. Das reicht mir fürs Testen meiner Mechanik aus.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.