Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung + LPT


von Mc A. (mc_avr)


Lesenswert?

Guten Abend allerseits,

ich habe letztens von einem Kommilitonen eine alte Schrittmotorsteuerung 
(D-Step 2) bekommen. Die Steuerkarte ist Ansicht eigentlich super, denn 
sie unterstützt Voll,Halb,1/4 und 1/8 Schritt. Die Steuerkarte arbeitet 
bis zu 35V, also SPS Signale wären auch kein Problem. Die Karte besitzt 
auch zwei Betriebsmoden: 1.) interne Taktgenerierung für das Clocksignal 
2.) externe Taktgenerierung mit individueller aber maximal bis 25kHz 
Frequenz.

Die Karte habe ich mit einem Motor zum laufen gebracht, sowohl in 
Betriebsmodus 1 und 2. Für die externe Taktgenerierung habe ich einen 
Atmega8 benutzt und testweise einen Pin einfach schnell "getoggelt" 
habe.
Das Taktsignal ist ein symmetrisches Rechtecksignal mit einem Duty Cycle 
von 1/2, also 1000µS High und 1000µS Low bzw. jeweils 1ms. Bei dieser 
Frequenz hat der Schrittmotor eine, für mich angenehme ;-), Drehzahl.

NUN wollte ich den Motor mal über den LPT ansteuern und habe in VB.NET 
ein kleines Programm geschrieben was auch läuft. Um dort die gleiche 
Frequenz zu erzeugen benutze ich folgendes:
1
For i = 1 to Schritte
2
3
Out(Portadresse,Bitmuster + Clocksignal Bit)  'damit zwischen einem Pin hin und her getoggelt werden kann
4
Sleep(1) '1ms !
5
Out(Portadresse,Bitmuster)
6
Sleep(1) '1ms !
7
8
Next

Mir geht es eigentlich nur um diese 1ms. Mein Problem: Die Frequenz ist 
zu langsam d.h. die Drehzahl vom Motor passt mir nicht. Gibt es 
überhaupt eine Möglichkeit mit dem LPT auf diese 500Hz Frequenz zu 
kommen ? Muss ich das Proramm in C schreiben, damit es schneller läuft 
oder was würde hier Abhilfe schaffen ?

Bin für jeden Tipp sehr dankbar !

MfGruß,
MC_AVR

von Chris (Gast)


Lesenswert?

VB.net

Ich weiss nicht wie schnell der LPT ist aber nimm doch anstatt Sleep 
eine Schleife mit Now.Ticks.

Now ist ein DateTime-Objekt der aktuellen Systemzeit.
Zu Now.Ticks aus der MSDN

"Der Wert dieser Eigenschaft stellt die Anzahl der 
100-Nanosekunden-Intervalle dar, die seit dem 1. Januar 0001, 12:00:00 
vergangen sind
Ein einziger Tick stellt 100 Nanosekunden bzw. ein Zehntel Millionstel 
einer Sekunde dar.In einer Millisekunde sind 10.000 Ticks enthalten."

Also kannst du kürzere Wartezeiten mit beispielsweise folgendem Code 
erzeugen:
1
Ticks as Long
2
Ticks = Now.Ticks
3
Do
4
Loop Until Ticks + 5000 = Now.Ticks

Das würde dann eine Verzögerung von 500uS erzeugen.

von Chris (Gast)


Lesenswert?

Ups du musst natürlich prüfen ob der Wert größer ist nicht ob er gleich 
ist..
1
Ticks as Long
2
Ticks = Now.Ticks
3
Do
4
Loop Until (Ticks + 5000) > Now.Ticks

Erzeugt dann 0.5ms verzögerung

von Christoph (gizmo)


Lesenswert?

Ich habe mich mal registriert und hoffe ich kann jetzt auch editieren..
Bin schon müde und hab noch nen Fehler in den Code gebracht.. naja

Man muss prüfen ob Now.Ticks größer ist als Ticks + 5000 sonst läuft er 
einfach durch die Schleife ohne zu warten

Also
1
Ticks as Long
2
Ticks = Now.Ticks
3
Do
4
Loop Until Now.Ticks > (Ticks + 5000)

Nochmals entschuldigung, ich geh jetzt schlafen.

von Mc A. (mc_avr)


Lesenswert?

Danke für den Tipp Christoph !

Ich gehe ebenfalls nun schlafen  ;-).

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.