Schrittmotor Prüfstand, Arduiono Uno, SainSmart L293D Motor Drive Shield

Hallo Zusammen,

als Studienarbeit baue ich einen Schrittmotorprüfstand, er enthält einen Schrittmotor und einen Encoder.

Der Schrittmotor soll den Drehgeber antreiben und diese Werte, sollen nun mit den Vorgegebenen Schritten überprüft werden.

Es handelt sich dabei um:
-eine Arduino Uno

Nun meine Frage kann ich mit dem motorshield auch Digitale Inputs vom Geber lesen oder muss ich die direkt wieder in die Arduinoplatine einstecken? Den Schrittmotor würde ich gerne an M1 und M2 anklemmen und den Encoder an M3 und M4.
da der Encoder eine A- und B-Spur und eine N-Spur besitzt dachte ich, ich könnte ihn wie ein Schrittmotor behandeln nur eben als Input.

Ich habe mich mal in die Libary eingelesen und gesehen, dass ich Outputs auch als Inputs deklarieren kann.
Allerdings traue ich mich nicht so recht die Libary einfach um zu schreiben.

Bitte helft mir...

Gruß Marcel

Hallo,

mit dem Schrittmotor-Treiber kannst Du den Schrittmotor eine bestimmte Anzahl von Schritten im oder gegen den Uhrzeigersinn ausführen lassen. Du kannst damit nicht den Encoder abfragen.

Um den Encoder abzufragen benötigst Du zumindest eine eigenständige Programmlogik - der Encoder den Du angibst scheint TTL-kompatibel zu sein. Da ich mit einem solchen Encoder keinerlei praktische Erfahrung habe, kann ich leider keine nähere Angabe dazu machen, wie er anzuschließen ist. Es könnte aber möglich sein, dass er direkt an den Arduino angeschlossen werden kann. Vielleicht schreibt Dir ja noch jemand was, der diesen speziellen Encoder kennt.

Gruß,
Ralf

  1. mit dem L293D kannst Du keinen der auf dem Datenblatt angegebenen Motoren bei Nennspannung betreiben. Der L293D kann max 600mA Strom treiben. Die Motoren haben alle entweden 0,67 oder 0,95 A Nennstrom
  2. die Drehmomentdiagramme sind alle mit einem Stromtreiben mit 24V Versorgungsspannung spezifiziert. Die Motoren werden bei viel geringeren Stepzahlen stehen bleiben.

Für einen Prüfstand braucht es auch eine regelbare Last.

Grüße Uwe

vielen Dank für Eure Antworten.

Ich habe den Encoder auf Pin 5 und 6 auf den Uno direkt gesteckt wie in dem folgenden Link.
Alles exakt gleich.

Schiebe ich das Programm rüber so beginnt er sofort aufwärts zu zählen, ohne ein bisschen zu drehen.
Ich kann es nicht verstehen.
dreh ich ihn in die andere Richtung, verringert sich der Wert nur minimal, lass ich los zählt er wieder weiter nach oben.

Was ist da los?

Gruß marcel

Weil die ganzen Libarys nicht für stark prellende Drehencoder ausgelegt sind, und das sind idR alle Encoder < 100€
http://www.mikrocontroller.net/articles/Drehgeber, dort dann unter
Dekoder für Drehgeber mit wackeligen Rastpunkten nachschauen.

Ansonsten Sketch hier veröffentlichen und ein Bild der Schaltung.

Probier mal den Code hier:

Das hat sich glaube am besten bewährt.

Dazu zwei 10k Pulldown Widerstände an die Pins hängen.

Und für Pins 5 und 6 oben den Code anpassen auf das (dass da auch 5 und 6 im Code steht ist Zufall!):

#define PHASE_A		(PIND & 1<<5)
#define PHASE_B		(PIND & 1<<6)

Alternativ was du besser verstehst, aber langsamer ist:

#define PHASE_A		digitalRead(5)
#define PHASE_B		digitalRead(6)

Allgemein ist hier das Pin Mapping:
http://cdn3.raywenderlich.com/wp-content/uploads/2013/06/atmegaPinMap.jpg

Und statt int main(void) das hier:

void setup()
{
    encoderInit();
    sei();
}

void loop()
{
   static long value;	
   value += encoderRead();
}

danke für Deine schnelle Antwort und

danke für deinen Link, allerdings habe ist noch nicht so recht verstanden.
wie ich das umsetzten soll.

Der Encoder ist von Wachendorf und hat 180€ gekostet.

Teilweise funktioniert es und teilweise nicht, das deutet sehr stark auf das Prellen, wie Du es beschrieben hast.

Vielen Dank :smiley:
ich probiers gleich mal aus

War noch ein Fehler drin. Bei der digitalRead() Version müssen die Strichpunkte hinten weg. Das wäre wieder so ein dummer Fehler a la "while(bedingung);" geworden.

Der Code ist ein reinem AVR C geschrieben ohne die Arduino IDE. Das lässt sich aber leicht portieren. Direkter Port-Zugriff geht genauso und main() schreibt man halt auf setup() und loop() um.

Ansonsten haben halt die Datentypen andere Namen:
int8_t = char

Hallo,

den Code, welchen Du mir geschickt hast, setzte ich in den Programmcode ein oder?
Leider habe ich die Funktion noch nicht ganz verstanden.

Gruß
Marcel