[gelöst] Schrittmotor S-SPSM-5V richtig ansteuern

Auf der Suche nach einer Ansteuerung für meinen Schrittmotor DAYPOWER S-SPSM-5V bin ich über eine Beschreibung gestolpert, wie es auch ohne Bibliothek geht. Kern ist diese Tabelle:

//Ansteuerung der Spulen des Schrittmotors DAYPOWER S-SPSM-5V von Pollin.de
$step[1]="1,0,0,0";
$step[2]="1,1,0,0";
$step[3]="0,1,0,0";
$step[4]="0,1,1,0";
$step[5]="0,0,1,0";
$step[6]="0,0,1,1";
$step[7]="0,0,0,1";
$step[8]="1,0,0,1";

Nach Umwandlung in einen Test-Sketch für den UNO läuft der Motor mit einem leisen Surren in die eine oder andere Richtung.

const byte pinFreigabe = 2;  // LOW=dreht; HIGH=stopp
const byte pinRichtung = 3;  // LOW=links; HIGH=rechts
const byte pinStart = 4;  // LOW-HIGH-Flanke=Start
bool altStart;
bool aktStart;
int schrittZaehler;
const byte pinMotor[] = {8, 9, 10, 11};  // IN1, IN2, IN3, IN4 des Boards
const byte schrittfolge[] = {B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001};
byte schritt = 0;
byte richtung = 0;
byte bitfolge = 0;
unsigned long aktMicros;
unsigned long prevMicros;
const unsigned long intervall = 1000;

void setup() {
  for (byte i = 0; i < sizeof(pinMotor); i++) {
    pinMode(pinMotor[i], OUTPUT);
  }
  pinMode(pinFreigabe, INPUT_PULLUP);
  pinMode(pinRichtung, INPUT_PULLUP);
  pinMode(pinStart, INPUT_PULLUP);
}

void loop() {
  aktMicros = micros();
  altStart = aktStart;
  aktStart = digitalRead(pinStart);
  if (altStart && !aktStart) {
    schrittZaehler = 64 * 8 * 8;  // 4096 ist etwas viel, oder?
  }
  if (digitalRead(pinFreigabe) == LOW && schrittZaehler > 0) {
    if (aktMicros - prevMicros >=  intervall) {
      prevMicros = aktMicros;
      bitfolge = schrittfolge[schritt];
      for (byte j = 0; j < sizeof(pinMotor); j++) {
        digitalWrite(pinMotor[j], (bitfolge >> j) & 1);
      }
      schrittZaehler--;
      if (digitalRead(pinRichtung) == LOW) {
        schritt++;
      } else {
        schritt--;
      }
      if (schritt < 0) {
        schritt = sizeof(schrittfolge);
      } else {
        schritt = schritt % sizeof(schrittfolge);
      }
    }
  } else {
    for (byte i = 0; i < sizeof(pinMotor); i++) {
      digitalWrite(pinMotor[i], LOW);
    }
    schrittZaehler = 0;
  }
}

Die Aufgabe eines Schrittmotors ist ja die Positionierung, also versuche ich eine 360° Drehung.

„Schrittwinkel: 5,625° (64 Schritte/Umdrehung)“, tatsächlich bin ich jetzt aber bei 4096 Schritten für eine Umdrehung! ::slight_smile:

Ich freue mich über Hinweise für den richtigen Dreh! :slight_smile:

Hallo,

ich denke, Du steuerst den falsch an. Übertrieben macht der 2 Schritte vor und einen zurück.
Guck Dir mal im Netz den Ablauf von unipolaren Schrittmotoren an.
Und dann mußte dir natürlich sicher sein die Spulen richtig erwischt zu haben, sonst ist alles durcheinander.

Bsp. Pkt. 5.4.1
http://www.deltron.ch/pdf/produkte/antriebstechnik/dokumente/Schrittmotor_kurz_erklaert_d.PDF

Interessante und mal vollständige Dokumentation, Danke schon mal dafür!

Ich habe demnach einen unipolaren Motor, den ich bisher im Halbschrittbetrieb angesteuert habe. Ich ändere in Vollschrittbetrieb.
Folgende Änderungen entsprechend "5.4.1 SCHRITTSEQUENZEN, Full Step Operation, One Phase On, Unipolar"

const byte schrittfolge[] = {B1000, B0100, B0010, B0001};

const unsigned long intervall = 4000;

schrittZaehler = 64 * 8 * 4;

Wenn ich die Schrittfolgen wegen möglicherweise falschem Anschluß tausche, läuft der Motor nicht mehr. Eine halbierte Schrittzahl von 2048 ist relativ betrachtet plausibel, aber auch noch recht weit von 64 entfernt.

N`Abend,

der Motor hat ein Getriebe, Übersetzung 64:1. Daher die 4096 Steps/Umdrehung.

Grüße
Schattenfänger

Das ist plausibel! Da ich den Motor im Stillstand nicht bewegen kann und die Achse außermittig plaziert ist, bestätigt das das Getriebe. Da ich was langsam Drehendes suche, paßt es für mich, aber schlechte Beschreibung bei Pollin.

Danke! :slight_smile:

Wenn jemand den Sketch nutzen möchte:

const byte schrittfolge[] = {B0001, B0010, B0100, B1000};  // Vollschritt eine Phase
// const byte schrittfolge[] = {B1001, B1010, B0110, B0101};  // Vollschritt zwei Phasen
// const byte schrittfolge[] = {B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001};  // Halbschritt

EDIT: Wer lesen kann, ist echt im Vorteil und wer dann auch noch den richtigen Text findet erst recht. Verborgen im Datenblatt des Motors bin ich nun fündig geworden:

Betriebsspannung: 5 V
Phasen: 4
Übersetzung: 1/64
Schrittwinkel: 5.625° (64 Schritte/Umdrehung)
Frequenz: 100 Hz
Gleichstromwiderstand : 50 Ohm ± 7% (25 °C)
Drehmoment: > 34.3 mN*m (120 Hz)
Geräuschpegel: < 35dB (120 Hz)

Ich habe mich inzwischen an Max Pollin gewandt mit der Bitte, den Artikeltext um "Getriebeübersetzung: 1/64" zu ergänzen.

Hallo,

die Getriebeuntersetzung hatte ich leider auch nicht für voll genommen.
Läuft der Motor wenigstens ruhiger mit richtiger Ansteuerung der Spulen?

Doc_Arduino:
Läuft der Motor wenigstens ruhiger mit richtiger Ansteuerung der Spulen?

Zur Zeit benutze ich die Halbschrittvariante mit 1 Millisekunde Verzögerung ja Schritt und höre ein leises Summen, das leiser ist als das meines Scanners im Drucker. Ich vermute mal, besser geht es nicht mit digitalen Signalen und dieser Hardware.

Hallo,
warum nimmst du nicht einfach diese Library:

läuft super, gerade selbst in Betrieb genommen.

Gruß
Michael

Hallo Michael,
weil ich sie nicht kannte! Ich werde sie ausprobieren und mit meiner bisherigen Lösung vergleichen. Mal sehen, ob ich damit auch eine Beschleunigungs- uind Verzögerungsrampe für meinen Kran hinbekomme.

Danke für den Hinweis! :slight_smile: