Schrittmotor über ein L293D ansteuern

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
was muss ich anstellen, um den Motor bestimmt Schritte nur laufen zu lassen.
So wie das Programm ist läuft der Motor kontinuierlich durch, funktioniert so weit.
hat jemand so etwas schon gemacht, oder hat jemand ein Programm wo man dieses ersehen kann.

Gruß Micha

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

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

Do

Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Waitms 3
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Waitms3
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Waitms 3
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Waitms 3


Loop
End
 
Hi Micha,

Hallo Leute,
was muss ich anstellen, um den Motor bestimmt Schritte nur laufen zu lassen.
So wie das Programm ist läuft der Motor kontinuierlich durch, funktioniert so weit.
hat jemand so etwas schon gemacht, oder hat jemand ein Programm wo man dieses ersehen kann.

30 Schritte vor und dann Stop ... ;)


Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Waitms 3
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Waitms3 ...
Das würde ich über ne Tabelle machen ...



CodeBox Tabelle

Schritt PB0 PB1 PB2 PB3
--0-- 1 0 0 1
--1-- 1 0 1 0
--2-- 0 1 1 0
--3-- 0 1 0 1

Die Schritte sind von 0..3 Also lassen sich die mit 2 Bit darstellen ...
-0- 00
-1- 01
-2- 10
-3- 11
diese 2 Bits sind die untersten deines Schrittzählers.

Wenn du also einen 8Bit-Zähler hast dann benutzt du Bit 0 und 1 als Zeiger
auf diese Tabelle mit den Werten, die du für das Ansteuer-Muster deines
Motors brauchst ... verstanden ?

Also 8Bit-Zähler --> Bit0/1 (0,1,2,3) --> Tabelle(Pointer/Index) --> Muster(PB0..3)

Gruß
Dino
 
Hallo Dino,
hm, sorry, nicht gans verstanden, kannst das noch bissel anders erklären für Doo...:fie:

Gruß Micha
 
Also ...
sagen wir mal du hast nen Zähler für die Schritte ... der ist ja irgendwie binär
im Atmel drin ... also entweder 8Bit oder 16Bit oder ...

Von dem Zähler nimmst du nur die unteren zwei Bits. Das wär so als ob du von
ner Dezimalzahl (zb 23654) nur die Einer nimmst (in dem Beispiel die 4).

Mit diesen beiden Bits kann man die Werte von 0..3 darstellen. Also 4 Werte.

Deine Muster für die Ansteuerung der Schrittmotor-Spulen sind genau 4 Stk.

Diese 4 Muster baust du in ne Tabelle/Array/... (oder sowas)
Also hat deine Tabelle mit den Ansteuermustern 4 Zeilen.

wenn man das jetzt mal ausführt ...

Zähler -> Tabellenzeile -> Muster
0 - 0 - 1001
1 - 1 - 1010
2 - 2 - 0110
3 - 3 - 0101
4 - 0 - 1001
5 - 1 - 1010
6 - 2 - 0110
7 - 3 - 0101
8 - 0 - ...
...
255 - 3 - 0101
256 - 0 - 1001
257 - 1 - 1010
258 - 2 - ...
...
..
.

Und wenn du den Motor vorwärts oder rückwärts bewegen willst, dann
machst du bei dem Zähler +1 oder -1

die beiden untersten Bits kann man mit ner UND-Verknüpfung ausmaskieren ...
Also 254 (0b11111110) UND 3 (0b00000011) = 2 (0b00000010)

etwas klarer ? ;)

die Lösung ist nicht sonderlich elegant aber dafür einfach und funktionsfähig :D

Gruß
Dino
 
Hi dino,
habe mal schnell was zusammengefügt, meinst du in etwa das ganze so.
funktioniert leider nicht :mad:

Gruß micha

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

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

Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input

Tast1 Alias Pind.0
Tast2 Alias Pind.1
Tast3 Alias Pind.2

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1 '


A1 Alias Portb.0
B1 Alias Portb.1
A2 Alias Portb.2
B2 Alias Portb.3

Dim Schrittarray(4) As Byte

Schrittarray(1).1 = 1
Schrittarray(1).2 = 0
Schrittarray(1).3 = 0
Schrittarray(1).4 = 1

Schrittarray(2).1 = 1
Schrittarray(2).2 = 0
Schrittarray(2).3 = 1
Schrittarray(2).4 = 0

