Hi brundle,
Normalerweise brauchst Du nur einen Puls an die Steuerkarte zu geben um den Motor einen Step weiter zu drehen, die Karte erledigt den Rest. Damit der Motor permanent dreht, must Du permanent Pulse geben. Die Frequenz mit der Du die Pulse gibst, bestimmt die Geschwindigkeit des Motors. Wenn die Pulse zu schnell kommen, kommt der Motor nicht mehr mit, d.h. er verliert Pulse und wir kraftlos. Ich hab die Vmax meiner Motoren einfach experimental ermittelt. (ausprobiert )
Der Trick bei der Ansteuerung von Schrittmotoren ist, diese Pulse in einem timergesteuerten Interruptprogramm zu erzeugen. Dadurch kommen die Pulse immer gleichmäßig und du brauchst im Hauptprogramm nicht auf das timing zu achten.
Als Beispiel hier mal die wichtigsten Teile aus meinen Programm. (hoffe ich hab beim Zusammenkürzen nichts wichtiges weggekürz)
Die "waitms 10" im Hauptprogramm sind nur geschätzt, keine Ahnung ob der Motor damit ruckfrei beschleunigt/bremst.
Code:
'###################################################
'              Schrittmotorsteuerung
'###################################################

$crystal = 8000000                      'Quarzfrequenz

'Konfiguration Schrittmotoren
Config Pinc.5 = Output                  'linker Schrittmotor Drehrichtung  0=links / 1=rechts
Config Pinc.3 = Output                  'linker Schrittmotor Impuls
Config Pinc.4 = Output                  'rechter Schrittmotor Drehrichtung  0=links / 1=rechts
Config Pinc.2 = Output                  'rechter Schrittmotor Impuls

' Timer0     Impulse für die Motoren
Config Timer0 = Timer , Prescale = 64
On Ovf0 Motoren                         'Bei Überlauf wird das Unterprogramm "Motoren" ausgeführt

Enable Timer0                           'Timer aktivieren
Stop Timer0                             'Timer anhalten
Enable Interrupts                       'Interrupts anschalten

'Variable
Dim Vl As Byte                          'Geschwindigkeit Linker Schrittotor
Dim Vr As Byte                          'Geschwindigkeit rechter Schrittotor
Dim Vzl As Word                         'Zähler Geschwindigkeit links
Dim Vzr As Word                         'Zähler Geschwindigkeit rechts
Dim Schrittelinks As Word               'Zähler Schritte links
Dim Schritterechts As Word              'Zähler Schritte rechts

Dim I As Byte                           'Schleifenzähler
'*************************************************************************
'               +++++++++++++ Hauptprogramm ++++++++++++++
'*************************************************************************
'
' Die Variablen Vl und Vr bestimmen die Geschwindigleit der Motoren
' je kleiner der Wert ist, desto schneller dreht der Motor
' Wie klein der Wert maximal werden darf, hängt von den Motoren,
' der Taktgeschwindigkeit der Prozessors und der Einstellung des Interrupttimers ab
' (bei mir ist Vmax=30)
' Vl bzw. Vr =0 stopt den Motor
'-------------------------------------------------------------------------

Start Timer0
   Portc.5 = 1                          'Drehrichtung der Motoren
   Portc.4 = 0

   For I = 80 To 30 Step -1             'Beschleunigen
      Vl = I
      Vr = Vl
      Waitms 10
   Next I

   Schrittelinks = 0                    'Fahren
   Do
   Loop Until Schrittelinks = 1000

   For I = 30 To 80                     'Bremsen
      Vl = I
      Vr = Vl
      Waitms 10
   Next I
   Wait 1

Stop Timer0

End                                     'end program

'*************************************************************************
'              ------------------ Subs -------------------
'*************************************************************************
Motoren:
  Timer0 = 220

  If Vl > 0 Then
     If Vzl = 0 Then
       Vzl = Vl
       If Portc.3 = 0 Then
         Portc.3 = 1
         Incr Schrittelinks
       Else
         Portc.3 = 0
       End If
     Else
       Decr Vzl
     End If
  End If

  If Vr > 0 Then
    If Vzr = 0 Then
      Vzr = Vr
      If Portc.2 = 0 Then
        Portc.2 = 1
        Incr Schritterechts
      Else
        Portc.2 = 0
      End If
    Else
      Decr Vzr
    End If
  End If
Return

'===========================================