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.
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ß