Page 1 of 1

Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Tue Sep 30, 2008 1:40 pm
by Mario W
Hallo,

ich hoffe, mir kann jemand bei meinem Verständnisproblem helfen.
Ich habe einen Spin Warrior (SW24R4 V1.0.0.0) und daran versuchsweise
einen Drehgeber von HP (HEDS-5700 series, 256 CPR (cycles per revolution))
angeschlossen. Aus der SpinWarriorSDK.zip habe ich das Programm aus dem
Beispielcode (...Windows/Samples/VB6/) so angepaßt, daß die gelesenen
Werte von Spin(0) summiert werden (und einfachheitshalber in Spin(6).caption
geschrieben werden). -> code siehe unten

Ich bewege den Drehgeber langsam mit der Hand. Durch Verändern des Timers
(Timer1 Interval) bekomme ich aber immer andere Werte, z.B.:

Timer1 = 5 -> eine Umdrehung ~1020
Timer1 = 20 -> eine Umdrehung ~1020
Timer1 = 50 -> eine Umdrehung ~1020 *default SDK
Timer1 = 100 -> eine Umdrehung ~600
Timer1 = 200 -> eine Umdrehung ~300
Timer1 = 500 -> eine Umdrehung ~140

Jetzt meine Fragen:
x) Ich sollte im SpinWarrior keinen Überlauf haben (8bit), gehen mir
trotzdem Werte verloren, wenn ich sie nicht in einem bestimmten (?)
Zeitintervall auslese? Ich drehe den Drehgeber sehr langsam!
x) Wird der aktuelle Stand auf 0 gesetzt, wenn ich den Wert auslese?
x) Wenn beim Drehgeber im Datenblatt 256CPR steht, lese ich dann
den Wert "256" vom SpinWarrior zurück?
x) Fehler im Code beim Summieren?
x) ev. kann mir jemand ein Beispiel schicken, wie's geht :)

Danke schon jetzt,
MARIO


Hier der modifizierte Code:
(meine Zeilen sind mit '*** gekennzeichnet! Spins(6).Caption = soll die Summe von Spin(0) sein)

Code: Select all

Dim SpinDev As Long
Dim Sum0 As Long   '***

Private Sub Form_Load()
  SpinDev = SpinKitOpenDevice
  If SpinDev = 0 Then
    ' Exit from program
    MsgBox "No SpinWarrior found!", 0, "Error"
    End
  End If

  Spins(0).Caption = 0 '*** set INI values
  Spins(6).Caption = 0 '*** set INI values

  ' start timer for reading SpinWarrior
  Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
  ' stop timer
  Timer1.Enabled = False
  ' close SpinWarrior
  SpinKitCloseDevice (SpinDev)
End Sub

Private Sub Timer1_Timer()
  Dim I As Long
  Dim Data As SPINKIT_DATA
  
  While SpinKitReadNonBlocking(SpinDev, Data) <> 0
    For I = 0 To 5
      Spins(I).Caption = Data.Spins(I)
    Next I
    For I = 0 To 6
      If Data.Buttons(I) <> 0 Then
        Buttons(I).Caption = "down"
      Else
        Buttons(I).Caption = "up"
      End If
    Next I
    ' -> (Spins(6).Caption) = Sum of Spin(0)              '***
    Sum = CInt(Spins(0).Caption) + CInt(Spins(6).Caption) '***
    Spins(6).Caption = Sum                                '***
    
  Wend
End Sub

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Tue Sep 30, 2008 10:32 pm
by Guido Körber
Der Wert im SpinWarrior wird auf Null gesetzt wenn ein Datenpaket gesendet wird. Das passiert alle 8ms. Darauf hat das Programm auf Rechnerseite keinerlei Einfluss. Werden die Daten nicht schnell genug gelesen, dann gehen irgendwann Daten durch Pufferüberlauf verloren.

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Wed Oct 01, 2008 9:49 am
by Mario W
Hallo Herr Körber,

danke für die schnelle Antwort, ich werde mich noch etwas weiterspielen. Vielleicht
bekomme ich von einem User, der den SpinWarrior unter VisualBasic betreibt, den
Code :)
Der Wert im SpinWarrior wird auf Null gesetzt wenn ein Datenpaket gesendet wird. Das passiert alle 8ms. Darauf hat das Programm auf Rechnerseite keinerlei Einfluss. Werden die Daten nicht schnell genug gelesen, dann gehen irgendwann Daten durch Pufferüberlauf verloren.
Kann ich den SpinWarrior z.B. auch nur ein Mal pro Sekunde auslesen, wenn ich mir sicher bin,
daß ich vom Drehgeber nur z.B. 100 Impulse/s bekomme? Oder muß ich mindestens alle 50ms
die Daten auslesen, egal ob sich der Drehgeber dreht oder stillsteht?

Danke und l.g. Mario

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Wed Oct 01, 2008 12:48 pm
by Guido Körber
Der SpinWarrior sendet Datenpakete sobald er Impulse detektiert. Also auch wenn "nur" 100 Impulse pro Sekunde auftreten, kann alle 8ms ein Datenpaket kommen.

Wie gesagt, die Software auf dem Rechner hat keine Möglichkeit zu beeinflussen wie schnell die Datenpakete kommen, sie muss einfach sicherstellen schnell genug abzufragen um keinen Überlauf zu ermöglichen.

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Thu Oct 02, 2008 3:45 pm
by Mario W
Hallo Herr Körber,

nochmals vielen Dank, langsam verstehe ich es :)
Jetzt bleibt nur noch die Frage:
x) Wenn beim Drehgeber im Datenblatt 256CPR steht, lese ich dann
den Wert "256" vom SpinWarrior zurück?
Wenn ich das Timerintervall sehr kurz setze (<50ms), dann bekomme ich vom
SpinWarrior immer den Wert ~1020, sagen wir 1024, das wäre dann 4x 256?
(Lt. Datenblatt hat der Drehgeber 256 "CPR" cycles per revolution)

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Thu Oct 02, 2008 3:50 pm
by Mario W
wer lesen kann ist im Vorteil,
Since SpinWarrior is using quadrant tracking it
will report an impulse for each falling or rising
edge on either signal A or B. This results in a
resolution four times higher than that achieved by
using A as the clock and B as the direction signal.
Danke, Mario

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Wed Oct 29, 2008 11:37 am
by Mario W
Hallo Herr Körber,

jetzt habe ich noch eine Frage, lt. dem Datenblatt vom SpinWarrior hat
mein SW24R4 eine fmax=3500Hz bzw. eine tmin von 71us (entspricht ~ 1/ 4*3500Hz).

Wenn mein Encoder jetzt 256 CPR (cycles per revolution) hat, ist
dann die maximale Drehzahl 3500/256 = 13.7 Umdrehungen pro Sekunde?

Vielen Dank,
Mario

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Wed Oct 29, 2008 12:34 pm
by Guido Körber
Ja, das ist richtig, Zahl der Umdrehungen pro Sekunde mal Pulse pro Umdrehung ergibt die Impulsfrequenz. Da die SpinWarrior jede Flanke nutzen ergibt sich daraus dann die vierfache Schrittzahl.

Re: Verständnisproblem beim Auslesen des SpinWarrior's

Posted: Wed Oct 29, 2008 1:06 pm
by Mario W
Danke!