Hallo zusammen Ich habe hier einen Schrittmotor treiber mit einem A4988 drauf. Dieser möchte STEP und DIR als input. Da ich mit dem Schrittmotor eine Beschleunigungsrampe fahren möchte, dachte ich mir, es wäre wohl das eleganteste wenn ich den PWM Output zur erzeugung der signale verwende. Dazu folgende Idee: PWM Signal soll in etwa so aussehen: -----------------------T---------------- |----|__________________________________ --P--- T ist die Periodenlänge welche angepasst wird. P ist die Pulslänge, welche immer gleich bleibt. Meine Idee war nun, dass ich T kontinuierlich verringere, bis ich die gwünschte End-Geschwindigkeit erreicht habe. Ebenfalls wird T kontinuierlich erhöhe, bis der Motor wieder steht. Macht dies Sinn, diese Signale mit einem HW-PWM zu erzeugen? Ich müsste dann wohl bei jedem Overflow einen Interrupt generieren, damit ich weiss, wie viele Steps bereits vergangen sind. Was meint ihr?
:
Bearbeitet durch User
Hi, meinst du die HW-PWM eines µC? Das könnte Sinnvoll sein. Die Frage ist aber wie immer, was du denn genau machen möchtest? Ist die Anzahl der Umdrehungen bzw der zurückgelegten Schritte wichtig? Typischerweise ist bei einer PWM die Periodenlänge T konstant und die Pulslänge P variiert. Wenn dagegen P bei dir konstant ist, wird der Motor immer gelegentlich einen Schritt machen, solange T nicht unendlich groß wird. Besser erscheint mir T = konstant und P = {0, 1, ..., T}. Grüße Bernd
Hallo Bernd Ja es handelt sich um den HW-PWM einer Mikrocontrollers. Welcher Controller ist vorerst irrelevant. Ich möchte mit meiner Mechanik z.B. 150mm verfahren. für 1mm benötige ich in diesem Beispiel 60 Pulse am STEP input meines Treibers. Somit also insgesamt 150*60 Pulse = 9000 Pulse Diese müssen exakt eingehalten werden. Nun kommt noch dazu, dass ich in einer Definierten Zeit, eine gewisse Distanz zurücklegen muss. in diesem Beispiel 50mm/Sekunde Nun kann der Schrittmotor und vorallem die Träge Mechanik nicht einfach so von 0% auf 100% Geschwindigkeit. Deshalb möchte ich zu beginn und zum Ende eine Beschleunigungsrampe fahren. Diese soll in diesem Beispiel 25mm/s2 betragen. Das bedeutet pro sekunde 25mm/s mehr Nach einer Sekunde ist man bei 25mm/s angelangt und nach einer weiteren bei 50mm/s somit wäre man in diesem Beispiel in 2Sekunden auf ZielGeschwindigkeit. Ich muss T variieren, das eine veränderung von P keinen Effekt hat. Es geht um die Anzahl Pulse pro Zeit also T/Zeit und nicht das DutyCycle.
:
Bearbeitet durch User
Holger K. schrieb: > PWM Signal soll in etwa so aussehen: > > -----------------------T---------------- > |----|__________________________________ > --P--- > > T ist die Periodenlänge welche angepasst wird. > P ist die Pulslänge, welche immer gleich bleibt. > > Meine Idee war nun, dass ich T kontinuierlich verringere, bis ich die > gwünschte End-Geschwindigkeit erreicht habe. Das ist kein PWM, dabei wird die Breite von P verändert und T bleibt gleich. Das ist PFM. Kannst du direkt als STEP Signal verwenden. Ob Hardwareunterstützt oder nicht: Die Erzeugung ist eher aufwändig, du musst bei Hardware-PWM ständig umprogrammieren. Einfacher wäre es, einen Grundtakt in Höhe des - zu haben, also der Auflösung der möglichen Pulsbreiten, und die realen Pulslängen rein in Software aus Variablen abzuleiten. Tempo sollte kein Problem sein, so schnell sind Schritte eines Schrittmotors nicht.
Wenn der MC welcher den A4988 ansteuert noch viele andere Dinge zu erledigen hat, würde ich die Ansteuerung auf einen ATMega328 auslagern und auf den GRBL aufspielen. Das macht die ganzen Rampengeschichten und das Verfahren ganz alleine. Du musst nur noch den passenden G-Code Befehl von deinem Master MC seriell an den ATMega328 schicken. Wenn es nur fürs Basteln ist: Das ist schneller und billiger als tagelang über Rampen-Arithmetik nachzudenken. Aber das ist wahrscheinlich in den Wind gesprochen :) https://github.com/grbl/grbl/wiki
Bastler schrieb: > Wenn der MC welcher den A4988 ansteuert noch viele andere Dinge zu > erledigen hat, würde ich die Ansteuerung auf einen ATMega328 auslagern > und auf den GRBL aufspielen. Das macht die ganzen Rampengeschichten und > das Verfahren ganz alleine. Du musst nur noch den passenden G-Code > Befehl von deinem Master MC seriell an den ATMega328 schicken. > Wenn es nur fürs Basteln ist: Das ist schneller und billiger als > tagelang über Rampen-Arithmetik nachzudenken. Aber das ist > wahrscheinlich in den Wind gesprochen :) > > https://github.com/grbl/grbl/wiki Danke für deinen Hinweis. Nein das ist nicht in den Wind gesprochen. Hatte zuvor bereits die Idee mit GRBL. Leider aber müsste ich ein paar Änderungen an GRBL vornehmen, damit dieses meinen Wünschen entspricht. Der Motor uC sollte neben dem steuern der Motoren auch noch ein paar in und outputs ansprechen sowie Endschalter. GRBL erschien mir hier sehr unflexibel. Zudem bräuchte ich nur zwei achsen und GRBL hat auch noch FIX Dinge wie Coolant und Spindle integriert. Ich habe mir überlegt, dass ich wie Michael Bertrandt erwähnt hat, einen Grundtimer Interrupt habe, in welchem ich die Signale generiere. Dazu würde ich zwei Strukte anlegen. Eines für die X-Achse eines für die Y-Achse. Darin enthalten sind dann: - Complete //Zeigt an ob die Achsenbewegung fertig ist. - TotalSteps //Total zu fahrende Schritte - ActualSteps //Aktuell gefahrene Schritte - Feedrate //End-Geschwindigkeit - Ramp //Rampe in mm/s2 - ValidData //Sagt aus ob NextStepIn korrekt ist. - NextStepIn //Wann der nächste schritt kommt. Wird im Int heruntergezählt. wenn es 0 ist, wird ein schritt ausgeführt Zu ValidData: wenn NextStepIn 0 ist, könnte es auch sein, dass diese variable noch nicht erneut berechnet worden ist. ValidData gibt an, ob dies der fall ist oder nicht. Ist ValidData true und NextStepIn = 0 bzw dann werden die steps bei jedem Interrupt ausgegeben. Somit Maximalspeed. Wenn NextStepIn bei 0 angelangt ist, werde ich calcNextStep() aufrufen. Dieses soll dann berechnen, wann der nächste schritt erfolgen soll. Gleichzeitig wird ActualSteps hochgezählt. Ist es identisch mit TotalSteps, so wird diese Achse nicht mehr bedient. Wenn alle Achsen ihre TotalSteps erreicht haben, so wird ein "OK" zurückgegeben um zu zeigen dass die Bewegung abgeschlossen ist. Was meinst ihr dazu?
:
Bearbeitet durch User
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.