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;