PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gibt's hier auch VB 5 Xor 6 user?



K Z
14.12.2004, 22:17
Hallo Forum,

wollte nur fragen, ob ich Fragen betreffend VB 5 oder 6 in diesem Forum stellen kann. Oder ob es auch andere Foren gibt, die sich mit Stepper Motoren steuerung unter VB beschäftigen.

Mit freundlichen Grüssen

KZ


PS

WOW! Bin jetzt Stammitglied .... das geht ja sehr schnell :shock: Bin ich dann Übermorgen ein Robogenie????? Bitte bitte bitte ....

Trabukh
14.12.2004, 22:20
VB allgemein ist hier recht gut vertreten, da die GUIs für die Botsteuerungen damit relativ einfach zu bewerkstelligen sind. Kommt also immer auf deine Frage an, versuch's einfach...

Gruß, Trabukh

P.S.
Ich würde generell immer erst hier Fragen, wenn es um Hardware geht. Sollte das nichts bringen, probier's hier: http://foren.activevb.de/cgi-bin/foren/list.pl?forum=10

K Z
18.12.2004, 07:34
Hallo Forum!

Ich versuche jetzt ein Programm in VB5 zu schreiben, mit dem ich für L297/L298 Schaltung die PWM einstellen kann. In dieser Phase möchte ich einen bipolaren Schrittmotor (400 steps pro Sekunde) per RS232 (Windows 98 ) steuern. Da ich mit Elektronik und Programmieren erst anfange, wollte ich um einige Tips mal fragen. Ich habe einige Versuche schon begehen, aber ohne Erfolg.

Ich habe mich auch hier im Forum umgesehen, aber das was ich gefunden habe, entspricht irgendwie nicht dem VB.

Also, wenn mir bitte jemand sagen könnte, wie ich ein VB Code für PWM schreiben kann, wäre ich sehr froh.

Besten Dank voraus

KZ

BlueNature
18.12.2004, 08:02
Hallo K Z!

Ich kann VB60 sehr gut und arbeite damit auch viel. Das mit der Steuerung eines Motors ist in den Grundsignalen die relativ langsam wechseln recht einfach. Das mit dem PWM-Signal ist aber so eine Sache. PWM bedeutet Puls-Weiten-Modulation. Das wirst du mit VB nur schlecht hinbekommen da es sehr zeitkritisch ist. Du müsstest tausende Mal pro Sekunde genau definierte '1'- und '0'-Pegel per Software generieren was ich für absolut unsinnig halte und nur deine Software endlos ausbremst bzw. diese gar nicht mehr schaffen wird. Es wäre wesentlich sinnvoller das PWM-Signal aus einer Hardware-Schaltung zu nehmen und per Port vom Recher anzusteuern. Was ich nicht ganz verstehe ist, wofür brauchst du für eine Stepper-Steuerung ein PWM-Signal?!?
Entweder man macht es über Up/Down und Step oder man steuert die Phasen direkt an, spart einen IC.
Aber wenn du das wirklich über den PC machen willst, dann verstehe ich nicht warum du nicht einen kleinen Microcontroller nimmst, dem bisschen Programm verpasst und den nur noch mit dem Sollwert fütterst und der die gesamte Rechenleistung dafür abnimmt. Dann hat dein Rechner den Kopf frei für wichtigere übergeordnete Sachen...

Grüsse Wolfgang

K Z
18.12.2004, 08:39
Hallo Wolfgang!

Ich habe mich wahrscheinlich falsch ausgedrückt. Ein PWM habe ich schon bei der Schaltung festgelegt (glaube ich). Es ist 20kHz. Das sind 0,05ms wenn ich mich nicht irre. Nun wollte ich irgendwie die Low und High-Phase so einstellen/modulieren, das ich die benötigen 400 Schritte pro Sekunde hinkriege (damit ich Leistung heraushole, nicht die Schnelligkeit). Nachdem ich es hier im Forum irgendwo gelesen habe, habe ich geglaubt, dass das man mit Software einstellen kann.

Mit freundlichen Grüssen

KZ

K Z
18.12.2004, 08:43
Den Beitrag habe ich jetzt gefunden:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=14301#14301

KZ

Edit

Hat Frank Verfasst am: 19.05.2004, 20:13

/Edit

BlueNature
18.12.2004, 09:31
Hallo Wolfgang!

Ich habe mich wahrscheinlich falsch ausgedrückt. Ein PWM habe ich schon bei der Schaltung festgelegt (glaube ich). Es ist 20kHz. Das sind 0,05ms wenn ich mich nicht irre. Nun wollte ich irgendwie die Low und High-Phase so einstellen/modulieren, das ich die benötigen 400 Schritte pro Sekunde hinkriege (damit ich Leistung heraushole, nicht die Schnelligkeit). Nachdem ich es hier im Forum irgendwo gelesen habe, habe ich geglaubt, dass das man mit Software einstellen kann.

