Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung mit PWM ansprechen


von Holger K. (holgerkraehe)


Lesenswert?

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
von Bernd (Gast)


Lesenswert?

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

von Holger K. (holgerkraehe)


Lesenswert?

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
von Michael B. (laberkopp)


Lesenswert?

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.

von Bastler (Gast)


Lesenswert?

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

von Holger K. (holgerkraehe)


Lesenswert?

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
von m.n. (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.