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
Vielleicht eine Marlin-fähiges Board (3D-Drucker) finden und per G-Code die Datensätze übertragen?
@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!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.