Schrittarray(3).1 = 0
Schrittarray(3).2 = 1
Schrittarray(3).3 = 1
Schrittarray(3).4 = 0

Schrittarray(4).1 = 0
Schrittarray(4).2 = 1
Schrittarray(4).3 = 0
Schrittarray(4).4 = 1

Dim Sti As Word
Declare Sub Schrittvor()
Declare Sub Schrittzurueck()
Declare Sub Motoraus()

Dim Schrittindex As Integer
Schrittindex = 0

Do

Debounce Tast1 , 0 , Schrittvor , Sub
Debounce Tast2 , 0 , Motoraus , Sub
Debounce Tast3 , 0 , Schrittzurueck , Sub

Loop
End



Sub Schrittvor()
For Sti = 1 To 4
Incr Schrittindex
If Schrittindex > 4 Then
Schrittindex = 1
End If
A1 = Schrittarray(schrittindex).1
B1 = Schrittarray(schrittindex).2
A2 = Schrittarray(schrittindex).3
B2 = Schrittarray(schrittindex).4
Waitms 250
Next Sti
End Sub

Sub Motoraus()
A1 = 0
B1 = 0
A2 = 0
B2 = 0
End Sub

Sub Schrittzurueck()
For Sti = 1 To 4
Incr Schrittindex
If Schrittindex > 4 Then
Schrittindex = 1
End If
A1 = Schrittarray(schrittindex).4
B1 = Schrittarray(schrittindex).3
A2 = Schrittarray(schrittindex).2
B2 = Schrittarray(schrittindex).1
Waitms 250
Next Sti
A1 = 0
B1 = 0
A2 = 0
B2 = 0
End Sub
 
doch es scheint sich etwas zu tun, aber der Motor macht nur kleine kurze Schritte wen ich den Taster drücke ruckt er nur 4 mal in die eine Richtung, es geht aber auch in die andere, aber keine vollen Drehungen.

Gruß Micha
 
Hi Micha,

doch es scheint sich etwas zu tun, aber der Motor macht nur kleine kurze Schritte wen ich den Taster drücke ruckt er nur 4 mal in die eine Richtung, es geht aber auch in die andere, aber keine vollen Drehungen.
soll er ja auch nicht ;)

Tastendruck = 1 Schritt vorwärts (oder rückwärts)

du machst im Moment noch 4 Schritte pro Tastendruck.
Aber das ist der erste Umsetzungsschritt ... Du hast dein Steuermuster in
einer Tabelle. Wie man das jetzt genau in Bascom macht ... :confused:

Also mußt du bei deiner unteren Schleife (for STi = 1 to 4) auch nur einen
weiter gehen.

Wie willst du es machen, wenn der Motor 300 Schritte rechts rum drehen soll ?

also 75 mal 4 Schritte ...

Und wie machst du es, wenn er 10 Schritte machen soll ?
Also 2x 4 Schritte und nochmal 2 Schritte drauf ?

Evtl bringt dich die PN ja weiter ...
Sonst muß ich mal mein Grafik-Tablett anschmeißen (morgen abend oder so)

Gruß
Dino
 
ich versuch mich mal im Quellcode :rolleyes: :eek: (auweia .. wenn das man gut geht ..)


CodeBox BASCOM

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

' === Deine Portdefinition für den Stepper ===
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

' === Taster - nehm ich mal an ===
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input

Tast1 Alias Pind.0
Tast2 Alias Pind.1
Tast3 Alias Pind.2

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1 '

' === Die Phasen-Anschlüsse des Steppers - Definition ===
A1 Alias Portb.0
B1 Alias Portb.1
A2 Alias Portb.2
B2 Alias Portb.3


' === Die Tabelle mit dem Steuermuster ===
Dim Schrittarray(4) As Byte

' === Schritt 1 ===
Schrittarray(1).1 = 1
Schrittarray(1).2 = 0
Schrittarray(1).3 = 0
Schrittarray(1).4 = 1

' === Schritt 2 ===
Schrittarray(2).1 = 1
Schrittarray(2).2 = 0
Schrittarray(2).3 = 1
Schrittarray(2).4 = 0

' === Schritt 3 ===
Schrittarray(3).1 = 0
Schrittarray(3).2 = 1
Schrittarray(3).3 = 1
Schrittarray(3).4 = 0

' === Schritt 4 ===
Schrittarray(4).1 = 0
Schrittarray(4).2 = 1
Schrittarray(4).3 = 0
Schrittarray(4).4 = 1

Dim Sti As Word
Declare Sub Schrittvor()
Declare Sub Schrittzurueck()
Declare Sub Motoraus()

Dim Schrittindex As Integer
Schrittindex = 0

Dim zaehler As Integer
zaehler = 0

Do

' === Und hier muß sowas rein wie ...
' zaehler +1 oder -1 (je nach Tastendruck)
' und danach DinoStep aufrufen


' Debounce Tast1 , 0 , Schrittvor , Sub
' Debounce Tast2 , 0 , Motoraus , Sub
' Debounce Tast3 , 0 , Schrittzurueck , Sub

Loop
End


' ##### Dinos Stepper #####
Sub DinoStep(zaehler)

' == MODULO(4) per Hand ;-) ==
schrittindex = zaehler - ( int(zaehler/4) * 4 )

' == Steuermuster ausgeben ==
A1 = Schrittarray(schrittindex).1
B1 = Schrittarray(schrittindex).2
A2 = Schrittarray(schrittindex).3
B2 = Schrittarray(schrittindex).4

' == und meinetwegen noch warten ==
Waitms 250
End Sub


Viel Spaß ;)
 
Das Grafiktablett

Hallo,

nun hab ich mal das Grafiktablett mit ein paar Krickeleien bearbeitet :D

Im ersten Bild ist zu sehen was ich mit dem 16Bit-Zähler machen will.
Stepper_1.jpg
Der Zähler stellt die aktuelle Stellung der Motor-Achse in Schritten dar.
Der Motor im Beispiel hat 16 Schritte pro Umdrehung. Beim 17en Schritt ist
der Motor bereits in der 2ten Umdrehung. Im Beispiel könnte man also im
16Bit-Zähler ( 65536Zählerwerte / 16Schritte/Umdr. = 4096 Umdrehungen)
4096 Umdrehungen mit allen Zwischenstellungen (zB 856,25 Umdrehungen)
darstellen.


Im zweiten Bild ist die Steuertabelle ("schrittarray") zu sehen.
Stepper_2.jpg
Die Tabelle hast du jetzt ja bereits in Verwendung. Wenn man die Tabelle in
positiver Richtung durcharbeitet (012301230123...) dann dreht der Motor
schrittweise vorwärts und wenn man die Tabelle in negativer Richtung
(321032103210...) durcharbeitet dann dreht der Motor rückwärts. Eine
Tabellenzeile weiter bedeutet beim Motor einen Schritt weiter.


Im dritten Bild ist zu sehen wie man das beides kombiniert.
Stepper_3.jpg
Der 16Bit-Zähler stellt die Position der Achse dar und die Tabelle die Signale
für die Motorsteuerung. Wenn man die unteren beiden Bits aus dem Zähler
herauslöst, dann kann man die für die Adressierung der Zeile in der Tabelle
verwenden. Wenn der Zähler nach 4096 Umdrehungen überläuft (65535->0)
dann geht es einfach weiter ohne das was kaputt geht. Aber wer braucht
4096 Umdrehungen ;)


Und hier das vierte Bild
Stepper_4.jpg
Entweder man extrahiert die unteren beiden Bits über eine UND-Verknüpfung
mit einer Maske (so wie bei der IP-Adresse und der Netzmaske) oder man
arbeitet mit der Modulo-Operation.


Also wird mit einem Tastendruck der 16Bit-Zähler entweder incrementiert (+1)
oder decrementiert (-1). Also einen Schritt vor oder zurück. Mit den beiden
unteren Bits holt man sich die entsprechende Steuerzeile aus der Tabelle
"schrittarray" für die Ansteuerung des Motors. Der 16Bit-Zähler und die
Steuertabelle sind also über diese beiden Bits gekoppelt und laufen synchron
durch (vorwärts und rückwärts).

- - - - - - - - - - -

