Hallo, ich habe folgenden Schrittmotor und Treiber: Schrittmotor: http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=69&products_id=236 Schrittmotortreiber: http://www.shop.robotikhardware.de/shop/catalog/product_info.php?products_id=237 Der Motor soll einen 6x7 Rollfilm durch eine Filmkassette ziehen, ist also keine schwere Last. Der Schrittmotor macht laut Datenblatt max. 4000 Schritte / sek. (200 Schritte pro Umdrehung) Ich würde den aber nur mit max. 400 Schritten pro Sekunde betreiben, da ich max. 2 Umdrehungen pro Sekunde brauche. Meine Frage nun, brauche ich da trotzdem eine Anfahrrampe? Oder kann ich direkt mit 400 Schritten pro Sekunde starten und auch stoppen? Danke für Eure Einschätzung.
Würde ich mal versuchen, da es bei dieser Anwendung egal ist, ob du Schritte verlierst.
hinz schrieb: > Würde ich mal versuchen, da es bei dieser Anwendung egal ist, ob du > Schritte verlierst Es geht hier nicht um verlorene Schritte, sondern ob der Motor auch dreht oder nur summt :-) MrBurns schrieb: > Meine Frage nun, brauche ich da trotzdem eine Anfahrrampe? Oder kann ich > direkt mit 400 Schritten pro Sekunde starten und auch stoppen? Das wirst Du sofort sehen, wenn Deine Mechanik aufgebaut ist. Meiner Einschätzung nach brauchst Du eine Rampe.
Hallo, Hinz und m.n., danke erstmal für Eure Antworten. Es ist nicht egal, dass/ob ich Schritte verliere, da ich den Film exakt (d.h. 10tel Millimeter genau) positionieren muss! Wenn ich eine Rampe brauche, wie steil sollte die sein? Gibt es da Regeln/Berechnungen? Reicht es wenn ich z.B. die ersten 100 Schritte mit 100 Schritten pro Sek., die nächsten 100 Schritte mit 200 Schritten pro Sek. mache bis ich die Maximalgeschwindigkeit erreiche, so könnte ich mir eine komplizierte Berechnung (mit Taylor-Reihe etc.) sparen. Danke nochmal!
MrBurns schrieb: > Es ist nicht egal, dass/ob ich Schritte verliere, da ich den Film exakt > (d.h. 10tel Millimeter genau) positionieren muss! > > Wenn ich eine Rampe brauche, wie steil sollte die sein? Gibt es da > Regeln/Berechnungen? > > Reicht es wenn ich z.B. die ersten 100 Schritte mit 100 Schritten pro > Sek., die nächsten 100 Schritte mit 200 Schritten pro Sek. mache bis ich > die Maximalgeschwindigkeit erreiche, so könnte ich mir eine komplizierte > Berechnung (mit Taylor-Reihe etc.) sparen. Das Umschalten der Frequenz bringt relativ wendig. Wenn der Motor den Sprung von z.B. 100 auf 200 Hz geschafft hat, ist es ziemlich egal, ob du 5 oder 100 Schritte mit der neuen Geschwindigkeit machst. Der Trick bei der Rampe ist, trotz vorhandener Trägheitskröfte auf eine konstante Beschleunigung zu kommen. In der Atmel AppNote AVR446 ist das beschrieben http://www.atmel.com/dyn/resources/prod_documents/AVR446.zip Was soll da die Taylor Reihe? Bis du sicher, dass das Drehmoment des Motors überhaupt reicht, um deinen Film direkt zu transportieren? Ohne Getriebe könnte das eng werden.
Hallo Wolfgang,
>Bis du sicher, dass das Drehmoment des Motors überhaupt reicht, um...
nunja das sind alles noch Größen, die ich ermitteln muss, habe das
Gehäuse noch nicht fertig. Der Film lüpft ja 'nur' von der vollen Spule
über den Bereich der belichtet wird (wo er nur 2mm oben und 2mm unten
auf einer breite von ca. 10cm geführt wird) zu der leeren Spule. Ich
denke da ist nicht soviel Kraft nötig. Muss es aber ausprobieren.
Habe den Code zur Atmel AppNote AVR446 nun auf den Atmega8 angepasst,
ohne UART usw.. Habe dann mit einem Logic-Analyser mal das Signal bei
wenigen Schritten (200) angesehen, sehe aber im Log 'nur' bei der
fallenden Rampe eine Verzögerung der Pulse.
In der aufsteigenden sehe ich die nicht. Jetzt wollte ich halt den Code
selber schreiben, weil ich nicht weiß, ob und wo ich im Code von Atmen
einen Fehler bei der Umsetzung gemacht habe.
Ich dachte auch schon an eine Tabelle im Speicher mit ca. 100 Werten für
die delta t zwischen den Pulsen.
So bräuchte ich die etwas komplizierte Berechnung aus der AppNote nicht.
So würde meine Rampe immer 100 Schritte von 0 bis max. Speed haben. Bei
der Bremsung würde ich dann die Tabelle in 100 Schritten rückwärts
abarbeiten. Das würde mich 'nur' ca, 200 Byte (100 x 2 Byte für 16 Bit)
und ein bisschen Code kosten.
Dazu aber meine Frage sind 100 Schritte zum linear beschleunigen von 0
Auf 400 Pulse pro Sek. OK, oder muss die Rampe über 200 Schritte gehen
oder gehen weniger?
Sind noch ziemlich viele Unbekannte ;-).
Danke nochmal für Hilfe!
MrBurns schrieb: > Auf 400 Pulse pro Sek. OK, oder muss die Rampe über 200 Schritte gehen > oder gehen weniger? Das kommt auf die Aufteilung des Drehmoments auf Reibung und Trägkeitskräfte drauf an. Da steckt auch der Strator von deinem Motor mit drin. Ganz ohne Vorversuche oder genaue Parameter über dein System wird das wohl müßig. Der Algorithmus in der App-Note erzeugt definitiv auch eine Anfahrrampe, allerdings sollten die Bewegungsparameter schon sinnvoll gesetzt sein.
Und noch ein Problem - die Resonanzschwingungen. Wenn du zu vorsichtig beschleunigst, können die Resonanzschwingungen so stark werden, dass der Motor Schritte verliert. Mag ja sein, dass ein erfahrener Ingenieur die optimale Beschleunigung berechnen kann. Als Hobbybastler kommt man aber schneller zum Ziel, wenn man die Mechanik zusammenbaut und die Parameter systematisch ausprobiert.
Hallo Wolfgang und 'Kein Name', danke nochmal. >Der Algorithmus in der App-Note erzeugt definitiv auch eine Anfahrrampe, >allerdings sollten die Bewegungsparameter schon sinnvoll gesetzt sein. Rufe die Funktion wie folgt auf: speed_cntr_Move(400, 200, 200, 628); 400: Anzahl der zu fahrenden Schritte 200, 200 Beschleunigung und Bremsung in 0.01 rad/s^2 628 = 6.28 rad/sek (da speed in 0.01 rad/sek angegeben wird) 6.28 rad/sek = 2 U/sek. Geschindigkeit So wollte ich den Motor mal anfahren. Im Logic analyzer sehe ich aber am Anfang kaum eine Beschleunigung. Hier ein paar Periodenlänegn zwischen den Pulsen 1. Puls: 32.5 ms 2. Puls: 30,6 ms 3. Puls: 28,9 ms ... Mitte puls ca. 6,3 ms. ... drittletzer Puls: 47,5 ms vorletzer Puls: 56,1 ms letzter Puls: 72,1 ms. man sieht also die Bremsung ist wesentlich langsamer, sollte das nicht symmetrisch sein? Man sieht auch dass der Motor mit ca. 30 Pulsen pro Sek. angefahren wird. (1 / 32.5ms) ist das OK? Im Maximum kommt der Motor bei 6.3 ms zwischen den Pulsen auf 157 Pulse pro sek. Er erreicht also nicht die maximale Geschwindigkeit von 2 U/sek bzw. 400 Schritten pro sek. Ist das alles so in Ordnung? Danke für Eure Einschätzung
Nanu? Die Methode mit dem "delay = delay - 2 x delay / ( 4 x n + 1)" liefert perfekte Rampen, die genau mit dem selben Delay enden. Irgendwas stimmt da nicht. Ob die Geschwindigkeiten so passen, wird dir wohl niemand aus dem Stegreif sagen können. Manchmal trifft man Resonanzfrequenzen. Manchmal geht es so gerade noch - bis das Getriebe verstaubt. Wir kennen weder das erforderliche Drehmoment, noch deine Versorgungsspannung. Einfach ausprobieren.
MrBurns schrieb: > Im Maximum kommt der Motor bei 6.3 ms zwischen den Pulsen auf 157 Pulse > pro sek. > Er erreicht also nicht die maximale Geschwindigkeit von 2 U/sek bzw. 400 > Schritten pro sek. Dann muß er wohl schon bremsen, bevor mit der eingestellten Beschleunigung die Sollgeschwindigkeit erreicht wird. Wenn du die Schrittzahl oder die Beschleunigung erhöhst, sollte sich das ändern. Soweit ich mich erinnere, ist der Code aus der AppNote aber auch nicht fehlerfrei. Für die Parametern gab es Wertebereiche, wo in der Rechnung irgendetwas schief läuft.
Hallo nochmal, habe nun alles mal aufgebaut auch mit Schrittmotor dran. Habe auf Halbschritt eingestellt. Es scheint alles zu funktionieren. Es gibt eine Beschleunigungsrampe und auch eine Brems-Rampe. Nach genau 400 Schritten bin ich wieder am Anfang und das ist wiederholbar. Werde nun noch mit den Werten spielen und Grenzen ausloten. Der Motor ist sehr stark, kann ich nicht mit der Hand festhalten, ich denke das wird ohne Untersetzung gehen. Nochmal vielen Dank an alle, die mir hier geholfen haben. Eine Frage noch: Der Motor wird dabei sehr heiß ca. 50°C. Ist das normal? Danke!
Hallo MrBurns Scrittmotoren werden Im Stillstand so heiß, wenn der Strom dann nicht runtergeregelt wird (kannst du ev. beim Leistungsteil einstellen). Kannst du deinen Code mal Posten Gruss Bernd
MrBurns schrieb: > Eine Frage noch: Der Motor wird dabei sehr heiß ca. 50°C. Ist das > normal? 50°C finde ich jetzt noch nicht so kritisch. Du könntest im Haltezustand den Strom reduzieren, indem du die Referenzspannung nicht über das Poti R7 einstellst, sondern über eine von außen zugeführte Spannung festlegst. Die kann der µC einfach per PWM und nachgeschaltetem Tiefpaßfilter selber erzeugen. Damit hätte man dann auch die Möglichkeit, über den Strom kurzzeitig mit höherem Drehmoment zu fahren.
Hallo Wolfgang, danke, wenn 50° OK ist dann bin ich ja beruhigt. Der Motortreiber hat ein ENABLE Eingang, wenn ich den auf HIGH setze ist der Motor abgeschaltet und zieht dann auch keine 0.5 Ampere mehr. Ich denke so werde ich es machen. Danke nochmal!
Hallo Bernd, sorry, habe Deine Nachricht überlesen. Den Code posten? wie meinst Du das hierhin per copy und paste? Sind ein paar Dateien - wäre hier ein sehr langer Post. Oder geht das irgendwie anders? Hochladen oder so?
MrBurns schrieb: > Ich denke so werde ich es machen. Ob das gut ist, hängt von deiner Mechanik ab. Bei abgeschaltetem Treiber hat der Motor kein Haltemoment mehr (nur noch sein Rastmoment) und verliert dann bei der kleinsten Belastung seine Position. Je nach Mechanik ist es meist besser den Strom abzusenken.
Hallo Wolfgang, in deinem Fall hast Du recht, aber es wirken keine Kräfte wenn ich die Filmrolle bewegt habe, von daher denke ich, kann ich es über den ENABLE machen. Danke nochmal!
MrBurns schrieb: > Sind ein paar Dateien - wäre hier ein sehr langer Post. > Oder geht das irgendwie anders? Hochladen oder so? Du hast bestimmt mal eine *.zip entpackt, oder nicht?
Halo M.W., sorry verstehe ich nicht, eine ZIP entpackt? Ja habe ich schon, aber ich müsste meine Dateien packen - nicht entpacken - meinst Du das? Und wo kann ich die dann hinladen? Danke!
Noch ne Frage: Habe mal über mein STK600 den in dem Atmel-Beispiel verwendeten Takt (3.686 MHz) auf 16 MHz geändert. Habe F_CPU auf 16000000UL und T1_FREQ (bei Vorteiler 8) auf 2000000 gesetzt. Mit den Werten funktioniert die Rampe nicht sauber, also das Anfahren geht viel zu schnell und wie man es hören kann nicht linear. Außerdem läuft der Motor schneller. Wie kann das sein? ich denke das wird über F_CPU und T1_FREQ geregelt, müsste doch dann an der Drehzahl nichts ändern - oder? Danke!
Hallo Maulwurf, der Code für die Rampen ist doch im Original-Code von Atmel: http://www.atmel.com/Images/AVR446.zip dort in der Dateii: speed_cntr.c Habe in dieser Datei hinter den #include Anweisungen noch #include <avr/interrupt.h> und struct GLOBAL_FLAGS status = {FALSE, FALSE, 0}; eingefügt, die im Original ja in der main.c ist, die ich ja nicht verwende. Die UART-Dateien benutze ich auch nicht. Damit man das ganze mit dem AVR Studio 5 compilieren kann, habe ich noch folgendes angepasst: Die Zeilen: #pragma vector=TIMER1_COMPA_vect __interrupt void speed_cntr_TIMER1_COMPA_interrupt( void ) { ... habe ich such folgende Zeile ersetzt: ISR(TIMER1_COMPA_vect) { ... Ich rufe dann in meinem main-Programm nur folgendes auf um den Motor laufen zu lassen: speed_cntr_Move(1600, 1600, 1600, 3000); Hoffe Du kommst damit klar, wenn nicht einfach nochmal melden!
Hallo, hate jemand hier noch ne Hilfe zu? Wäre sehr dankbar: Habe mal über mein STK600 den in dem Atmel-Beispiel verwendeten Takt (3.686 MHz) auf 16 MHz geändert. Habe F_CPU auf 16000000UL und T1_FREQ (bei Vorteiler 8) auf 2000000 gesetzt. Mit den Werten funktioniert die Rampe nicht sauber, also das Anfahren geht viel zu schnell und wie man es hören kann nicht linear, Motor stockt zwischendrin in der Beschleunigungsphase. Außerdem läuft der Motor viel schneller. Wie kann das sein? Ich denke das wird über F_CPU und T1_FREQ geregelt, müsste doch dann an der Drehzahl nichts ändern - oder? Danke!
Hallo MrBurns, ich habe versucht den Code vom AVR446 nach deinen Angaben abzuändern und so an das AVR Studio 5 anzupassen. Beim erstellen werden keine Fehler gezeigt. Für meinen A4988 Treiber benötige ich am STEP Eingang Impulse. Dazu habe ich alle Zeilen sm_driver_StepCounter(srd.dir); mit if(srd.dir == 1) { PORTB &= ~(1<<PB0); // PB0 auf low -> LED an for(i=0 ; i<30 ; i++); // Impulszeit PORTB |= (1<<PB0); // PB0 auf high -> LED aus} } ersetzt. Die LED simuliert im Moment den STEP Eingang vom Treiber. Am PB0 habe ich dann ein Oszi angeschlossen, kann aber nur ein dauer Low messen. Ich habe F_CPU 8000000L und T1_FREQ auf 1000000 gesetzt. Kann es da zu Problemen kommen? Hast du deine in den Griff bekommen? MrBurns schrieb: > Wie kann das sein? Ich denke das wird über F_CPU und T1_FREQ geregelt, > müsste doch dann an der Drehzahl nichts ändern - oder? Oder gibt es noch eine andere Fehlerquelle? Gruß
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.