-
        

Ergebnis 1 bis 5 von 5

Thema: Verbesserung der Fahrtgenauigkeit von Robby via TIMER???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    15

    Verbesserung der Fahrtgenauigkeit von Robby via TIMER???

    Anzeige

    Hallo zusammen.

    Der Robby hat zwar nen Wegzähler (habs gerechnet, der Idealwert liegt um 3,77 cm pro digit), ist mir aber ein wenig ungenau.

    Wollte daher mit dem internen Timer versuchen, die gefahrenen Weg zu steuern. d.h. ich lasse den Robby nur innerhalb der vorgegebenen Zeit fahren. Unten hab ich ein Testprogramm geschrieben um die Geschwindigkeit von Robby zu messen.

    Code:
    timer=0
    gosub CLR_DISTANCE:gosub LEDSOFF
    
    #test
         input speed
         gosub move_fwd
         gosub L_DISTANCE
         dist = 256 * HBYTE + LBYTE
         if speed = 0 then gosub stop
    goto test
    
    #stop
    gosub LED4ON:SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0:
    print timer
    print dist
    return
    
    #move_fwd
    SYS FWDR:SYS FWDL:SPEED_L=speed:SPEED_R=speed:return
    Hab den TIMER mal abgefragt. Die Werte sahen ziemlich willkürlich aus und stimmten teilweise auch nicht... z.B. die Anfangszeit war fast immer ca. 1300 und dist war immer ab 200. Weiß jemand warum? Ein BUG vom Roboter?

    Meine Frage wäre, ob eine Verbesserung der Fahrtgenauigkeit durch TIMER überhaupt möglich? und wie?

    MfG
    itech

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    15
    Mahlzeit.

    Ich hab heute mit dem unteren Programm nochmals probiert

    Code:
    define speed    byte[8]
    define dist     byte[9]
    define eingabestart byte[10]
    define timer_startwert  word
    define timer_endwert    word
    define Zeitdauer_MilliSekunden  word[1]
    '---------- INIT---------------
            gosub SUBSYS_PWR_ON
            beep 368,10,0:pause 50
    '---- SYSTEM OPERATION MODE (NO INTERRUPT) ----
            gosub NO_ACS_INT:SYS ACS_MAX
    '------------ ANTRIEB -------------------------
            REV_L=on:REV_R=on:SYS PLM_SLOW
    
    #start
          gosub CLR_DISTANCE
          eingabestart=1
    goto test
    
    
    #test
         input speed
         print "Geschwindigkeit [Geschwindigkeitsdigits]: "; speed
         gosub L_DISTANCE
         dist = LBYTE
         IF speed = 0 then goto stop
         IF eingabestart=1 THEN timer_startwert = timer
         IF eingabestart=1 THEN print "Timer Startwert [counter]: "; timer_startwert
         gosub move_fwd
         eingabestart=0
    goto test
    
    
    '--------------------------------------------
    #stop
    timer_endwert = timer
    print "Timer Endwert [counter]: "; timer_endwert
    SYS FWDR:SYS FWDL:SPEED_L=0:SPEED_R=0
    Zeitdauer_MilliSekunden = timer_endwert - timer_startwert
    'IF Zeitdauer_MilliSekunden < 0 THEN Zeitdauer_MilliSekunden = 32767-timer_startwert+timer_endwert
    print "Zeitdauer [counter]: "; Zeitdauer_MilliSekunden
    print "Distanz [digit]: "; dist
    goto start
    
    #move_fwd
    SYS FWDR:SYS FWDL:SPEED_L=speed:SPEED_R=speed:return
    aber kommischerweise gibt der Robby immer nen negativen Wert von "Zeitdauer_MilliSekunden " aus.

    Weiß jmd warum? Danke im Voraus.

    MfG

    itech

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791

    Timer und RP5

    Hallo itech,

    bei der Wegstrecke des RP5 pro Digit des Wegstreckenzählers war ich immer von 3,14 cm pro Digit ausgegangen (sagt auch die Doku zum RP5). Kannst du das nochmal nachmessen?

    Die Idee mit der Verbesserung der Genauigkeit durch den Timer ist im Prinzip gut, er zählt ja alle 20 ms hoch, so dass du nicht direkt die Zeit in ms bekommst, sondern die Differenz von End- und Startwert mal 0,02 nehmen must, um die sek zu bekommen.
    Dein Prog sieht so aus, als müßte es funktionieren (ich habs aber nicht ausprobiert), aber die Variable Zeitdauer_Millisekunden ist als word[1] definiert und liegt daher "über" den Byte-Variablen HBYTE und LBYTE (es sei denn, du hast sie nicht als byte[1] und [2] definiert!), so dass sie sich "vermischen".
    Laß das [1] hinter word einfach weg, dann teilt der Compiler der Word-Variable einen freien Platz zu!

    Gruß Dirk

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    15
    Hallo Dirk,

    danke für deine Tipps. Ich habs nochmals probiert, leider liefert die Differenz immer einen komischen negativen Wert aus. Bin fast verzweifelt.

    Die Sache vom Wegstreckenzähler habe ich folgendes berechnet:

    Das Stufenrad mit der Bohrung (50/12 Zähnen) ist direkt mit einem Zahnrad mit 50 Zähnen auf der Abtriebswelle verzahnt. Die Übersetzung von den beiden Zahnrädern beträgt 12/50.Die Antriebsräder mit Durchmesser 4,4 cm führen die Gummiraupenbänder. Zusammen mit dem Gummiraupenband beträgt ein Antriebsrad 5,0 cm.

    Da das Stufenrad pro Umdrehung nur ein Mal (n = 1) über dem Gabellichtschrank abgefragt wird, beträgt der Soll-Weg pro Impuls des Gabellichtschranks:
    s = (12/50)*(1/n)*(pi*D) = (12/50)*(1/1)*(pi*50cm) = 3,77cm

    Ich hab nochmals mit dem Robby getestet und dieser Wert sollte eigentlich stimmen.

    Gruss, itech

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791

    Fehler?

    Hallo itech,


    ... leider liefert die Differenz immer einen komischen negativen Wert ...
    Eigentlich dürfte ein Word-Wert ja nicht wirklich negativ werden. Er kann ja nur 0..65535 abbilden.

    Fehlerquellen:
    dist -> geht ja nur für 255 * 3,77 cm (oder 3,14 cm ?), also 8 bis 9 m weit.

    timer -> läuft etwa 21 Minuten, aber du startest ja nicht bei Null, sondern irgendwo mitten drin. Daher kann der Timer schon wieder durch Null gelaufen sein, wenn der Endwert erreicht ist. Dann ist Endwert u.U. < Startwert.

    Gruß Dirk

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •