Hallo, Ich weiß, dass es viele Beiträge dazu schon gibt, aber bis jetzt habe ich kein entsprechendes gefunden. Und zwar mache ich gerade eine Diplomarbeit und habe zwei fragen: 1) Ich habe einen Antrieb und steuere das ganze mit einem Schrittmotor an (Controller ist ein XMEGA128A3, mit C programmiere ich) Auf der anderen Seite habe ich eine Lochscheibe, die halt die Impulse ausgibt. Nun war meine Idee, dass ich die Positive Flanke verwende, um die Zeit zu starten und bei der nächsten positven Flanke die auszulesen und auf null zu setzen. und von neuem beginnen. Wenn halt die Zeit nicht dem Soll entspricht, dann soll der Schrittmotor schneller bzw lngsamer drehen. Soweit sogut. Aber wie genau sieht der Code dazu aus? 2)Der Motor soll auch nicht von Null auf 100 hochdrehen. (Schrittverlust) Hat jemand eine gute Idee eine Rampe für den Takt zu erstellen? Mal ein paar Details zur Arbeit: Es ist so, dass ich in der Diplomarbeit einen Art Saisograph baue, nur soll der halt die Spannung bzw Strom messen. Der eine Motor soll eine Spindel betreiben(dafür Rampe) und der zweite soll das Papier befördern(zweite Motor mit Lochscheibe. Lochscheibe ist eig unnötig, aber der Professor wollte das unbedingt) Die Motor haben 0.7A pro Phase mit 12V Habe den Schrittmotor treiber EASYDRIVER4.4 (Sehr zu empfehlen!!!)
ENTWEDER du hast einen Schrittmotor ODER du ermittelst die Geschwindigkeit mit einer Lochscheibe. Beides zusammen ist doppelt gemoppelt und ähnlich wie wenn man 2 Uhren hat, weiss man dann nie genau wie spät es ist. Du musst/kannst davon ausgehen, daß der Schrittmotor keine Schrittverluste hat, sonst wäre er mechanisch fehldimensioniert. Wenn du das überprüfen willst, kannst du die Lochscheibe verwenden, die z.B. alle 10 Schritte dann ein Loch haben müsste, und wenn das 12 Schritte dauert, sind wohl welche verloren gegangen. Verwende die Lochscheibe nicht um die Geschwindigkeit zu MESSEN, schliesslich gibt du dem Schrittmtoor die Geschwindigkeit VOR, die IST dann auch so.
> Nun war meine Idee, dass ich die Positive Flanke verwende, > um die Zeit zu starten und bei der nächsten positven Flanke > die auszulesen und auf null zu setzen. und von neuem beginnen. Das ist unnötig kompliziert und birgt außerdem ( bei hohen Geschwindgkeiten) die Gefahr, dass Du eine Flanke verpasst und dann ein völlig falsches Ergebnis erhälst. Mach es so: Du startest einen Timer, der frei durchläuft. Nennen wir in TIMER. Und du legst zwei globale Variablen an, um Beginn- und End-Zeitpunkte der Messung zu speichern. Die Variablen müssen volatile sein. volatile uint16_t start; volatile uint16_t ende; Wenn Du einen 8bit Timer verwendest, müssen die Variablen vom Typ uint8_t sein. Die positive Flanke löst einen Interrupt aus. In der Interrupt-Routine machst du folgendes: start=ende; ende=TIMER; Im Hauptprogramm (main) berechnest Du die Differenz der beiden Variablen. Das ist die Zeit, die zwischen zwei Flanken verstrichen ist. Damit kannst Du dann die Drehzahl berechnen. uint16_t diff=ende-start; Falls der Timer zwischendurch übergelaufen ist - macht nix. Das Ergebnis ist dann trotzdem richtig. Bezüglich der Regelung solltest Du dich mit Regelungstechnik beschäftigen. Ein gebräuchlicher Ansatz ist der "PID Regler", eine Kombination aus drei Algorithmen. Versuche, bei der Implementierung auf Fließkomma-Arithmetik zu verzichten, weil kleine Mikrocontroller das nicht so gut können (dauert zu lange).
Wolfgang Karner schrieb: > Hat jemand eine gute Idee eine Rampe für den Takt zu erstellen? Zur Berechnung/Steuerung von Beschleunigungsrampen findest du einiges in der "AVR446: Linear speed control of stepper motor" von Atmel
>Saisograph was das? Wolfgang Karner schrieb: > Nun war meine Idee, dass ich die Positive Flanke verwende, um die Zeit > zu starten und bei der nächsten positven Flanke die auszulesen und auf > null zu setzen. und von neuem beginnen. Zeit starten und anhalten? Deswegen habe ich also dauernd Déjà-Vues :P Die Lochscheibe ist als Kontrolle, ob Schritte verloren gegangen sind. Also muss man nicht die Zeit, sondern die Anzahl der Impulse mit den Schritten des Motors vergleichen. Sowas kann man per Interrupt erledigen und in der ISR die Ist-Schritte der Lochscheibe zählen.
Für die Zeitmessung haben viele µC (auch der Xmega) eine extra Hardware Unterstützung (hießt beim AVR Input Capture). Damit wird der Timerstand schon in Hardware ausgelesen, unabhängig davon wie schnell der Interrupt reagiert. Beim Schrittmotor wird die Lochscheibe eher nur eine Kontrollfunktion haben - da sollte reines Zählen reichen, ggf. auch mit Auswertung des Quadratursignals. Auch dafür haben einige der µC bereits eine extra Funktion drin. Ob es beim Xmega-A drin ist müsste man im Datenblatt nachsehen. Wie schon oben geschrieben wäre es ggf. Sinnvoll wenn die Lochscheibe nicht einfach die Schritte zählt, sondern eher eine andere Teilung hat. Damit ließen sich ggf. auch Fehler bei der Lochscheibe erkennen. Nachregeln nach der Lochscheibe wäre wohl nur sinnvoll wenn die sehr gut (etwa mehr als 2000 Teile pro Motor-Umdrehung) ist und Mikroschrittbetrieb beim Motor genutzt wird.
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.