PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM erzeugen über VB (LPT)



WerWolf2009
18.09.2008, 16:17
Hallo,

ich bin es mal wieder und liege fast auf den Boden mit dem Bedürfniss, meinen Kopf gegen die Heizung zu hauen.

Der Servo Motor (ModelCraft Top Line mini servo ES-05 JR ; siehe COnrad für 4,95) will und will nicht rechts herum drehen. Es geht und geht nicht.

Ich habe schon alle möglichen Programme ausprobiert, welche ein PWM auf D0 (Data0 Pin des LPT, also Pin2) erzeugen.

Doch der Servo dreht nur nach links.

Habe ich es überhaupt richtig verstanden ?!


Signallänge: 20ms
z.b. Puls von 3 MS

also:

..........|||||||||............................... ....................... und von vorne...
das währe dann bsp. nach links

jetzt das PWM für rechts:

Wieder 20ms Signallänge,
Puls von 10ms

........|||||||||||||||||||||||||||||||||||||||||| |............ und von vorne...


Oder wie muss ich mir das PWM vorstellen ?

Habt ihr Programme, die idiotensicher gehen ?
Bzw habt ihr Lösungen, damit der Motor endlich mal anders herum funktioniert ?

Mit den µCs und Transistoren stehe ich endgülltig auf Kriegsfuß glaube ich -.-

Jaecko
18.09.2008, 17:04
Verwendest du VB6 und versuchst auf den LPT zuzugreifen? Das dürfte nicht gehen. Soweit ich weiss, benötigt man dazu die inpout32.dll, die den Zugriff möglich macht.

Das fehlen des Signals könnte also gleichbedeutend mit 0% Pulsdauer = ganz links sein.

WerWolf2009
18.09.2008, 17:19
nene es funktioniert ja.
Ich nutze VB6 und inpout32.dll

Ich hab schon n Tool gebastelt, funktioniert auch alles einwandfrei.
Es geht nur um das korrekte PWM signal.

Jaecko
18.09.2008, 17:22
Achso ok.
Hm, machst du die Signalerzeugung über nen Timer?
Also wäre meine Idee, einen Timer im ms-Takt laufen zu lassen, dort jeweils ne Variable zu zählen und in Abhängigkeit des Wertes den Port High/Low setzen.

WerWolf2009
18.09.2008, 18:11
Hallo,

richtig. Ich nutze einen Timer sowie eine eingefügte Funkion,
Wait.


Wie würdest Du das ganze machen ?
Wie muss das Signall aussehen ?

Jaecko
18.09.2008, 18:17
Naja würds mit dem Timer machen, angenommen so ein Servopuls soll ne Gesamtlänge von 20ms haben.

Wenn der Timer ne Variable tx hochzählt, dann könnte man das in der Timer-Funktion mit ner Select-Case auswerten:


tx = tx + 1

Select Case tx
Case 0 to 5:
Port = High
Case 6 to 20:
Port = Low
End Select
If tx = 20 THEN tx = 0


Ist halt da dann das Problem, dass die kleinsten Timerschritte 1ms betragen; da hätte man also max. 20 Positionen.

WerWolf2009
18.09.2008, 18:37
heyho.

Das Servo "pulsiert" jetzt nach links, nach rechts will er aber nicht..

Jaecko
18.09.2008, 18:43
Versuch mal, die Werte in der Case-Anweisung zu ändern.
Also mal von 0 bis 15 und 16 bis 20.

WerWolf2009
18.09.2008, 18:47
kein unterscheid -.-

Jaecko
18.09.2008, 18:58
Hm... schreib mal ganz oben (ausserhalb der Timerfunktion) Public tx dazu. Sonst kanns sein, dass der jedes mal ne "frische" tx = 0 verwendet.

WerWolf2009
18.09.2008, 19:01
dannn würd er aber doch gar nicht erst anfangen zu zucken (also der motor) , da der Pin ja nur aktiviert wird, wenn die richtige von bis Zahl erfüllt ist..

