Hallo,
ich bin gerade dabei einen Controller für eine Schrittmotorkarte mit
Takt/Richtung zu programmieren. Den Takt will ich dabei per
Timer-Interrupt generieren. Dies ist soweit auch kein Problem. Da
Schrittmotoren für gewisse Geschwindigkeiten jedoch eine Anfahrtsrampe
brauchen, erhöhe ich die Frequenz mit jedem Schritt in meiner
Interruptfunktion. Dies funktioniert soweit auch. Das Problem ist nun
jedoch, dass der Controller je nach Frequenz mal mehr und mal weniger
Takte erstellt, obwohl ich im Interrupt mitzähle.
D.h., ich möchte z.B. 200 Schritte fahren. Diese werden ohne meiner
Rampe auch ohne Probleme angefahren. Sobald ich jedoch mit Rampe auf
schnellere Frequenzen fahre, fängt er an im Phase Correct PWM Mode
Schritte zu verlieren und im CTC Mode Schritte hinzu zu gewinnen.
Hier mein Code:
ja bis auf 0 dekrementiert, hierfür muss also der Interrupt 400 mal
aufgerufen werden und auch gleichzeitig den Ausgang umschalten, aber es
scheint so, als ob nur dekrementiert wird und nicht geschaltet wird.
Benutzt wird ein Arduino Uno.
Gruß, Maxim
maxim schrieb:> Sobald ich jedoch mit Rampe auf> schnellere Frequenzen fahre, fängt er an im Phase Correct PWM Mode
Phase Correct PWM ist der falsche Ansatz.
Weißt du, wie Phase Correct arbeitet? Da wird der Timer abwechselnd hoch
UND runter gezählt.
Ausserdem brauchst du die nicht. Die PC_PWM braucht man nur dann, wenn
man eine Phasenbeziehung einhalten muss (zb zu einer weiteren PWM)
> Schritte zu verlieren und im CTC Mode Schritte hinzu zu gewinnen.
Im CTC sollte das allerdings funktionieren.
Sicher, dass du mit der Zeitverringerung nicht zu kurz wirst, so dass
der Schrittmotor mit der Schrittfrequenz ganz einfach nicht mehr
mitkommt?
> Phase Correct PWM ist der falsche Ansatz.> Weißt du, wie Phase Correct arbeitet? Da wird der Timer abwechselnd hoch> UND runter gezählt.> Ausserdem brauchst du die nicht. Die PC_PWM braucht man nur dann, wenn> man eine Phasenbeziehung einhalten muss (zb zu einer weiteren PWM)
Phase Correct PWM war nur ein Test im Vergleich zu CTC, weil der Motor
in CTC bei mir mehr Schritte macht, als er sollte. Aber wiederrum nur
bei Fahrten mit Rampe.
> Sicher, dass du mit der Zeitverringerung nicht zu kurz wirst, so dass> der Schrittmotor mit der Schrittfrequenz ganz einfach nicht mehr> mitkommt?
Die Schrittmotorkarte kann mit einer Frequenz bis 300 kHz arbeiten, ich
jedoch erzeuge max. 2 kHz. Selbst wenn ich eine Rampe von 500 Hz auf
1000 Hz mache, entsteht ein Verlust/Gewinn von Schritten.
Wieder fährt der Motor ca. 20-30 Grad weiter, als er sollte. Gewinnt
also Schritte hinzu. Wenn ich die Frequenz mit einem Multimeter
überprüfe, so hat diese eine Abweichung von weniger als 1% von dem
errechneten Wert aus dem Manual, das stimmt also soweit.
maxim schrieb:>> Sicher, dass du mit der Zeitverringerung nicht zu kurz wirst, so dass>> der Schrittmotor mit der Schrittfrequenz ganz einfach nicht mehr>> mitkommt?>> Die Schrittmotorkarte kann mit einer Frequenz bis 300 kHz arbeiten, ich> jedoch erzeuge max. 2 kHz.
Das war nicht die Frage!
maxim schrieb:> Wieder fährt der Motor ca. 20-30 Grad weiter, als er sollte. Gewinnt> also Schritte hinzu.
Aha. Du zählst also nicht die Schritte, sondern schaust wie weit sich
der Motor gedreht hat. Aber dann ist deine Schlußfolgerung falsch! Wenn
der Motor sich weiter gedreht hat, dann heißt das nicht zwangsläufig,
daß die Steuerung mehr Schritte verlangt hat. Es kann auch ganz einfach
sein, daß der Motor diesmal weniger Schlupf hatte.
Die genannten 2kHz erscheinen mir auch sehr hoch. Kann der Motor das
überhaupt? (mit der Last und der Betriebsspannung)
Vorschlag: mach die Chose doch erstmal langsamer. So ca. Faktor 10.
Einfach nur um sicherzustellen, daß der Motor wirklich mitkommt. Und
dann mach eine Rampe drauf.
XL
Axel Schwenke schrieb:> Vorschlag: mach die Chose doch erstmal langsamer. So ca. Faktor 10.> Einfach nur um sicherzustellen, daß der Motor wirklich mitkommt. Und> dann mach eine Rampe drauf.
Hätte ich auch gesagt.
Erst mal braucht man eine Referenz die über jeden Zweifel erhaben ist,
wenn man die tatsächlich gemachten Schritte anders nicht zählen kann.
Den Motor gaaaanz langsam 200 Schritte machen lassen.
Ein simples Programm, welches mit _delay_ms(100) dazwischen den Pin
toggelt, erfüllt den Zweck. Und 5 Schritte/sek wird der Motor (ohne
Last) ziemlich sicher schaffen :-)
Ich würde einfach mal einen Zähler in die Motorleitung hängen und dann
eine genau definierte Rampe abfahren. Am Ende sagt Dir der Zähler wer
Recht haben könnte - Dein Motor oder deine Elektronik.
Übrigens: Schau Dir mal die Rampen selber an. Steigen die zu steil an
bzw. fallen sie zu schnell ab, kann der Brummer auch stolpern - selbst,
wenn Du im Rahmen des erlaubten bleibst.
Eine weitere Fehlermöglichkeit ist, während der Frequenzänderung können,
bei ungeschickter Programmierung, halbe Schritte oder überlange Schritte
entstehen. Die sind nicht besonders Gut nachzuweisen, da es sich dabei
um "Einzeltäter" handelt.
Axel Schwenke schrieb:> Du zählst also nicht die Schritte, sondern schaust wie weit sich> der Motor gedreht hat.
Genau, hierfür hab ich unteranderem einen Inkremental-Encoder am Motor.
Bei Frequenzen ohne Rampe, geht bis ungefähr 800 Hz, macht der Motor
immer exakt 200 Schritte. Der Motor wird übrigens mit 48V und 2A ohne
jegliche Last bestromt und ist bei uns in der Firma erprobt, auch bei
höheren Frequenzen. Der Motor sollte also nicht das Problem darstellen.
Dennoch werde ich mal in den nächsten Tagen eine CNC Software dranhängen
und prüfen.
Letzlich werde ich wohl tatsächlich mal einen Counter mitzählen lassen.
Ich werde berichten :) Danke soweit.