Forum: Mikrocontroller und Digitale Elektronik Schrittmotor ansteuern mit Atmega8 asm


von Axel H. (mf-futzi)


Lesenswert?

Hallo,

Ich mache gerade meine ersten Gehversuche mit einer 
Schrittmotoransteuerung.
Hardware:
M542T Schrittmotortreiber
23HS30 Schrittmotor

Ich habe jetzt ein Programm in ASM geschrieben.Ich steuere damit die 
Pins PUL, DIR und ENA an. Die Frequenz für PUL erzeuge ich mit TimerO.

Einstellung am Treiber Step angle 0.360, entspricht 1000 Schritte pro 
Umdrehung.

Jetzt mein Problem.
Ich habe einen Zähler eingebaut, der 1000 Schritte zählt und dann den 
Motor stoppt. Der Motor macht aber nur ca. 80Grad. Für eine ganze 
Umdrehung muss ich 2250 Impulse ausführen. Nach meinem Verständnis 
müsste auch eine Verdoppelung der Impulse die doppelten Umdrehungen 
bedeuten. Aber der Motor macht bei 4500 Impulsen ca. 750 Grad.

Kann mir jemand einen Tipp geben, wo die Ursache zu suchen ist?

Danke, Axel

von Michael B. (laberkopp)


Lesenswert?

Axel H. schrieb:
> Kann mir jemand einen Tipp geben, wo die Ursache zu suchen ist?

Obwohl du mit Mikroschritten arbeitest, kann ein ohne Last laufender 
Schrittmotor trotzdem in Resonenzen kommen und Schritte verlieren.
Ausserdem schreibst du nicht, wie schnell du die Impulse erzeugst, 
vielleicht zu schnell für eine sinnvolle Beschleunigung. Bei schneller 
Impulsfolge muss man eine Beschleunigungsrampe berücksichtigen.

Belaste (und dämpfe) also erst mal deine Motorwelle, meist reicht es, 
sie mit den Fingern zu bremsen damit der Motor sauberer läuft.
Beschleunigst du schnell, setze mal das Tempo herunter.

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

der Motor ist im Moment unbelastet. Im Programm habe ich verschiedene 
Gewindigkeiten vorgesehen. Auch bei niedriger Geschwindigkeit (0,5 
Umdr./s)ist das Problem vorhanden.

Ein Rampe habe ich (noch) nicht. Weiß im Moment noch nicht wie ich das 
in asm realisieren kann. Schalte also mit dem enable-pin den Motor 
ein/aus.

Axel

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Axel H. schrieb:
> Motor stoppt. Der Motor macht aber nur ca. 80Grad. Für eine ganze
> Umdrehung muss ich 2250 Impulse ausführen. Nach meinem Verständnis
> müsste auch eine Verdoppelung der Impulse die doppelten Umdrehungen
> bedeuten. Aber der Motor macht bei 4500 Impulsen ca. 750 Grad.
>
> Kann mir jemand einen Tipp geben, wo die Ursache zu suchen ist?

 Doppelte Anzahl Impulse <> doppelte Anzahl Schritte = verlorene
 Schritte.

 Da die Differenz bei Verdoppelung kleiner wird, liegt dein Problem
 in Anfahren ohne Rampe.
 Langsamer anfahren oder Tabelle benutzen.

von M. K. (sylaina)


Lesenswert?

Axel H. schrieb:
> Ich habe jetzt ein Programm in ASM geschrieben.Ich steuere damit die
> Pins PUL, DIR und ENA an. Die Frequenz für PUL erzeuge ich mit TimerO.

Mit welcher Frequenz bist du am PUL dran? Hast du bedacht, dass du eine 
Mindestpulsweite beim M542 brauchst? Hab das Datenblatt dazu nur 
überflogen aber da hab ich was von 1.5 us Mindesbreite gelesen.

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

habe jetzt 2 Fehler gefunden:
1. Ich mache bei jedem Timer-Interupt einen Flankenwechsel zur 
Pulserzeugung. D.h. für eine Umdrehung brauche ich also 2000 Impulse.
2. Ich hatte einen Fehler bei meinem Zähler um 255 Schritte.

Beides habe ich korrigiert und jetzt werden die Umdrehungen korrekt 
erreicht.

Gerne würde ich aber, wie schon empfohlen, 2 Rampen implementieren. Kann 
mir vielleicht jemand beschreiben, wie die Rampen mit einer Tabelle 
funktieren? Ich versuche das das selber in asm umzusetzen. Noch ein 
Hinweis: Mit einem Drehencoder kann ich verschiedene Drehzahlen 
einstellen.

Danke für einige Tipps.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Axel H. schrieb:
> Gerne würde ich aber, wie schon empfohlen, 2 Rampen implementieren. Kann
> mir vielleicht jemand beschreiben, wie die Rampen mit einer Tabelle
> funktieren? Ich versuche das das selber in asm umzusetzen.

 Nur als Beispiel beim Anfahren:
 Schrittzähler = 0
 Solange der Schritzähler < 100, Werte aus Tabelle[Schrittzähler]
 nehmen und inc Schrittzähler, ansonsten Full Speed fahren.

 Beim Abbremsen:
 Schrittzähler = 50
 Solange der Schritzähler > 0, Werte aus Tabelle[Schrittzähler]
 nehmen und dec Schrittzähler, ansonsten Halt.

 P.S.
 Lange her, dass ich etwas mit Schrittmotoren gemacht habe, ob die
 100 bzw. 50 Schritte reichen oder zu viel sind, weiss ich nicht mehr.

