mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schrittmotorbetrieb mit Raspi


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ein eigentlich schon millionenfach gelöstes Problem:
Ich möchte mit einem Raspberry einen Schrittmotor (performant) 
ansteuern.
Bisher nehme ich einen Adafruit Stepper-Hat. Dieser enthält einen 
PWM-IC, der mittels I²C die Ausgänge steuert. Das Problem ist, dass das 
ganze nicht echtzeitfähig ist, da auf Grund der Hardware das Timing auf 
dem Raspberry stattfinden muss. Das hat Schrittverluste zur Folge, 
zumindest wenn man den Schrittmotor nicht nur im Schneckentempo drehen 
möchte. Also dachte ich, schau ich mir nach etwas anderem.
Was ich gefunden hab, was hardwaremäßig an meine Vorstellungen noch am 
nächsten ran kommt, ist der Treiber "Grove - I2C Motor driver", der 
einen Atmega an Bord hat mit rausgeführter I²C-Schnittstelle. Problem 
hier: Der Raspi kann meines Wissens nach kein Clock-Stretching.

Meine Internetsuche hat zu vielen Treibern geführt, die ein 
Step/Direction-Interface haben, die Schritte also reingetaktet werden 
müssen. Per Mikrocontroller wäre das ja kein Problem, beim Raspberry ist 
wieder das Problem der fehlenden Echtzeitfähigkeit, wären wieder nur 
langsame Drehzahlen oder Schrittverlust möglich.

Lange Rede kurzer Sinn: Wie macht mans richtig? Gibt es da nichts 
fertiges, das bspw. per serieller Schnittstelle angesteuert wird, wo man 
Schritte, Rampen und Geschwidigkeiten einstellt und der 
Controller/Treiber kümmert sich um den Rest?

Autor: Sascha K. (kuschelganxta)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Arduino per USB und mit grbl

Autor: Mach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, Danke! Schau ich mir an.

Autor: Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trinamic hat da auch einiges, ist aber nicht so ganz billig. Für 
Kleinserien aber alle mal günstiger als eine eigene Entwicklung.

Um wieviele Achsen geht es denn überhaupt? Gibt es für den Raspi kein 
echtzeitfähiges OS, z.B. RT Linux?

Mit freundlichen Grüßen
Thorsten Ostermann

Autor: Framulestigo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht eine Marlin-fähiges Board (3D-Drucker) finden und per G-Code 
die Datensätze übertragen?

Autor: Mach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thorsten
Es geht um eine Achse für eine kleine Stanze. Daneben kommen noch zwei 
Modellbauservos zum Einsatz. Es handelt sich um ein Hobbyprojekt.

Die Trinamicmotoren habe ich mir angeschaut, schein da gibt es wirklich 
was passendes, bspw. Steuerung über die serielle Schnittstelle. Ist 
schon etwas teurer, könnte aber trotzdem interessant sein. Das kommt 
dann aber drauf an, wie einfach die Ansteuerung ist, das muss ich mir 
noch genauer anschauen.

RTOS...keine Ahnung.

@Framulestigo
Das geht ja dann wieder in die grbl-Richtung? Ist die G-Code-Übertragung 
abgesichert, z.B. per CRC?

Autor: Framulestigo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach schrieb:
> @Framulestigo
> Das geht ja dann wieder in die grbl-Richtung? Ist die G-Code-Übertragung
> abgesichert, z.B. per CRC?

Das ist mal ne gute Frage, die ich Dir auch nicht aus dem Stehgreif 
beantworten kann. Eigentlich müsste man dazu mal in die Quellen des 
Marlin schauen (die bekommt man üblicherweise für ein Board als 
Arduino-Projekt zum selberbrennen). Andererseits: Wenn's bei mio. von 
3D-Druckern funzt, warum solls dann bei Dir Schwierigkeiten machen?

Wenn es Deinen Ansprüchen nicht genügt, kannst Du es sicher auf einem 
fertigen Board auch selber komplett neu programmieren.

Einzige Einschränkung für Deine Anwendung, die mir einfällt: Die 
Schrimotreibermodule werden üblicherweise auf Buchsenleisten auf solche 
Boards aufgesteckt. Die gibt es sicher nicht in allen Leistungsklassen.

