Hallo mausi_mick, hallo hai1991,
ja mausi_mick, das scheint mir eine sehr gute Sicht auf die Dinge zu sein. (Jetzt wo du es sagst kommt man da "wie von selbst" drauf)
Wenn man mal nachrechnet:
ca. max Speed : 450 [mm/s]
ca. min Speed : 180 [mm/s]
Bei 8 schwarz- / 8 weiß-Teilen auf der Odoscheibe:
1 Tick entsprich ca. 1,5 [mm]
Bei "max Speed" somit ca.: 450 [mm/s] / 1,5 [mm] = 300,0 [Tiks/s] = 3,3 [ms/Tik]
Bei "min Speed" somit ca.: 180 [mm/s] / 1,5 [mm] = 120,0 [Tiks/s] = 8,3 [ms/Tik]
Die 10 [ms] scheinen somit eine gute Wahl gewesen zu sein. (Hast du bestimmt genau so wie ich berechnet mausi_mick. Nur dass du bestimmt der Devise 'Erst denken, dann handeln' gefolgt bist.)
Was passiert da aber, wenn man 'zu schnell' ist?
In jedem Schleifendurchlauf wird festgestellt, dass eine Seite nicht so läuft wie erwartet.
Dann wird Speed auf der entsprechende Seite um 10 reduziert/erhöht.
Weiterschleifen ohne Bremse.
Nun wird noch kein weiterer Tik festgestellt, somit wird wieder um 10 reduziert/erhöht. usw. usw.
Wenn man jetzt Pech hat, wird das Spiel so häufig wiederholt, dass Speed > 255 wird, oder Speed geht so weit zurück, dass der Motor stehen bleibt.
Beides dürfte recht fehleranfällig sein. Denn auch wenn speed_a und speed_i int-Variablen sind, werden ja, worauf mausi_mick ja schon mit der fehlenden Prüfung hinwies, nur die hinteren 8 Bits der Variablen als Wert in MotorSpeed() benutzt. Wer weiß schon wie die dann stehen.
Abraten würde ich aber, dass die Werte in der Schleife an den PC gesendet werden da die Übertragungsgeschwindigkeit pro Zeichen bei ca. 5 [ms] liegt.
Also bei 3-stelligem Werte und beiden Seiten, 7 Zeichen (3 + Leerzeichen + 3). Damit erzeugen wir eine Verzögerung von ca. 35 [ms].
Das ist prozentual aber schon extrem gegenüber den jetzigen 10 [ms].
Lieber die Daten in der Schleife speichern, und nach der Schleife, auf Tastendruck, an den PC senden.
Aber noch mal zurück zum Msleep() mit den jetzigen 10 [ms]
Bei langsamer Fahrt können wir dann schon ca. 3 Tiks 'verpasst' haben.
Das ist ein relativ großer Fehler bei jeweils 1,5 [mm] pro Tik.
Vorschlag:Dies würde die Problematik bei einer konstanten Wartezeit eliminieren.Code:long tik_summe; while (count_a<count_a_soll) { tik_summe = encoder [LEFT] + encoder [RIGHT]; while (tik_summe == encoder [LEFT] + encoder [RIGHT]) ; /* Hier weiter mit deinem Code. Msleep (xx); ist dann auch nicht mehr notwendig, da ja auf alle Fälle ein Tik gewartet wurde. */ }
Gruß Sternthaler
P.S.: Der Code war immer noch nicht in meinem Asuro.![]()
Lesezeichen