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