Autor: Mach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach weiterem rumsuchen hab ich mich jetzt dazu entschieden ein eigenes 
Layout zu machen. Das erspart mir dann auch den Kabelverhau.

Um die Sache zu vereinfachen, nutze ich so ein DRV8825-Treibermodul, von 
der Leistung her sollte das reichen.

Mal sehen obs auf Anhieb klappt, hab lange keine Platine mehr gemacht...

Autor: Willi S. (ws1955)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ursprünglich war ein Treiber ohne Echtzeitproblem gefragt und da würde 
ich den L6470 vorschlagen, vor allem die leistungsfähige Bauform 
L6470PD.

Kommunikation per SPI, u.a. auch ganze Fahrkurven (siehe Bild).

Autor: Mach (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Der L6470 sieht gut aus! Die Funktionalität ist wie ich mir es vorstell.

Autor: Mach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, bin einen Schritt weiter. Platinen machen lassen und erste Tests 
gefahren. Tückisch: Die SPI-Kommunikation funktioniert nur, wenn der 
L6470 auch an die Motorversorgung angeschlossen ist. "Logic Supply" 
alleine reicht nicht.

Der Schrittmotor, ein Trinamic SH4218-51-10-04 (der größte im unten 
verlinkten Datenblatt), läuft.
Aber mit der Performance bin ich überhaupt nicht zufrieden. Bei einer 
Versorgungsspannung von 24V komme ich gerade auf etwa 8 U/sek 
(=1600Imp/sek) bevor der Motor zu rattern anfängt und stehen bleibt, 
ohne Last wohlgemerkt, im Vollschrittbetrieb. Laut Datenblatt soll er im 
Halbschrittbetrieb bei 24V auf 10000Imp/sek kommen, also auf 3000U/min 
(Abbildung 4.3).

Erst dachte ich, es liegt an schlecht eingestellten Parametern im L6470. 
Nach einigem Rumprobieren und nach zur Hilfenahme des 
ST-Berechnungstools für die Parameter scheint mir aber mittlerweile, 
dass bei der Spannung von 24V durch die Induktion einfach nicht mehr 
Drehzahl geht.

Die generatorische Spannung habe ich mittels Multimeter und 
Akkuschrauber aufgenommen (siehe Bild). Bei 600U/min (= 10U/sek) ergeben 
sich etwa 15V gemessen an einer Spule. Das Multimeter ist auf 
Wechselstrom eingestellt. Oszi hab ich leider keines.

=> Kann man daraus Rückschlüsse ziehen, welche Drehzahl bei 24V 
erreichbar sein sollten? Ob die mageren 8U/sek, die ich erreiche, 
realistisch sind?

Zum Berechnungstool:
Die Bestimmung des Ke-Werts ist mir nicht ganz klar. 0,038V/Hz sind der 
Vorgabewert. Im Motordatenblatt war nichts zu finden. Allerdings ist die 
Berechnung eines Wertes U_Bemf angegeben, ich komme damit auf 
0,245V/(rad/sek). Für rad eingesetzt 2Pi ergibt das 0,039V/(1/sek), 
also 0,039Hz.
Das Berechnungstool gibt für diesen Wert bei 2000Imp/sek einen Strom von 
0,014A an, also nahe Null.

=> Sind diese Werte plausibel?
=> Wie kommen die im Schrittmotordatenblatt dann auf 10000U/min bei 24V 
(Abbildung 4.3)


Datenblatt Schrittmotor:
https://cdn-reichelt.de/documents/datenblatt/C300/QSH4218_manual.pdf

Autor: Mach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand ein Kommentar?

Autor: Timo N. (tnn85)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Ke ist ja die Motorkonstante, mir der sich aus der Spannung die 
Drehzahl berechnen lässt bzw. aus dem Strom das Drehmoment.
Im Grunde sollte das bei 0Nm Belastung also der Spannungswert der 
Back-EMF (also U_Bemf) genau diesem Wert entsprechen.

In deiner Rechnung hast du glaube ich einen Rechenfehler gemacht:
Du musst glaube ich bei der Umrechnung von [V/(rad/sek)] auf [V/(1/sek)] 
mit 2*Pi multiplizieren und nicht dividieren. Das wären dann
bei 0,245V/(rad/sek) richtigerweise 1,539V/(1/sek).

Wenn du den Wert dann mal 10 nimmst (also 10 U/Sekunde), kommst du ca 
auf die 15V, die du mit deinem Akkuschrauberversuch auch herausbekommen 
hast. Insofern sollte das ja schon stimmen.

Im Grunde hast du von den 15V bis zu den 24V noch etwas Puffer, auch 
wenn etwas im R_DSon vom Treiber hängen bleibt.

Ach ja: Das mit dem Wert aus Abbildung 4.3 aus dem Datenblatt bezieht 
sich ja auf den Halbschritt-Betrieb. Also nicht 3000U/min, sondern 
1500U/min, was aber trotzdem dann 25Hz mechanischer Drehzahl entsprechen 
sollte. Da bist du dann aber laut Abbildung auch nur noch bei ca. 0,06 
Nm, was mit dem oben ausgerechneten Ke-Wert [0,245V/(rad/sek)] = [0,245 
N/A)] dann einem Strom von einer Spule (also durch 2 teilen) von 0,122A 
entspricht.