Jaecko
18.09.2008, 19:05
Hm... stimmt, dann wäre ja ständig der erste Case-Zweig wahr.
Was jetzt noch interessant wäre: Ist die Pulslänge auch genau so lange, wie geplant? Also 20ms... Zufällig n'Oszi im Haus?

Nachtrag: Du kannst ja mal nen Slider einbauen und den Wert des Sliders als Grenze zwischen den Case-Zweigen verwenden. Dann könntest in Echtzeit mal den Wert verändern.

Case 0 to Slider1.value:
...
Case Slider1.value+1 to 20:
...

WerWolf2009
18.09.2008, 19:08
Oszi hab ich leider nicht -.-
Ich bin nervlich echt am Ende xD

BastelWastel
18.09.2008, 20:08
Also wäre meine Idee, einen Timer im ms-Takt laufen zu lassen

Ich will kein Spielverderber sein, aber der gemeine Servo wartet auf einen Puls von 1ms (ein Anschlag) bis 2ms (Anschlag andere Seite), ergo 1,5 ms mittelstellung...und zwischen den Pulsen ~20 ms Pause.
Sprich, du kommst mit dem ms Timer nicht weit..ich weiß grad nicht ob VB auch uS kann, eher nicht..und selbst wenn ist es Unfug.

Die Timer sind vom System abhängig..du wirst nie ne uS genauiggeit haben..ich glaub sogar dass die Timer freezen wenn man Controls drückt oder das Fenster verschiebt?

An deiner stelle würde ich via RS232 nen uC die Sollwerte übergeben und ihm die Pulsgenerierung überlassen..

BastelWastel
18.09.2008, 20:12
Ach ja..
https://www.roboternetz.de/wissen/index.php/Servo

Cheers,

Netzman
18.09.2008, 20:50
unter windows kannst es ziemlich vergessen, ein gescheites servosignal zu generieren. die systemtimer arbeiten im mS-Takt, du kannst also höchstens die endanschläge anfahren... eine möglichkeit eine geringere auflösung zu erreichen wäre, wie zu anfängen der zeitrechnung im pc-bereich eine einfache for-next schleife mit ein paar tausend durchläufen. damit wirst du allerdings auch keine freude haben, weil windows ein multitasking betriebssystem ist und irgendein anderer task dazwischenkommen kann und auch wird.
möglich wäre es mit einem RTOS (gibts zb. auf Linux-Basis), wäre aber mit kanonen auf spatzen geschossen.
wie bereits erwähnt, die einfachste möglichkeit wäre einem mc die pulsbreite über rs-232 vorzugeben. dazu reicht ein kleiner attiny mit internem takt locker aus, also der bauteilaufwand hält sich dabei in überschaubaren grenzen: spannungsversorgung, schnittstellenwandler und tiny.
bin irgendwo mal über eine servo-steuerung direkt über den rs232 port gestolpert, der hat einfach div. ascii-zeichen mit einer bestimmten baudrate gesendet, wobei dann "zufällig" die richtigen pulsbreiten am tx rausgekommen sind. die auflösung ist dabei allerdings auch nicht die wucht.

python_rocks
18.09.2008, 21:12
Hallo WerWolf!

Vielleicht wäre das hier http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=65&products_id=118 etwas für dich.

mfg
Gerold
:-)

WerWolf2009
19.09.2008, 12:48
schon interessant.
Allerdings halte ich es mit 30 euro für überteuert ?

BastelWastel
19.09.2008, 15:34
Naja, wie gesagt wirst du ohne externe Hardware nicht auskommen.
Wenns dir ums Geld geht musst du auch beruecksichtigen was dich der Eigenbau/Zeitaufwand kostet.

WerWolf2009
19.09.2008, 16:56
okay...

bin bei nem Kollegen und versuchen nun das ganze mit einem
atmel 0801 - attiny 2313 20PU zu basteln.

Folgendes:

Der Attiny bekommt auf PinD.1 und PinD.2 Strom, darauf hin soll er ein langames PWM oder ein schnelles auf den Ausgang &B10000000 schicken.