Mit freundlichen Grüssen

KZ

Die Volle Leistung bei PWM holt man sich damit heraus das man das PWN auf Dauer High-Pegel legt. Dann brauchst du keinen PWM-Generator mehr oder IC der das kann.

Grüsse Wolfgang

K Z
18.12.2004, 10:00
OK,

also deiner Meinug nach, soll genügen, wenn ich die PWM fest (oder einstellbar mit Poti) setze und dann nur die Schritte per Software betätige (Pin Low/High)?

MfG

KZ

BlueNature
18.12.2004, 10:21
OK,

also deiner Meinug nach, soll genügen, wenn ich die PWM fest (oder einstellbar mit Poti) setze und dann nur die Schritte per Software betätige (Pin Low/High)?

MfG

KZ

Den Poti kannst du auch vergessen. PWM ist kein analoger Wert! Wenn man PWM auf '1' legt entspricht das maximalem Wert und wenn man es auf '0' legt ist es der minimale Wert. Dazwischen muss geschalten werden, eben PWM. Permanent mit hoher Frequenz (konstant) die '1' und '0' im Verhältniss zueinander erzeugen. Aber das hast du ja nicht. PWM hat ein normaler Microcontroller bereits schon, aber wenn du eh nur maximale Leistung fahren willst? Die Drehzahl ändert man mit PWM nicht! Nur den Drehmoment (bei Schrittmotoren). Am besten du baust dir die Schalung erst einmal auf und probierst so herum. Learn by doing. Dann Software dafür entwickeln ;)

Grüsse Wolfgang

K Z
18.12.2004, 12:30
Oki Wolfgang

mal schauen, wo ich falsch liege.

Auf der Schaltung https://www.roboternetz.de/bilder/schaltungstep298.gif ist R3 und C3 (sog. RC glied) Hier im Ausschnitt rot gerahmt. Das gibt dem Oszilator auf dem L297 die Periodendauer. In meinem Fall ist es 0,000050094 Sekunden lange Periode. Das ist ~ 20 kHz. Das habe ich also als PWM begriffen. Weiters habe ich gedacht, wenn ich den Pin 18 "CLOCK" High und Low setze, kriege ich einen Schritt von dem bipolaren Schrittmotor.

So funktioniert es also nicht?

MfG

KZ

BlueNature
18.12.2004, 13:26
Hallo K Z!

Diese Schaltung (L297) ist die Ansteuerschaltung zur Schrittmotor-Endstufe (L298). Dieses RC-Glied ist wie du schon gemerkt hast für eine Frequenz zuständig. Das ist für die quasi-PWM-Ansteuerung. Bei der Schaltung kommt kein PWM von extern sondern der L297 erzeugt sich über Schaltschwellen ein optimales dem Motorstrom angepasstes PWM in enstprechender Pulsbreite. Dafür braucht er die beiden 0,5R-Widerstände. Das sind die Stromsensoren oder auch Shunts genannt. Den Stromsollwert stellst du über R1 (10k) ein. Das einzigste was du tun musst ist Enable (Motor wird "bestromt") auf High zu legen und dann deine Richtung vorzugeben. High ist die einer Richtung und Low die andere. Mit Clock machst du nun jeweils einen Schritt in die angegebene Richtung. Du kannst auch den Halbschritt oder Vollschrittmodus auswählen. Dazu ist der Jumper VOLL/HALB gedacht. Normal reicht es wenn du auf Fullstep gehst. Mit Halfstep hast du doppelte Schrittzahl je Umdrehung am Motor und auch damit halbe Geschwindigkeit. Wenn du einen genauen Motor brauchst schaltest du also auf Halfstep und wenn du einen schnellen Motor brauchst auf Fullstep. Ich hoffe das war verständlich geschrieben.

Grüsse Wolfgang

K Z
18.12.2004, 14:09
Hallo Wolfgang!

Danke für die Ergänzung. Irgendwie so habe ich es mir gedacht, nachdem ich all mögliche Beiträge hier im Forum gelesen habe (sicher aber nicht alle). Damit ist die PWM über Software also gegessen (Halleluja! brauche ich mich mit PWM Software nicht beschäftigen). Kannst Du mir vieleicht sagen, wie ich jetzt meinen Bipolar zur maximal 400 Schritte pro Sekunde bringe?

Ich habe mir folgende "Routine" gedacht:
1. ENABLE ON 'starte die Schaltung
2. CW/CCW 'setze die Direction = entweder / oder
3. CLOCK 'mache ich gewünschte anzahl der Schritte
4. ENABLE OFF 'schalte die Schaltung aus

Dazwischen gibt's natürlich ein Haufen If...Then...Else und so ein Zeug 8-[

