Re: Mikroschritt auch im Schnellgang?
Hallo Pernozzoli und Freunde der 'winzigen Schritte',
zunächst mal zu den Microsteps: die machen natürlich nur bei kleinen Frequenzen Sinn, bei höheren Drehzahlen vergrößert man normalerweise die Schrittweite, bis man bei der höchsten Drehzahl dann beim reinen Vollschrittbetrieb angelangt ist. Das funktioniert deshalb gut, weil der Motor selbst durch seine Trägheit als Tiefpass wirkt. In der Praxis taktet man oft die Logik mit einer konstanten Frequenz (typisch der Vollschrittfrequenz) und steuert die Geschwindigkeit mit dem jeweils addierten oder subtrahierten (=vorwärts/rückwärts) Phasenwinkel (~Anzahl Microsteps) vor.
Beispiel: 0° bei stehendem Motor, 90°/Takt bei max. Geschwindigkeit, 45°/Takt bei halber Drehzahl, usw.
Die Phase für die beiden Spulen (='Stränge') wird dann nach der Funktion
Amplitude1=Umax*sin(2*Pi*Pos/N) (Pos=Position in Microsteps, N=Anz.Microsteps/4Vollschritte)
Amplitude2=Umax*cos(2*Pi*Pos/N)
eingestellt, die analogen Amplituden entweder über separate D/A-Wandler oder über PulsWeitenModulation mit anschließender Glättung erzeugt. Ich bevorzuge PWM, weil dadurch die umständlichen D/A-Wandler wegfallen.
Das funktioniert bei mir so:
ich verwende nichtlineare PWM-Stufen, die zeitlich gestaffelt sind mit
dt=50,50,49,47,45,43,41,37,34,30,26,21,17,12,7,3 Takten mit 9.8304Mhz (Summe=512).
Für einen Motor sind je 2 PWM-Ausgänge erforderlich (mit 90°Phasenverschiebung zueinander)
Bei gewünschter Amplitude=0 bleibt der jeweilige Port-Pin immer Low, bei max. Amplitude immer High (eigentlich klar).
Ansonsten wird er bei Takt t=0 auf High gesetzt, und dann je nach gewünschter Ausgangsamplitude dieses Pins bei Takt
t=50 oder t=(50+50) oder t=(50+50+49) oder t=(50+50+49+47) oder t=(50+50+49+47+45) ...usw...
zurück auf Low gesetzt.
Das ergibt nach Glättung der PWM-Frequenz 17 Spannungsstufen von 0 bis 5V, die fast perfekt auf einer Sinuskurve liegen (für äquidistante Achsenwerte; der negative Ast wird duch Umpolen an der H-Brücke erzeugt). Damit ergeben sich 64 Microsteps für eine komplette 360° Sinuskurve (entspricht 4 Vollschritte).
zum Filter:
Du filterst natürlich nicht die Microstep-Frequenz (die kann ja auch 0 sein bei stehendem Motor oder beliebig langsam), sondern die PWM Frequenz! Dann aber so, dass die höchste auftretende Nutzfrequenz (i.A. die Vollschritt-Frequenz) noch ordentlich durchkommt.
Erst mal ein paar Worte zur Dimensionierung
Diese Interrupt-Tasks mit den angegebenen Frequenzen sind bei meinem Programm im Einsatz:
Quarzfrequenz = 9.8304Mhz
PWM Frequenz = 19.2kHz =9.8304Mhz/512 (512=Summe der PWM Stufen, siehe oben)
RS232-Frequenz = 9.6kHz =9.8304Mhz/1024 (programmierbarer UART Vorteiler)
Taktfreq.Amplitude = 2.4kHz =19.2kHz/8 (=Vollschrittfreq.)
Taktfreq.Rampe = 300Hz =2400Hz/8 (alle 3.33ms wird 1/8 Mikroschritt zur Schrittweite addiert/subtr.)
Taktfreq.Move = 150Hz =300Hz/2 (=Autorepeatefreq. der Handsteuerbox)
Da 1 komplette Sinusschwingung (Phase 360°) = 4 Vollschritte entsprechen, ergibt sich damit eine max. Freq. des Spulenstroms von 2400Hz/4 =600Hz. Das entspricht bei einem Motor mit 1.8°/Vollschritt einer Geschwindigkeit von 720 U/min. Beim Anfahren/Abbremsen wird eine Rampe von ca. 0.5s gefahren, was nach meiner bisherigen Erfahrung für normale Motoren ausreicht.
Ich verwende zur Filterung je Signal jeweils Doppel-RC-Glieder in Serie, die gleichzeitig als 1:10 Spannungsteiler wirken von 5Vp PWM auf 0.5Vp Uout (gleiche Spannung wie am Sense-Widerstand der Treiber).
(Na ja, das soll ein Schaltbild sein...):
<pre><font class="small">code:</font><hr>
(PWM in)--10k -|- 100k -|-----|--- (Analog out)
10nF 10nF 12k
Gnd___________|________|_____|_____Gnd
</pre><hr>
Zeitkonstante tau =R*C=0.1ms (10k*10nF bzw [12k||100k]*10nF)
Grenzfreqenz F_g =1/(2*Pi*R*C) =~1.5kHz, Steilheit -40dB/Dekade
-> die Spannung steigt innerhalb einer Vollwellenzeitkonstante (1/2.4kHz=0.417ms) auf >92% des max.Werts.
-> der 19.2kHz Anteil wird um einen Faktor >50 gedämpft. Das ergibt somit nur noch ein paar mV Ripple bei der auf 0.5Vp heruntergeteilten Analog-Ausgangsspannung. Zumindest im Oszi siehts sehr gut aus.
Natürlich könnte man erheblich bessere aktive Filter verwenden (z.B steile Tschebysheff höherer Ordnung), aber da ich für 4 Motoren 8 Filter brauche, ist das etwas zu aufwendig. Ich will's möglichst einfach halten.
Falls der max. Spulenstrom einstellbar sein soll, kann das über Änderung des 100k Widerstands erfolgen. Solange er >50k bleibt, wird die Zeitkonstante praktisch nicht beeinflusst, der max.Strom bei konstantem Sense-Widerstand ändert sich aber mit 1/R (mach ich aber nicht. Ich persönlich ziehe eine Anpassung über die passene Auswahl der Sense-Widerstände vor, die Steuerspannung bleibt dann bei 0.5Vp).
Bei mir schreitet die Arbeit an der Steuerung exakt nach Plan vorwärts - nämlich im Moment fast gar nicht <img src="/phpapps/ubbthreads/images/icons/frown.gif" alt="" /> , da derzeit einige andere Dinge Vorrang haben. Wahrscheinlich wird's September, bis ich wieder nennenswert daran weiterbasteln kann. Das hat den Vorteil, dass man alles exakt dokumentieren muss, weil ich nach ein paar Wochen Pause die ganzen Details wieder vergessen habe ...
Immerhin ist der AT2313-Controller fertig programmiert und erfolgreich an einem Probeaufbau getestet, ich habe das Platinenlayout für die Steuerplatine fertig, und das für die Treiberplatine etwa zur Hälfte.
Schau'n mer mal!
Gruß
Karl-Heinz