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?
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
@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?
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.
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...
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).
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
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.
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.
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.
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
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!