Da bin ich schon wieder, habe eine kurze Frage

Bin gerade dabei, mit den Odometrie-Sensoren eine exakte Drehung auf der Stelle zu Programmieren: void Drehe(int grad)
Leider ist das ganze irgendwie ziemlich ungenau, bei Drehe(180); liegt die Fehlertoleranz schon so zwischen 20-30 Grad. Daher meine erste Frage: Kann ich das noch irgendwie optimieren? Habe schon probiert, die Helligkeitswechsel für beide Motoren zu berechnen, was aber auch nichts gebracht hat.

Code:
void Drehe(int grad)
{
	// berechnen, welche Strecke jedes Rad fahren muss, um die Drehung zu erzeugen
	// wir haben es mit einem Kreis mit dem Radius 1/2 RAD_ABSTAND zu tun
	// die zu fahrende Strecke ist 1/2 des Umfangs
	// Ergebnis in Millimeter

	float benoetigte_strecke = (float) ((float) grad / (float) 360) * (M_PI * RAD_ABSTAND);

	// berechnen, wieviele Helligkeitswechsel für die Strecke gebraucht werden
	// Bei 42 Helligkeitswechseln gab es eine Umdrehung
	float benoetigte_wechsel = (float) benoetigte_strecke * (float) ( (float) 42 / (float) RAD_UMFANG);
	
	/*
	** Laufvariablen
	*/
	// wieviele Hell/Dunkel Wechsel gab es (wird zur Berechnung der Strecke benötigt)
	unsigned int wechsel = 0;
	// vorheriger Wert hell oder dunkel? 0 = hell, 1 = dunkel
	int helligkeit_alt = 0;
	// momentaner Wert hell oder dunkel? 0 = hell, 1 = dunkel
	int helligkeit;
	
	/*
	** Los fahren, solange bis die benötigte Drehzahl erreicht ist
	*/
	MotorDir(FWD, RWD);
	Geschwindigkeit(120, 120);
	unsigned int data[2];
	while (wechsel < benoetigte_wechsel)
	{
		OdometrieData(data);
		if (data[0] > 500)
			helligkeit = 1;
		else
			helligkeit = 0;
		
		if (helligkeit_alt != helligkeit)
			wechsel += 1;
		helligkeit_alt = helligkeit;
	}
	Geschwindigkeit(0, 0);
	MotorDir(FWD, FWD);
}
Meine zweite Frage: Die Helligkeitswechsel, die für eine Radumdrehung gebraucht werden, hab ich nur durch ausprobieren rausgekriegt (42). Gibts da einen exakteren Wert bzw. kann ich den auch irgendwie ausrechnen?