: Bearbeitet durch User
von Axel H. (mf-futzi)


Lesenswert?

Hallo,

heißt das, wenn ich 50 Geschwindigkeitsstufen habe, ich brauche für die 
Anfahrrampe eine Tabelle von 50 Zeilen mit jeweils 100 Werten?


Axel

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Axel H. schrieb:
> heißt das, wenn ich 50 Geschwindigkeitsstufen habe, ich brauche für die

 Da sind Zeiten für deinen Timer drin.
 Und beim abbremsen brauchst du (meistens) weniger Schritte.

> Anfahrrampe eine Tabelle von 50 Zeilen mit jeweils 100 Werten?

 Es geht auch mit 2 Zeilen a 50 Werten.

: Bearbeitet durch User
von Jens W. (jensw)


Lesenswert?

Hallo,

schau dir das mal an:
http://www.atmel.com/images/doc8017.pdf

Ist zwar in C, aber das lässt sich sicher umsetzten.
Sehr gut erklärt und funktioniert prima.
Ich habe das schon auf den XMega portiert und auf den AVR32.
Beides hat sehr gut funktioniert.
Man muss bei den Berechnungen ein bisschen aufpassen, dass man bei 
Anpassungen auch den Datentyp mit anpasst, so dass es keine Überläufe in 
den Variablen gibt.

Gruß, Jens

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jens W. schrieb:
> Ist zwar in C, aber das lässt sich sicher umsetzten.
> Sehr gut erklärt und funktioniert prima.

 Mag sein, aber unnötig und langsam.
 Auch mit 16-bit Werten braucht eine Tabelle nur 200 Bytes bei
 100 Schritten.

 Das ist weitaus weniger als der nötige Code für die verschiedenen
 (und meistens unnötigen) Berechnungen.
 Von der Geschwindigkeit gar nicht zu reden.

 Wenn 2000 Schritte anzufahren sind, dann werden Schritte 0-99 aus
 der Tabelle gelesen, Schritte 100-1949 mit Fullspeed gefahren und
 die Schritte 1950-1999 wiederum aus der Tabelle geholt, nur absteigend
 und mit 2 x decrement.

 Ich hatte damals sogar 2 Tabellen drin - eine für unbelasteten und
 eine für belasteten Zustand. Zwei Stunden hin- und hergefahren, die
 richtigen Zeiten gefunden und das wars dann.

 Oder PC die Zeiten ausrechnen lassen und neue Tabelle flashen.

: Bearbeitet durch User
von Jens W. (jensw)


Lesenswert?

Hallo,

Das ist eine recht pauschale Aussage.
Man kann nicht einfach behaupten es sei unnötig, wenn man die 
Anforderungen nicht kennt. Für deine Anwendung mag es sein, dass es 
nicht notwendig ist. Du konntest offensichtlich damit leben, dass die 
Beschleunigung nicht konstant ist.
Und langsam. Naja, dass ist so die Frage. Schnell genug um die Schritte 
zu berechnen ist es auf jeden Fall.
Und wenn der Controller wartet, bekommst du auch kein Geld zurück. Also 
lass ihn doch was tun.
Oder in deiner Anwendung war es so, dass es zu langsam war. Je nach dem 
was der sonst noch so zu tun hat. Das muss man eben im Detail 
betrachten.

Egal, lass uns nicht streiten. Ich wollte nur einen alternativen Ansatz 
aufzeigen.
Halten wir fest: Tabelle oder der Ansatz aus der AVR-Note ist beides 
möglich.

Grüße und schönes Wochenende, Jens

von Axel H. (mf-futzi)


Lesenswert?

Hallo,

Super! Danke für eure beiden Lösungsvorschläge. Ich schaue mir beide mal 
genau an und werde dann sehen, was ich mit meinen bescheidenen 
Asm-Kenntnissen umsetzen kann.

Kann gut sein, dass ich nochmal nachfragen muss.

Axel

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jens W. schrieb:
> Egal, lass uns nicht streiten. Ich wollte nur einen alternativen Ansatz
> aufzeigen.
> Halten wir fest: Tabelle oder der Ansatz aus der AVR-Note ist beides
> möglich.

 Nöö, kein Streit, mein Punkt war Schnelligkeit und Codesize.
 Wenn es mit der Zeit und Grösse hinhaut - OK, kein Problem.
 Aber gerade bei uC sind die beiden Sachen problematisch, deswegen...

> Du konntest offensichtlich damit leben, dass die
> Beschleunigung nicht konstant ist.

 Nein, ich habe nicht mit einem konstanten Wert gerechnet (addiert),
 sondern die berechneten Werte in eine Tabelle gepackt, danach durch
 ausprobieren noch ein bisschen an die Grenzen rangezogen und das
 wars dann.

 Deswegen zwei Tabellen, eine für belastet und eine für unbelastet.

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.