leider funktioniert es nicht.
Weiß jemand wo in folgendem Quelltext der / die fehler liegen ?

Grüße




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

Config Portb = Output

Dim Wartenl As Byte
Dim Wartenr As Byte

Menu:

If Portb.1 = 1 Then
Gosub Links
End If

If Portb.2 = 1 Then
Gosub Rechts
End If

Links:

Wartenl = 0.4
Do
Portb = &B10000000
Waitms Wartenl
Portb = &B00000000
Waitms Wartenl
Loop Until Portb.1 = 0

Gosub Menu

Rechts:

Wartenr = 0.51

Do
Portb = &B10000000
Waitms Wartenr
Portb = &B00000000
Waitms Wartenr
Loop Until Portb.2 = 0

Gosub Menu

python_rocks
19.09.2008, 17:08
bin bei nem Kollegen und versuchen nun das ganze mit einem atmel 0801 - attiny 2313 20PU zu basteln.
Hallo WerWolf!

http://halvar.at/elektronik/servo_mit_bascom_avr/

mfg
Gerold
:-)

BastelWastel
19.09.2008, 17:23
okay...

bin bei nem Kollegen und versuchen nun das ganze mit einem
atmel 0801 - attiny 2313 20PU zu basteln.

Folgendes:

Der Attiny bekommt auf PinD.1 und PinD.2 Strom, darauf hin soll er ein langames PWM oder ein schnelles auf den Ausgang &B10000000 schicken.

leider funktioniert es nicht.
Weiß jemand wo in folgendem Quelltext der / die fehler liegen ?


Auf den ersten Blick..

1. Definierst du deine Variable 'warten' als Byte, versuchst aber ein floating, also..Kommazahl, zu speichern.
2. Verwendest du waitms, was meines Wissens eine ganze Zahl erwartet..und mit 1 oder 2 ms kommst du wieder nur an die Anschläge...ergo, waitus.
3. Kann ich mich erinnern dass einige im Forum ein Problem hatten wenn sie waitus mit einer Variable aufrufen, ging bei mir aber wenn ich mich recht entsinne..nur am Rande..

Cheers, BastelWastel

WerWolf2009
19.09.2008, 18:34
$regfile = "2313def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb = Output

Dim Wartenl As Byte
Dim Wartenr As Byte


If Pind.2 = 1 Then

Do
Portb = &B10000000
Waitus 15
Portb = &B00000000
Waitus 5
Loop Until Pinb.2 = 0

End If



Geht nicht... er zuckt nur vor sich hin...

Links rum geht mit z.b. waitus (1)

rechts herum nicht -.- z.b. bei waitus (0.4) zuckt er nur...

ideen ? -.-

BastelWastel
19.09.2008, 18:59
x.X

uS = Mikrosekunden
Gültige Impulswerte für nen Servo wären also zwischen 1000uS und 2000uS

Pausen mit waitMS 20..

Wobei der wait Befehl wirklich der schlechteste Weg ist.. Dadurch kannst du den uC für nichts anderes mehr nutzen..

WerWolf2009
28.09.2008, 18:33
moin moin ^^

ich habe jetzt alles fein säuberlich verkabelt und angeschlossen.
Komischer weise funkioniert nun auch das PRogramm von Philipp Kolb (.> http://www.philipp-kolb.net/philipp_kolb_RC_servo_control.html)

Der Scannerkopf arbeitet jetzt also.
Ich kann ihn über den Computer aus nach Links / Rechts und nach Oben/Unten drehen.

JIHHA !!

Leider ist das Programm von Philipp K. nicht optimal für mich.
Ich habe nämlich noch den Shutter und das Farbrad zu betreiben.
Das Progg von Philipp K. hat leider nur eine Relais Funktion.


Könnte mir jemand erklären,
wie er warscheinlich das PWM mit dem Programm erzeugt ?

Bzw.: könnte für mich jemand einmal mit einem Otzy die Signale auswerten ?
Ich habe das gefühl, das ich einfach das Prinzip eines PWMs nicht verstanden habe.

Könntet ihr es mir bitte nocheinmal erklären ? Der Eintrag in der Wissensdatenbank ist für mich unverständlich.

Was ich bereits gemerkt habe: wenn ich eine LED ans LPT Kabel halte, blinkt sie unterschiedlich schnell ^^

Danke für eure mithilfe :)

