Forum: Mikrocontroller und Digitale Elektronik Bipolar Schrittmotor mit Bascom ansteuern


von Jörg (Gast)


Lesenswert?

Hallo allerseits,

ich habe hier einen bipolaren Schrittmotor vor mir liegen.
Er ist sehr klein und stammt aus einem alten Drucker.

Nun ist meine Frage, wie steuere ich diesen Motor an?
Ich habe mich auf RN-Wissen über Schrittmotoren informiert, aber ich 
stehe auf dem Schlauch. Ich verwende keinen Treiber für den Motor, er 
hängt also direkt am Atmega16. Ich habe bis jetzt nur Beispiele 
gefunden, die mit Treiber aufgebaut wurde. Im Datenblatt steht "can be 
directly driven by a µ-controller".

Mein Programm sieht folgendermaßen aus und der Schrittmotor zuckt auch 
hin und her.
Aber wie würde man es realisieren, dass er z.B einmal von 0-180° fährt?
Es wird doch wohl nicht so sein, dass ich jetzt jeden Schritt einzeln 
definieren muss?

VG Jörg


$regfile = "m16def.dat"
$crystal = 1000000
$hwstack = 10
$swstack = 10
$framesize = 10

Dim Warten As Integer
warten  = 1000

Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output

Do

 Portd.0 = 0
 Portd.1 = 1
 Portd.2 = 0
 Portd.3 = 1

Waitms Warten

 Portd.0 = 0
 Portd.1 = 1
 Portd.2 = 1
 Portd.3 = 0

Waitms Warten

 Portd.0 = 1
 Portd.1 = 0
 Portd.2 = 1
 Portd.3 = 0

Waitms Warten

 Portd.0 = 1
 Portd.1 = 0
 Portd.2 = 0
 Portd.3 = 1

Waitms Warten

Loop
End

von Jörg (Gast)


Lesenswert?

Ohh, da fehlt noch was sehe ich gerade.

Spule 1a an Portd.0
Spule 1b an Portd.1
Spule 2a an Portd.2
Spule 2b an Portd.3

von Michael A. (Gast)


Lesenswert?

Jörg schrieb:
> Ich verwende keinen Treiber für den Motor, er
> hängt also direkt am Atmega16.

Da würde ich mich mal im Datenblatt des µC schlau machen, welcher 
maximale Strom an den Ausgängen zugelassen ist. Das sollte mich sehr 
wundern, wenn der bei direktem Anschluß des Schrittmotors nicht 
überschritten wird.

> Im Datenblatt steht "can be directly driven by a µ-controller".

In wessen Datenblatt?

> Es wird doch wohl nicht so sein, dass ich jetzt jeden Schritt einzeln
> definieren muss?

Der Schrittmotor muss nicht nur jeden Schritt, sondern für jeden Schritt 
auch noch die Phasensignale wissen. Von selbst passiert das nicht.

von Jörg (Gast)


Lesenswert?

Michael A. schrieb:
> In wessen Datenblatt?

Im Datenblatt des Motors. 20mA sind als Maximalstrom des Motors 
angegeben, typ. sind 15mA

Michael A. schrieb:
> Der Schrittmotor muss nicht nur jeden Schritt, sondern für jeden Schritt
> auch noch die Phasensignale wissen. Von selbst passiert das nicht.

Ok, dass ist scheinbar eine wichtige Info. Aber was ist ein Phasensignal 
bzw  wie sieht es aus?

Karl Heinz Buchegger schrieb im Beitrag #2996905:
> Schon mal was von Schleifen gehört?
> Zb FOR, WHILE

Ja, dass Schleifen dafür nötig sind ist mir schon bewusst, aber ich 
weiss nicht so recht wie ich das ganze verpacken soll.

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:
> Michael A. schrieb:
>> In wessen Datenblatt?
>
> Im Datenblatt des Motors.

Aha.
Und woher weiß dein Datenblatt, was dein µC alles kann.

> 20mA sind als Maximalstrom des Motors
> angegeben, typ. sind 15mA

ok, in diesem Fall könntest du Glück haben. 20mA kann ein Pin eines 
Mega16 aufbringen. Dies deshalb, weil das so im Datenblatt des M16 
steht!


Machs nicht so kompliziert.
Wieviele Drähte kommen aus deinem Motor heraus?

Bei einem Bipolar Motor sollten das eigentlich 4 Drähte sein.

WEnn das so ist, dann mach erst mal eine Vorübung.
Trenn den Motor mal vom µC und versuch den mal mit der Hand zum bewegen 
zu bringen. Und das machst du so.

