heise online · c't · iX · Technology Review · Telepolis · mobil · Security · Netze · heise open · heise resale · Autos · c't-TV · Jobs · Kiosk
Zum Inhalt
c't

c't Projekte - c't-Bot und c't-Sim - Mailinglisten

c't-Bot und c't-Sim


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

[ct-bot] Streulicht herausrechnen / Patch

Absender: Randolf
Datum: Mo, 20.03.2006 17:39:42
In-reply-to: <441DD110.7080201@xxxxxxxxxxxx>
References: <200603192107.18570.tevers@xxxxxxxxxxxxx> <441DBF3F.5030805@xxxxxxxxxxxx> <200603192143.31399.tevers@xxxxxxxxxxxxx> <441DD110.7080201@xxxxxxxxxxxx>


Hallo zusammen,

auch ich hab mir Gedanken um die zappelnden Sensorwerte gemacht. Eine
Mittelwertbildung halte ich nicht für sinnvoll. Die Spitzen treten nur
in eine Richtung auf und oft nur für ca 4-5 hintereinanderliegende
Messungen (was der Dauer der Schwebung/Überlagerung entsprechen könnte).
Daher verzichte ich auf die hohen Werte generell.
Ich speichere den letzten Messwert. Ist der aktuelle Wert kleiner, wird
er sofort übernommen.
Ist der aktuelle Wert größer, dann wird er nicht übernommen, sondern es
wird ein Zähler gestartet. Erst wenn x-Mal ein höherer Wert ausgelesen
wird, wird dieser übernommen. Momentan hab ich den Wert x auf 100
gestellt (worst case: nur nach 100 Sensorabfragen wird erkannt, dass
kein Hindernis mehr da ist. Bei max. 100 ms sollte das kein Problem sein
??? Tritt ein Hindernis auf, wird der kleinere Wert sofort
durchgereicht. Patch zum Testen  anbei.

Gruss Randolf

Index: mcu/sensor-low.c
===================================================================
RCS file: /ctbot/ct-Bot/mcu/sensor-low.c,v
retrieving revision 1.5
diff -u -r1.5 sensor-low.c
--- mcu/sensor-low.c	19 Mar 2006 20:42:51 -0000	1.5
+++ mcu/sensor-low.c	20 Mar 2006 17:50:51 -0000
@@ -133,6 +133,12 @@
  */
 void bot_sens_isr(void){
 	ENA_on(ENA_KANTLED|ENA_MAUS|ENA_SCHRANKE|ENA_KLAPPLED);
+	
+	static volatile int16 act_sensDistL = 0;
+	static volatile int16 act_sensDistR = 0;
+	static volatile int16 sens_count_left = 0;
+	static volatile int16 sens_count_right = 0;
+	
 
  	// Aktualisiere die Position des Maussensors 
 	sensMouseDY = maus_sens_read(MOUSE_DELTA_Y_REG);
@@ -158,6 +164,32 @@
 	sensDistL= sensor_abstand(adc_read(SENS_ABST_L));
 	sensDistR= sensor_abstand(adc_read(SENS_ABST_R));
 		
+		if (sensDistL <= act_sensDistL) {
+		act_sensDistL = sensDistL;
+		sens_count_left = 0;
+	}
+	else {
+		sens_count_left += 1;
+		if (sens_count_left == 100) {
+			sens_count_left = 0;
+			act_sensDistL = sensDistL;
+		} 
+		else sensDistL = act_sensDistL;
+	};
+	
+	if (sensDistR <= act_sensDistR) {
+		act_sensDistR = sensDistR;
+		sens_count_right = 0;
+	}
+	else {
+		sens_count_right += 1;
+		if (sens_count_right == 100) {
+			sens_count_right = 0;
+			act_sensDistR = sensDistR;
+		} 
+		else sensDistR = act_sensDistR;
+	};
+	
 	// ------- digitale Sensoren ------------------
 	sensDoor = (SENS_DOOR_PINR >> SENS_DOOR) & 0x01;
 	sensTrans = (SENS_TRANS_PINR >> SENS_TRANS) & 0x01;		


Copyright © 2007 Heise Zeitschriften Verlag Kritik, Anregungen bitte an c't-WWW Datenschutzhinweis   Impressum