BastelWastel
29.09.2008, 11:53
ich habe jetzt alles fein säuberlich verkabelt und angeschlossen.
Komischer weise funkioniert nun auch das PRogramm von Philipp Kolb (.> http://www.philipp-kolb.net/philipp_kolb_RC_servo_control.html)


Na, das ist doch schon mal was. Dein link endet bei mir in nem 404 error


Leider ist das Programm von Philipp K. nicht optimal für mich.
Ich habe nämlich noch den Shutter und das Farbrad zu betreiben.

Kannst du es nicht erweitern?


Könnte mir jemand erklären,
wie er warscheinlich das PWM mit dem Programm erzeugt ?

Ohne Quellcode nicht ;)
Aber es wurden dir schon genug moeglichkeiten genannt wie du den Puls erzeugen kannst.
Deine 'wait' Funktion wuerde ich allerdings nicht verwenden.



Bzw.: könnte für mich jemand einmal mit einem Otzy die Signale auswerten ?
Ich habe das gefühl, das ich einfach das Prinzip eines PWMs nicht verstanden habe.

Könntet ihr es mir bitte nocheinmal erklären ? Der Eintrag in der Wissensdatenbank ist für mich unverständlich.

https://www.roboternetz.de/wissen/images/5/51/Servosteckerbelegung.gif
http://kos.informatik.uni-osnabrueck.de/download/report/img34.gif

Die Servostellung ist vorgegeben von der laenge des Pulses..dieser ist zwischen 1 und 2 mS lang (bzw 1000 und 2000 uS) und ist gefolgt von einer 20ms langen Pause.
Ein Puls von 1000 uS waere also eine Endlage, 2000uS Endlage andere Seite und bei 1500 uS sollte der Servo in Mittelstellung gehen.
Die Dauer der Pause ist eher unkritisch.


Was ich bereits gemerkt habe: wenn ich eine LED ans LPT Kabel halte, blinkt sie unterschiedlich schnell ^^

Das ist...toll ._.

;)

WerWolf2009
29.09.2008, 20:10
okay, danke für deine Antwort :)
Warscheinlich liegt es an dem zu langsamen Timer :(
Ich bräuchte dann wohl einen "High resolution Timer".

Leider komme ich mit diesem => http://www.gssg.de/net_stpwatch.htm
Code nicht weiter :(

Ich weiß nicht, wie ich den umbauen soll, damit ich einen Timer daraus machen kann.

Die Frage also: wie erstelle ich am Besten einen Timer, der µS Sekunden Auflösung hat ?
WIe der im Link: Nanosekunden müssen es nun nicht sein ;)

Hier übrigens ein neues Video*: http://www.myvideo.de/watch/5186901

*wird z.Zt. von MyVideo konventiert.

WerWolf2009
03.10.2008, 18:23
moin,

ich nocheinmal.

Also, das PWM erzeuge ich jetzt über eine Do-Loop until schleife.

Merkwürdig finde ich jedoch:
Das PWM nach links dreht den servo schneller, als nach rechts.

Jemand eine idee warum ?

Hier der PWM Quellcode für links:



Aus = 0
Ausz = 1

Do
L1 = 1
Out(&H378, L1 + L2 + L3 + L4 + L5 + L6 + L7)
Wait(0.5)
L1 = 0
Out(&H378, L1 + L2 + L3 + L4 + L5 + L6 + L7)
Wait(0.9)

Loop Until Aus = 1

nach rechts:


Aus = 1
Auslz = 0
Do

L1 = 1
Out(&H378, L1 + L2 + L3 + L4 + L5 + L6 + L7)
Wait(0.6)
L1 = 0
Out(&H378, L1 + L2 + L3 + L4 + L5 + L6 + L7)
Wait(0.51)

Loop Until Ausrz = 1