Ein Detail das mich bissl beunruhigt is die 3. Phase "CLOCK". Da ich wegen den maximalen 400 Schritte nicht sicher bin, ob ich es so tuen kann:

For bla bla bla
Pin 18 High
Pin 18 Low
TIMEREAD oder so ein Zeug 'warte 2,5ms
Next until die gewünschte anzahl der Schritte eintritt
bla bla bla

Ist das so einfach, dass ich nur High Signal zu dem Pin sende und gleich einen Low Signal? Muss der High Signal nicht eine Weile dauern? In meinem Fall 2,5 ms (2,5=1000/400) da ich die lästigen 400 Schritte pro Sekunde brauche. Oder einfach so hinhauen High und gleich danach Low und erst dann die Wartezeit? Und wenn ich den Wave Drive benutzen will, muss ich irgendwie (aber wie???) die ungeraden Nummern betätigen (Siehe den Bild unten). Hat das was mit der Bite-länge zu tun?

Mit freundlichen Grüssen

KZ

PS
musste den Beitrag editieren, da ich ein Haufen Fehler reingetippt habe. Ich habe nähmlich festgestellt, dass mir der Verkäufer statt 10k nur 1k Widerstände verkauft hat Grrrrrr @&&#@}{}{ wo soll ich jetzt am Samstag neue kaufen?

K Z
28.12.2004, 16:29
Hallo Forum,

wie das so aussieht, so einfach ist es mit bla bla Pin High, Pin Low bla bla auch wieder nicht. Mommentan bin ich auf dem Warteinterval stehengeblieben. Da ich vor habe nur bestimmte anzahl der Schritte durchzuführen wollte ich es über For...Next machen. Da ich aber den Pin nicht lange offen haben will wollte ich TIMEREAD dazugeben, damit ich Pin High setze und dann wieder Low, dann warte ich ne Weile ca 3ms und dann wieder von vorne. Tja ich kriege es halt einfach nicht rein :-( . Bis jetzt habe ich das so geschrieben:

Private Sub Command1_Click()
For i = 0 To (Text1.Text) Step 1
Picture1.BackColor = RGB(255, 255, 255)
Picture1.BackColor = RGB(255, 0, 0)
TIMEINIT
While TIMEREAD = Val(Text2.Text)
DoEvents
Wend
If i = (Text1.Text) Then Exit For
Next i
End Sub


Wo: Text1 ist anzahl der Schritte und Text2 soll die Wartezeit festlegen. Kann mir da vielleicht jemand weiterhelfen?

MfG

KZ

BlueNature
28.12.2004, 18:11
Private Sub Command1_Click()
For i = 0 To (Text1.Text) Step 1
Picture1.BackColor = RGB(255, 255, 255)
Picture1.BackColor = RGB(255, 0, 0) <== unsinnig, da doppelt
TIMEINIT
While TIMEREAD = Val(Text2.Text) <== ">=" verwenden!
DoEvents
<== hier passiert kein Output!!!
Wend
If i = (Text1.Text) Then Exit For <== ebenfalls ">=" verwenden!
Anstatt Exit For auch evtl Exit Sub?
Next i
End Sub

K Z
28.12.2004, 19:44
Hallo BlueNature!

Danke für die Hilfe.


Private Sub Command1_Click()
For i = 0 To (Text1.Text) Step 1
Picture1.BackColor = RGB(255, 255, 255)
Picture1.BackColor = RGB(255, 0, 0) <== unsinnig, da doppelt
TIMEINIT
While TIMEREAD = Val(Text2.Text) <== ">=" verwenden!
DoEvents
<== hier passiert kein Output!!!
Wend
If i = (Text1.Text) Then Exit For <== ebenfalls ">=" verwenden!
Anstatt Exit For auch evtl Exit Sub?
Next i
End Sub

Die Farben habe ich anstatt dem DTR Zustand genommen. Vorerst aufm Trockenen schwimmen lernen :-) . Deswegen sind die Farben zwei - einmal für DTR 0 und einmal DTR 1.
Zu der Angelegenheit ">=" man lernt immer.
Und was DoEvents betrifft, was für ein Output? Ich dachte, das ich damit halt die Verzögerung "reinkriege". Nachedem sich die Farben gewechselt haben, wird bestimmte Zeit verlaufen und dann geht es wieder los .... oder nicht?
Exit Sub und CloseComm habe ich mit dem Command2 gelöst. Ich habe es nicht mitkopiert.

MfG

KZ

K Z
28.12.2004, 21:02
Tja, ich glaube, ich habe es. Nur meine Hoffnung, dass die Intervalle gleichmässig werden wenn ich DELAY und Timer1.Interval vermeide, ist geplatzt. Diese REALTIME Angelegenheit unter Win ist halt Pech.