Du hängst alle 4 Drähte an Masse.
Danach nimmst du dir EINEN der 4 Drähte und verbindest den mal mit +5V.
Der Motor wird einen Satz machen und der Magnet im inneren richtet sich 
in diese Richtung aus.
Danach klemmst du diesen Draht wieder zurück an Masse und suchst dir 
einen der anderen 3 Drähte aus.
Und jetzt musst du genau schauen. Ideal ist es, wenn du dir mit einem 
Klebeband ein Fähnchen an die Achse machst, so dass du die Bewegung gut 
sehen und abschätzen kannst.
Wenn du die restlichen 3 Drähte durchprobierst (jeweils an +5V hängst), 
dann wirst du sehen, dass der Motor bei 2-en davon einen kleinen Satz in 
eine Richtung macht (wobei bei diesen beiden der Schritt jeweils in 
entgegengesetzte Richtungen geht) und bei einem einen größeren Schritt. 
Zwischendurch mit dem ersten Draht wieder in die Ausgangslage 
zurückstellen!

Und jetzt variierst du durch.
Was du suchst ist die richtige Reihefolge, in der du einen nach dem 
anderen jeweils einen Draht an +5V hängst und der Motor jeweils einen 
kleinen Schritt in immer die gleiche Richtung macht. WEnn du die 
Reihenfolge immer und immer wieder wiederholst macht der Motor jeweils 
einen kleinen Schritt in immer dieselbe Richtung.

Das geht ganz gut, wenn man jeweils einen Draht nach dem anderen an 
jeweils +5V hängt und die anderen an Masse hängen. Markier dir die 
Drähte! Mit Klebeband kleine Fähnchen an die Kabel machen und mit 
Filschreiber 1, 2, 3, 4 draufschreiben. Beim Durchprobieren der 3 Drähte 
zwischen durch immer wieder mit dem ersten Draht in die definierte 
Ausgangsposition zurückstellen lassen! Du musst immer von der gleichen 
Ausgangslage ausgehen, wenn du die restlichen 3 Drähte auseinander 
sortierst.

Hast du die Reihenfolge (du brauchst dazu kaum länger als 10 Minuten), 
dann alles wieder an den µC hängen und ein Programm schreiben, welches 
genau das gleiche was du händisch gemacht hast, mit den Portpins macht. 
In einer Schleife.
Voila, der Motor dreht.
(wenn die Störungen durch den Motor nicht so hoch sind, dass sie den µC 
zum Abstürzen bringen)

von Jörg (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wieviele Drähte kommen aus deinem Motor heraus?

Genau 4.

Danke für die ausführliche Beschreibung!

Der Motor fährt mit diesem Programm hier 120 Schritte vor und dann 
wieder 120 Schritte zurück.
Allerdings kommt mir der Motor sehr laut vor. Kann man da Abhilfe 
schaffen?

Nochmals vielen Dank für die Erklärung :)

Hier noch der Programmcode



$regfile = "m16def.dat"
$crystal = 1000000
$hwstack = 10
$swstack = 10
$framesize = 10

Dim Warten As Integer
Warten = 300
Dim X As Integer


Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output

Spule1a Alias Portd.0
Spule1b Alias Portd.1
Spule2a Alias Portd.2
Spule2b Alias Portd.3

Spule1a = 1
Spule1b = 0
Spule2a = 0
Spule2b = 0



Do

If X < 120 Then
   Spule1a = 1
   Spule1b = 0
   Spule2a = 0
   Spule2b = 1
   Waitms Warten
   Spule1a = 1
   Spule1b = 0
   Spule2a = 1
   Spule2b = 0
   Waitms Warten
   Spule1a = 0
   Spule1b = 1
   Spule2a = 1
   Spule2b = 0
   Waitms Warten
   Spule1a = 0
   Spule1b = 1
   Spule2a = 0
   Spule2b = 1
   Waitms Warten
End If


If X > 120 Then
   Spule1a = 0
   Spule1b = 1
   Spule2a = 0
   Spule2b = 1
   Waitms Warten
   Spule1a = 0
   Spule1b = 1
   Spule2a = 1
   Spule2b = 0
   Waitms Warten
   Spule1a = 1
   Spule1b = 0
   Spule2a = 1
   Spule2b = 0
   Waitms Warten
   Spule1a = 1
   Spule1b = 0
   Spule2a = 0
   Spule2b = 1
   Waitms Warten
End If

Incr X

If X > 240 Then X = 0

Loop
End

von Karl H. (kbuchegg)


Lesenswert?

Spiel mal mit den Zeiten zwischen den Schritten rum.
Ist die zu lang, dann bremst du dadurch den Rotor an jeder neuen 
Position wieder ab und beschleunigst ihn wieder. Wenn die Zeit passt, 
dann werden die Spulen genau zum richtigen Zeitpunkt weitergeschaltet, 
so dass der Rotor konstant dreht. Fast so wie ein Esel, der der Karotte 
nachläuft, die man ihm mit der Angel vors Maul hält.

