Archiv verlassen und diese Seite im Standarddesign anzeigen : Verbesserung der Fahrtgenauigkeit von Robby via TIMER???
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.
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
Mahlzeit.
Ich hab heute mit dem unteren Programm nochmals probiert
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
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
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.