EDIT: Das ist vergleichbar mit der Ansteuerung von 7Segment-Anzeigen.
Man hat eine Tabelle mit den Segment-Mustern für die Ziffern 0 bis 9.
Dann holt man sich aus einer Zahl (zB 593) die entsprechende Stelle
(zB die Einer -> also die 3) . Mit dieser Ziffer adressiert man in der Tabelle
die Zeile mit dem Segmentmuster der Ziffer 3 (also Zeile 3) und gibt das
Muster an die Ausgangspins.

Der einzige Unterschied ... bei den 7Segment-Anzeigen arbeitet man im
Dezimalsystem und beim Schrittmotor im Binärsystem.

Gruß
Dino
 
Hi Michael,

Tatah - welcome to the club. Sieht schon mal ganz gut aus.:trytofly:
naja ... eigentlich hab ich ja nur ne Menge "Copy-and-Paste" gemacht und
bereits geschriebenes modifiziert :D :eek: :rolleyes:

Also sozusagen die Logik die ich von anderen Sprachen kenne mit der Syntax
des geschriebenen Programms kombiniert. Kein Hexenwerk ;)

Gruß
Dino
 
Hallo Leute,
da ich das nicht so schnalle wie das dieno mir bei bringen wollte, habe ich es nun erstmal noch anders versucht, vielleicht kommt es ja später.

Nun geht es schon einmal bestimmte Schritte, der Motor schnurrt super und
schnell, aber, so wie ich etwas auf dem LCD Display ausgebe, egal ob es
die zeit ist oder irgend was anderes, läuft der Motor als würde er nur
noch die Hälfte an Geschwindigkeit haben und rattert auch, läuft nicht
mehr flüssig da hin,
blockiert das LCD die ausgabe und wird das Programm dadurch so langsam !?

Woran kann das liegen, kann da jemand helfen was dieses sein kann.

Gruß micha

$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 128

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Initlcd
Cursor Off Noblink
Cls


'##### Deine Portdefinition für den Stepper #####

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

Config Portb.4 = Output '##### Motor an #####

Config Portd.0 = Input
Config Portd.1 = Input


Tast1 Alias Pind.0
Tast2 Alias Pind.1

Portd.0 = 1
Portd.1 = 1

A1 Alias Portb.0 '##### Die Phasen-Anschlüsse des Steppers #####
B1 Alias Portb.1
A2 Alias Portb.2
B2 Alias Portb.3

Motor Alias Portb.4 '##### motor an oder aus #####



Dim Schrittarray(4) As Byte

Schrittarray(1).1 = 1 '##### Tabelle mit dem Steuermuster #####
Schrittarray(1).2 = 0
Schrittarray(1).3 = 0
Schrittarray(1).4 = 1

Schrittarray(2).1 = 1
Schrittarray(2).2 = 0
Schrittarray(2).3 = 1
Schrittarray(2).4 = 0

Schrittarray(3).1 = 0
Schrittarray(3).2 = 1
Schrittarray(3).3 = 1
Schrittarray(3).4 = 0

Schrittarray(4).1 = 0
Schrittarray(4).2 = 1
Schrittarray(4).3 = 0
Schrittarray(4).4 = 1

Declare Sub Motorstep
Declare Sub Motoraus

Dim Sti As Word
Dim Schrittindex As Integer
Dim Zaehler As Integer
Dim Status As Byte

Config Timer1 = Timer , Prescale = 256
Const Timerwert = 31250
Timer1 = 34286

Enable Timer1
On Timer1
Enable Interrupts

Config Clock = Soft
Time$ = "08:55:55"


Schrittindex = 0
Zaehler = 0
Motor = 0

Do

Locate 1 , 1
Lcd Time$

If Tast1 = 0 Then
Incr Status
If Status > 1 Then
Status = 0
Else
Status = 1
End If
End If

If Status = 0 Then
Motor = 1
Call Motorstep

If Zaehler = 200 Then
Call Motoraus
Motor = 0
Status = 1
Zaehler = 0
End If
End If

Loop
End




Sub Motoraus()
A1 = 0
B1 = 0
A2 = 0
B2 = 0
End Sub



Sub Motorstep
For Sti = 1 To 4
Incr Schrittindex
If Schrittindex > 4 Then
Schrittindex = 1
Incr Zaehler

End If

A1 = Schrittarray(schrittindex).1
B1 = Schrittarray(schrittindex).2
A2 = Schrittarray(schrittindex).3
B2 = Schrittarray(schrittindex).4

Waitms 3

Next Sti


End Sub
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)