Hier ist mal die Routine:



Private Sub Command1_Click()
For i = 1 To Val(Text1.Text) Step 1
DTR 1
TIMEINIT
While TIMEREAD() < Val(Text2.Text)
DoEvents
DTR 0
Wend
If i >= Val(Text1.Text) Then Exit For
Next i
End Sub


Ja und doch noch eine Sache. Wenn jemand einen Tip haben würde, wie ich die Routine auch während der Ausführung stoppen könnte, wäre das hilfreich. Mommentan muss ich halt warten, bis die eingestellten Zeiten abgelaufen sind.

MfG

KZ

BlueNature
28.12.2004, 21:19
Hallo K Z!

Du kanst dir mehr von der Zeischeibe deines Windows krallen mit einer API. Dann geht alles auf Prio 1, deine Maus läuft nicht mehr und alles geht sehr schnell in deinem Programm. Ist aber sicher nicht die feine Art.

Ich weis eigentlich nicht warum du deine Zeitintervalle in einer anderen Sub machst. Ich würde an deiner Stelle die Impulse im Haupt-Sub erzeugen. Da mit Zeitschelifen arbeiten die mit DoEvent bestücken und dann deine anderen Aktionen die du überwacht haben willst wie z.B. Tastatur, Objekte zum klicken etc. mit DoEvents ausführen lassen das die nicht blocken zur Laufzeit deiner Haupt-Sub.

Zudem würde ich an dener Stelle ein Ist-Wert und einen Soll-Wert anlegen als Variable und diese vergleichen. Wenn ein Impuls rausgeht für Increment je nach Richtungsanwahl deinen Ist-Wert incrementieren oder decrementieren. Dann eine Schleife für die Zeitkonstante und die Impulse und das auf Soll / Ist auswerten. Dann kanst du per Soll-Wert eine Position anfahren und dein Ist-Wert läuft synchron mit bis die Soll-Position erreicht ist.

Grüsse Wolfgang

30.12.2004, 08:52
Hallo Wolfgang!

Danke für Deine Hilfe.

Diese Soll - Ist Angelegenheit habe ich mir auch schon überlegt. Ich wollte es mit Start, Finish, TotalTime abwickeln (siehe Code).



Private Sub Command1_Click()
Start = Timer
'a-----------------------------------------
TIMEINIT
While TIMEREAD() < Val(Text2.Text) / 10
DoEvents
'DTR 0
Picture1.BackColor = RGB(255, 255, 255)
Wend
'b-----------------------------------------
TIMEINIT
While TIMEREAD() < Val(Text2.Text) / 10
DoEvents
'DTR 1
Picture1.BackColor = RGB(255, 0, 0)
Wend
'c-----------------------------------------
TIMEINIT
While TIMEREAD() < Val(Text2.Text) / 10
DoEvents
' If CHKBOX1.true Then
' RTS 0
' Else
' RTS 1
' End If
Picture1.BackColor = RGB(0, 0, 255)
Wend
'd-----------------------------------------
For i = 1 To Val(Text1.Text) Step 1
TIMEINIT
While TIMEREAD() < 2
DoEvents
'TXD 1
Picture1.BackColor = RGB(0, 100, 100)
Wend
TIMEINIT
While TIMEREAD() < 5
DoEvents
'TXD 0
Picture1.BackColor = RGB(100, 100, 100)
Wend
If i >= Val(Text1.Text) Then Exit For
Next i
'e----------------------------------------
TIMEINIT
While TIMEREAD() < Val(Text2.Text) / 10
DoEvents
'DTR 0
Picture1.BackColor = RGB(255, 255, 0)
Wend
'f-----------------------------------------
Finish = Timer
TotalTime = Finish - Start
TIMEINIT
While TIMEREAD() < Val(Text2.Text) - TotalTime
DoEvents
'DTR 0
Picture1.BackColor = RGB(0, 0, 0)
Wend
Print "TotalTime"; TotalTime
End Sub


Tja, das was Du weiter geschrieben hast, verstehe ich aber nicht so ganz:


Ich weis eigentlich nicht warum du deine Zeitintervalle in einer anderen Sub machst. Ich würde an deiner Stelle die Impulse im Haupt-Sub erzeugen. Da mit Zeitschelifen arbeiten die mit DoEvent bestücken und dann deine anderen Aktionen die du überwacht haben willst wie z.B. Tastatur, Objekte zum klicken etc. mit DoEvents ausführen lassen das die nicht blocken zur Laufzeit deiner Haupt-Sub.


Soll das heissen, ich soll das nicht unter Command abwickeln, sonder unter Form?
Und das mit DoEvents geht leider bei mir total daneben.

MfG

KZ

K Z
30.12.2004, 08:56
Ups, I did it again...

war nicht eingeloggt, sorry

KZ