Schrittmotor ohne Libary ansteuern

Hallo,

Wie der Titel schon sagt muss ich für ein Schulprojekt eine Schrittmotoransteuerung für den TB6600(EasyDriver) entwerfen, darf jedoch nicht auf Stepper Libarys zurückgreifen. Das ich zur Pulserzeugung mit Interrupts arbeiten muss weiß ich bereits. Hier mal mein Code.

#include "TimerOne.h"
int pin = 3;
bool status = LOW;


void setup()   {
  pinMode(pin, OUTPUT);
  Timer1.initialize(400);
  Timer1.attachInterrupt(Step);
  //Serial.begin(115200);
}



void Step() {

  if (status)
  {
    digitalWrite(pin, HIGH);
    status = LOW;
  }
  else
  {
    digitalWrite(pin, LOW);
    status = HIGH;
  }
}


void loop()    {

}

Das Problem bei diesem Code ist das Puls-Pausen-Verhältniss ist gleich. Also bräuchte ich eine Möglichkeit die mir einen 10µs Puls generiert und nicht auf die Funktion Delay(); zurückzugreift.

Danke für eure Hilfe.
lg Nico

Wie schon die Einleitung sagt, ist es ein Schulprojekt. Soll heißen, irgendwo wirst du dich da auch in den Unterlagen einarbeiten müssen.

Mit der Timer1 Libary habe ich mich zu Arduino Zeiten nie auseinandergesetz.
Aber du kannst für das ganze auch mal mit micros() versuchen.

Ansonsten bleibt dir auch noch die Möglichkeit, das ganze ohne eine Libary zu erstellen.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR

geforce1994:
... TB6600(EasyDriver) entwerfen, darf jedoch nicht auf Stepper Libarys zurückgreifen.

EasyDriver und Stepper-Bibliothek passen nicht zusammen. Daher ein richtiger und notwendiger Ansatz.

geforce1994:
Das ich zur Pulserzeugung mit Interrupts arbeiten muss weiß ich bereits. Hier mal mein Code.

Das kannst Du, mußt Du aber nicht. Ich würde es mit micros() versuchen.

geforce1994:
Das Problem bei diesem Code ist das Puls-Pausen-Verhältniss ist gleich. Also bräuchte ich eine Möglichkeit die mir einen 10µs Puls generiert und nicht auf die Funktion Delay(); zurückzugreift.

Ich habe mir ein kleines Testprogramm geschrieben, das den Motor erst in die eine, dann in die andere Richtung dreht. Es ist blockierend und damit schlechter Stil, also viele Möglichkeiten für Verbesserungen für Dich!

const int schritte = 200;
const int verzoegerung = 10;

void setup() {
  Serial.begin(9600);
  pinMode (13, OUTPUT);
  pinMode (8, OUTPUT);  // STEP
  pinMode (9, OUTPUT);  // DIR
}

void loop() {
  Serial.println("clockwise");
  digitalWrite(13, HIGH);
  digitalWrite(9, HIGH);
  for (byte j = 0; j < schritte; j++) {
    digitalWrite(8, !digitalRead(8));
    delay(verzoegerung);
  }
  delay(500);

  Serial.println("counterclockwise");
  digitalWrite(13, LOW);
  digitalWrite(9, LOW);
  for (byte j = 0; j < schritte; j++) {
    digitalWrite(8, !digitalRead(8));
    delay(verzoegerung);
  }
  delay(500);
}

Lesestoff: Anleitung Ein Endlicher Automat entsteht mit interessanten Links am Ende.

Der Easydriver von Schmelzhaus hat keinen TB6600 drauf sondern einen A4988. Habe ich mich da im Modell verfehlt?

Der TB6600 und der A4988 haben beide als Eingabe 2 Pin: Richtung und Schritte. und dazu noch ander Einstellungen. Die sind aber meist fest gewählt und müssen nicht während des Betriebs verändert werden.

Wie schnell muß sich der Motor drehen?
Mußt Du als Vorgabe den Timer verwenden?
Welche Microschritte Hast Du gewählt?

Grüße Uwe

agmue:
EasyDriver und Stepper-Bibliothek passen nicht zusammen. Daher ein richtiger und notwendiger Ansatz.Das kannst Du, mußt Du aber nicht. Ich würde es mit micros() versuchen. Ich habe mir ein kleines Testprogramm geschrieben, das den Motor erst in die eine, dann in die andere Richtung dreht. Es ist blockierend und damit schlechter Stil, also viele Möglichkeiten für Verbesserungen für Dich!

const int schritte = 200;

const int verzoegerung = 10;

void setup() {
 Serial.begin(9600);
 pinMode (13, OUTPUT);
 pinMode (8, OUTPUT);  // STEP
 pinMode (9, OUTPUT);  // DIR
}

void loop() {
 Serial.println("clockwise");
 digitalWrite(13, HIGH);
 digitalWrite(9, HIGH);
 for (byte j = 0; j < schritte; j++) {
   digitalWrite(8, !digitalRead(8));
   delay(verzoegerung);
 }
 delay(500);

Serial.println("counterclockwise");
 digitalWrite(13, LOW);
 digitalWrite(9, LOW);
 for (byte j = 0; j < schritte; j++) {
   digitalWrite(8, !digitalRead(8));
   delay(verzoegerung);
 }
 delay(500);
}

Leider erzielt dein Programm bei mir keine Funktion. Außerdem habe ich wenn ich dein Code richtig verstehe ein gleiches Puls-Pausenverhältniss das ja nicht gewünscht ist.

lg Nico

geforce1994:
Leider erzielt dein Programm bei mir keine Funktion.

Ich habe das Programm zum Testen vom A4988 und DRV8825 Treiber erfolgreich eingesetzt. Bei tb6600 gibt es einen Enable-Eingang, der möglicherweise noch beschaltet werden muß. Alle Eingänge scheinen Optokoppler zu sein.

geforce1994:
Außerdem habe ich wenn ich dein Code richtig verstehe ein gleiches Puls-Pausenverhältniss das ja nicht gewünscht ist.

Gibt es dafür eine technische Notwendigkeit, oder hat sich das Dein Lehrer ausgedacht, um es etwas interessanter zu machen? Das ist aber nicht schwierig zu realisieren, die Lösung findest Du, wenn Du meinem Link von #2 folgst.

Zunächst sollte sich aber der Motor mit dem Testprogramm bewegen.

agmue:
Zunächst sollte sich aber der Motor mit dem Testprogramm bewegen.

Nein tut es leider nicht. Und die Beschaltung des Enable Pins zur Leistungsfreigabe ist auch getan.

lg Nico

Und nun?

Leider haben nur ausgewählte Mitglieder des Forums eine Kristallkugel, um sehen zu können, was sich auf Deinem Schreibtisch so tut. Für Deine Arbeit hast Du natürlich einen Schaltplan gezeichnet -> her damit. Dann hast Du den Projektfortschritt mit scharfen, hochauflösenden Fotos dokumentiert -> her damit.

habe den Fehler gefunden dein Programm mag wohl irgendwie den Pin 3 am Mega nicht. Habe es auf Pin 6 geändert und nun funktioniert es.

Herzlichen Glückwunsch! :slight_smile:

Nun kannst Du Dich der eigentlichen Aufgabe widmen.

geforce1994:
habe den Fehler gefunden dein Programm mag wohl irgendwie den Pin 3 am Mega nicht. Habe es auf Pin 6 geändert und nun funktioniert es.

Das hört sich aber eher danach an, dass du am Mega bereits einige Teile gehimmelt hast.