Schrittmotor ansteuern über ein L293D Bascom

#1502390
Lesenswert?

Hallo Leute,
wie eigentlich muss ein Programm aufgebaut sein um ein Schrittmotor übe 
ein L293D an zu steuern.
Ich habe zwar hier schon einiges versucht, aber der Motor will sich 
nicht wirklich drehen, er springt nur ab und zu mal eine halbe 
Umdrehung.
Kann da jemand weiter helfen ?

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



Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1

Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0

Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0

Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
#1502434
Lesenswert?

Versuchs mal mit


do

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

Loop

Wenn keine Drehung zustande kommt, dann sind noch einzelne Zustände 
falsch.

Die Blöcke müssen dann ggf. getauscht werden.

Sonst die Wartezeiten schrittweise reduzieren.

Viel Erfolg

W.
#1503091
Lesenswert?

Hallo Leute,
ach so wartezeiten, danke erst mal, habe den mega erst mal auf 1Mhz 
zurück gesetzt und nun jedes mal 2 ms wartezeit zwischen .
Zuerst ging nun mal wieder auch nichts, aber nur deswegen weil wohl der 
L293d eine kleine Macke hat, nun dreht er sich ;)

Wie aber mache ich das er nur bestimmte Schritte weit sich ansteuern 
lässt, wie muss ich da vor gehen ? mit rechts und links denke ich mal 
brauche ich ja die reihenfolge nur ändern.

Gruß Micha
#1517237
Lesenswert?

Hallo Leute,
nun habe ich ein Schrittmotor über ein zusammengestelltes programm 
bestimmte schritte zum laufen bekommen, 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.
woran kann das liegen, kann da jemand helfen was dieses sein kann.

gruß micha

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

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
Waitms 50
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
#1518152
Lesenswert?

Hallo Gerhrad,
##Wieso fragst Du nicht Dino?##

das kannst du ja im Forum nachlesen, oder ist es so schlimm wo anders 
auch noch nach Meinungen zu fragen.
Ich weis schon, das sich alle User, entweder in AVR-Praxis oder in 
Bascom AVR Microcontroller oder RoboterNetz oder oder, umsehen.

Wen ich das verbergen wollte, hätte ich mich bestimmt nicht hier und 
dort mit dem gleichen Namen und Anschrift angemeldet, oder.

Hallo Axel,
na mal sehen was sich da machen lässt.

MFG
#1530595
Lesenswert?

Hi Micha,

fahr den motor im interrupt, einen timer proggen der alle paar ms oder 
so
je nach geschwindigkeit einen int. ausloest, dort fahrst du dann
einen schritt und wieder raus, dann stockt u.U. die LCD ausgabe etwas
aber der motor laeuft rund,

ps prozessor vom takt her wieder hochschalten

frohes fest an alle

vlg
Charly

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren