Forum: Mikrocontroller und Digitale Elektronik Schrittmotor und Rampe


von MrBurns (Gast)


Lesenswert?

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.

von hinz (Gast)


Lesenswert?

Würde ich mal versuchen, da es bei dieser Anwendung egal ist, ob du 
Schritte verlierst.

von m.n. (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

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.

von Kein Name (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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

von Kein Name (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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!

von maulwurf (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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!

von MrBurns (Gast)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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.

von MrBurns (Gast)


Lesenswert?

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!

von M. W. (hobbyloet)


Lesenswert?

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?

von MrBurns (Gast)


Lesenswert?

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!

von MrBurns (Gast)


Lesenswert?

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!

von maulwurf (Gast)


Lesenswert?

Hallo MrBurns

Mir geht es um den Code mit den Rampen

Gruss Bernd

von MrBurns (Gast)


Lesenswert?

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!

von MrBurns (Gast)


Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.