von Ein (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Voila, der Motor dreht.
> (wenn die Störungen durch den Motor nicht so hoch sind, dass sie den µC
> zum Abstürzen bringen)

Warum sollte der Motor Störungen produzieren. Solange der Strom immer 
schön fließen kann, entstehen keine bösen Induktionsspannungen und der 
µC bleibt am Leben.

von Jörg (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Spiel mal mit den Zeiten zwischen den Schritten rum.

Habe ich, bin jetzt auf 1ms runtergegangen, aber es ist immer noch recht 
laut.

Aber wenn ich noch weiter runter gehe, passiert gar nichts.

Also wenn ich statt

"waitms 1"
"waitus 1000" schreibe, dann fiept der Motor nurnoch. Aber rein 
theoretisch müsste es doch das gleiche sein, oder?

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:
> Karl Heinz Buchegger schrieb:
>> Spiel mal mit den Zeiten zwischen den Schritten rum.
>
> Habe ich, bin jetzt auf 1ms runtergegangen, aber es ist immer noch recht
> laut.
>
> Aber wenn ich noch weiter runter gehe, passiert gar nichts.
>
> Also wenn ich statt
>
> "waitms 1"
> "waitus 1000" schreibe, dann fiept der Motor nurnoch. Aber rein
> theoretisch müsste es doch das gleiche sein, oder?

Nö.
Wenn der falsche Hase auf der Hunderennbahn zu schnell ist, dann kommen 
die Hunde nicht mehr hinterher. Und irgendwann kennen sie sich nicht 
mehr aus, da der Hase dann von hinten kommt und sobald sie einen Schritt 
drauf zu machen ist der Hase auch schon wieder mit Volldampf weg.

Du erzeugst ein magnetisches Drehfeld. Der Magnet im inneren muss auch 
eine Chance haben, dieser Drehung zu folgen!

von Jörg (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du erzeugst ein magnetisches Drehfeld. Der Magnet im inneren muss auch
> eine Chance haben, dieser Drehung zu folgen!

Das ist klar. Aber waitus 1000 ist doch das selbe wie waitms 1, oder 
irre ich da?


Ich habe den Motor jetzt vom Vollschrittbertrieb in den 
Hlabschrittbetrieb umgestellt. Es wurde dadurch schon deutlich leiser, 
aber es ist mir immer noch zu laut.
Habe ich noch weitere Möglichkeiten, den Motor sanfter und ruhiger 
laufen zu lassen?

Ich habe gelesen das es möglich ist, das ganze mit einer Art Sinus und 
Cosinus Funktion sehr sanft laufen zu lassen, aber wie soll das 
funktionieren? Also das Prinzip ist mir schon klar, dass man sozusgen 
nicht hart ausschaltet sondern weich die Polung wechselt. Aber wie fasst 
man das in ein Programm?

von Spess53 (Gast)


Lesenswert?

Hi

> Aber wie fasst man das in ein Programm?

Gar nicht. Man benutzt einen passenden Treiber.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:
> Karl Heinz Buchegger schrieb:
>> Du erzeugst ein magnetisches Drehfeld. Der Magnet im inneren muss auch
>> eine Chance haben, dieser Drehung zu folgen!
>
> Das ist klar. Aber waitus 1000 ist doch das selbe wie waitms 1, oder
> irre ich da?

Oops. Mein Fehler. Ich hab nicht auf die Zahlen geachtet.

von Jörg (Gast)


Lesenswert?

Spess53 schrieb:
> Gar nicht. Man benutzt einen passenden Treiber.

Ok, dass klingt vernüftig. Was wäre denn ein passender Treiber?
Vllt auch einen, denn man bei den üblichen Verdächtigen wie Reichelt 
oder ähnlich bekommt.

von Spess53 (Gast)


Lesenswert?

Hi

>Ok, dass klingt vernüftig. Was wäre denn ein passender Treiber?
>Vllt auch einen, denn man bei den üblichen Verdächtigen wie Reichelt
>oder ähnlich bekommt.

Ich weiß nicht, wer alles zu deinen üblichen Verdächtigen zählt. Der 
Shop gehört bei mir mit dazu:

>http://www.watterott.com/de/Schnittstellen/Motorsteuerungen/Schrittmotor

MfG Spess

von Neugieriger (Gast)


Lesenswert?

Jörg schrieb:
> Ich habe den Motor jetzt vom Vollschrittbertrieb in den
> Hlabschrittbetrieb umgestellt.

Wie das?

von Jörg (Gast)


Lesenswert?

Neugieriger schrieb:
> Wie das?

Ich habe zwischen den 4 Schritten, mit denen ich den Motor angesteuert 
habe noch 4 Zwischenschritte hinzugefügt.

Also sind es jetzt ingesammt 8 Schritte.
Sehr anschaulich ist es hier dargestellt:

http://www.rn-wissen.de/index.php/Schrittmotoren

Unter dem Punkt "Bipolar Ansteuerung Halbschritt"




Spess53 schrieb:
> Ich weiß nicht, wer alles zu deinen üblichen Verdächtigen zählt. Der
> Shop gehört bei mir mit dazu:
>
>>http://www.watterott.com/de/Schnittstellen/Motorst...

Vielen Dank, ich habe mir mal einen bestellt und werde mich daran 
versuchen :)

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.