Miss doch mal den Spulenstrom mit deinem Multimeter bei der 
Maximaldrehzahl, bei der der Motor noch nicht stockt. Allerdings nur, 
wenn dein Multimeter True-RMS messen kann.

Kann sein, dass ich da auch den ein oder anderen Denkfehler gemacht 
habe. Vielleicht hilft dir mein Beitrag aber trotzdem weiter.

Autor: rµ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach schrieb:
> Wie kommen die im Schrittmotordatenblatt dann auf 10000U/min bei 24V
> (Abbildung 4.3)

Möglicherweise meinen die 10000 Halbschritte? Das wären dann 1500U/min, 
noch immer viel für einen Schrittmotor. Für 3000U/min nimmt man was 
anderes.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach schrieb:
> Aber mit der Performance bin ich überhaupt nicht zufrieden. Bei einer
> Versorgungsspannung von 24V komme ich gerade auf etwa 8 U/sek
> (=1600Imp/sek) bevor der Motor zu rattern anfängt und stehen bleibt,
> ohne Last wohlgemerkt, im Vollschrittbetrieb.

Vielleicht ist das dein Problem. Vollschrittbetrieb regt viele 
Schwingungen an, die ohne Last schlecht weggedämft werden. Schwingungen 
bedeuten Lastspitzen, die dann zum Ausrasten führen.

Autor: Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Datenblatt ist "pps" als Einheit angegeben, dass sind "pulses per 
second" und meint mit Sicherheit Halbschritte. Oberhalb vom Knick in der 
Kennlinie bei 4.000 pps (entspr. 10 U/s) bringt der Motor nichts mehr. 
Die Drehzahlen darüber erreicht man nur mit sehr gemächlichen 
Beschleunigungen. Früher hat man die Kennlinien mit logaritmischer 
Frequenzachse gezeichnet, da konnte man das sehr viel besser erkennen.

Mit freundlichen Grüßen
Thorsten Ostermann

Autor: Mach (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe! Es klappt jetzt:-)

Der entscheidende Hinweis kam von Wolfgang, dass die fehlende Last das 
Problem ist. Ich hatte das zwar schon wo gelesen, und auch per 
Zusammendrücken einer Wäscheklammer eine Last simuliert (quasi Ohm'sch), 
hat aber nichts geholfen. Gegen die Vibration hilft wohl nur eine 
Trägheit, also Schwungmasse. Im Anhang der Testaufbau, zum Zeitpunkt der 
Aufnahme läuft er mit 1000u/min.
Ich bin bis 2000u/min im Halbschrittbetrieb hoch, dann wurde mir die 
Sache "zu heiß", da der Motor ja nirgends befestigt ist.

@Timo N.:
Mit den 2Pi hast du wohl recht.
1Hz = 2Pi/sek im Bogenmaß also 1Hz = 2Pi*rad/sek
-> rad/sek = Hz/2Pi

@Timo, rµ, Thorsten:
Das mit den Halbschritten stimmt wohl. Ich glaub aber jetzt fast, dass 
man wirklich auf 3000u/min kommt, gibt dann halt überhaupt kein 
Drehmoment mehr.

@Thorsten:
Die gemächliche Beschleunigung hatte ich bereits. Das ist mit dem L6470 
auch sehr komfortabel einzustellen.


Danke noch mal an alle fürs Mitdenken!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.