Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.

Dependencies:   TextLCD mbed

Revision:
0:b72d86a7b005
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/auto_func.cpp	Tue May 31 03:06:27 2016 +0000
@@ -0,0 +1,173 @@
+/**
+*Funktionen fuer den Autmatikbetrieb
+*
+*CPP-Datei auto_func.cpp
+*
+*@version: 01.11.2015
+*@author: Gustav Grether
+*/
+
+#include "auto_func.h"
+#include "mbed.h"
+//Variablen fuer Automatikbetrieb
+float TA=0.04; //Abtastzeit[s], entspricht Abtastrate 25 Hz
+//Bereich, indem das Kantenpixel zum Start des Automatikbetriebs sein muss
+int minPx=30;
+int maxPx=100;
+Timer t;// Timer der Uebergang zu Automatikbetrieb bei Fehler abbricht
+int maxt=1; // Maximale zulaessige Zeit fuer Uebergang zu Automatikbetrieb
+
+//Variablen fuer auto_sens_ctr()
+int cnt_Err; //Zaehler fuer aufeinanderfolgende Fehler bei der Kantendetektion
+int allow_Err=10; //zulaessige Anzahl aufeinanderfolgender Fehler bei der Kantendetektion
+int auto_curPx; //Wert des aktuellen Kantenpixel
+int auto_forPx; //Wert des vorhergehenden Kantenpixel
+int threshDiff=15; //zulaessige Abweichung zu vorhergehendem Kantenpixel in Anzahl Pixel
+Ticker tickerReg; //Ticker, der das Auslesen des Sensors und die Reglung taktet
+
+
+//Variablen fuer auto_sollPx_set()
+int auto_sollPx; //zwischenspeichern des Sollwertes
+//Variablen fuer auto_kp_set()
+float main_kp; //zwischenschpeichern von kp
+
+void auto_setup()
+{
+    cnt_Err=0;
+    t.reset();
+    t.start();
+
+    while(1) { //Finde Kante in Toleranzbereich
+        auto_curPx=edgePx_get();//Sensor auslesen
+        if(auto_curPx>minPx && auto_curPx<maxPx) {
+
+            t.stop();
+            regler_setup();
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
+            lcd.locate(0,1);
+            lcd.printf(">kp >soll  >hand");
+            //Ticker fuer Taktung der Reglung mit Funktion verknuepfen,Abtastrate TA
+            
+            tickerReg.attach(&auto_sens_ctr,TA);
+            
+            break;
+        } else {
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Detektion nicht moeglich.");
+            
+        }
+    }
+
+
+}
+
+void auto_end()
+{
+    tickerReg.detach();//Ticker fuer Taktung der Reglung beenden
+    regler_end();//Reglerparameter in Datei speichern
+}
+
+void auto_sens_ctr()
+{
+    auto_forPx=auto_curPx; 
+    auto_curPx=edgePx_get();//Sensor auslesen
+   
+    if(auto_curPx<0) {
+        //Fehler bei Kantendetektion
+        cnt_Err++;
+        //nehme vorhergehenden Wert an, solange bis cnt_Err Grenzwert erreicht
+        auto_curPx=auto_forPx;
+    } else if(abs(auto_forPx-auto_curPx)>threshDiff) {
+        //Differenz zu vorhergendem Wert zu gross
+        cnt_Err++;
+        //nehme vorherhegenden an, solange bis cnt_Err Grenzwert erreicht
+        auto_curPx=auto_forPx;
+    } else { //Kantendetektion erfolgreich
+        cnt_Err=0; //setze zul. Fehler auf 0
+    }
+
+    if(cnt_Err<allow_Err) {
+        //fuehre Regelungalgorithmus aus
+        control(auto_curPx);
+    } else {
+        //NOTAUS, schalte Motor bewegungslos, keine Meldung auf Display
+        mtr_period_set(0); //Motor bewegungslos schalten
+    }
+
+    //fuehre Regelungalgorithmus aus
+    control(auto_curPx);
+}
+
+void auto_sollPx_set() 
+{
+    auto_sollPx=regler_sollPx_get();
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("SOLL=%i", auto_sollPx);
+    lcd.locate(0,1);
+    lcd.printf(">+    >-   >auto");
+    while(1) {
+        if(butLe==1 && debLe.read_ms()>500) {
+            //erhoehe sollwert
+            debLe.reset();
+            auto_sollPx=auto_sollPx+1;
+            regler_sollPx_set(auto_sollPx);
+            lcd.locate(0,0);
+            lcd.printf("SOLL=%i", auto_sollPx);
+        } else if(butMi==1 && debMi.read_ms()>500) {
+            //erhoehe sollwert
+            debMi.reset();
+            auto_sollPx=auto_sollPx-1;
+            regler_sollPx_set(auto_sollPx);
+            lcd.locate(0,0);
+            lcd.printf("SOLL=%i", auto_sollPx);
+        } else if(butRi==1 && debRi.read_ms()>500) {
+            //verlasse while schleife zum aendern von soll
+            debRi.reset();
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
+            lcd.locate(0,1);
+            lcd.printf(">kp >soll  >hand");
+            break;
+        }
+    }
+}
+void auto_kp_set()
+{
+    main_kp=regler_kp_get();
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("kp=%.1f", main_kp);
+    lcd.locate(0,1);
+    lcd.printf(">+    >-   >auto");
+    while(1) {
+        if(butLe==1 && debLe.read_ms()>500) {
+            //erhoehe kp
+            debLe.reset();
+            main_kp=main_kp+0.1;
+            regler_kp_set(main_kp);
+            lcd.locate(0,0);
+            lcd.printf("kp=%.1f", main_kp);
+        } else if(butMi==1 && debMi.read_ms()>500) {
+            //verringere kp
+            debMi.reset();
+            main_kp=main_kp-0.1;
+            regler_kp_set(main_kp);
+            lcd.locate(0,0);
+            lcd.printf("kp=%.1f", main_kp);
+        } else if(butRi==1 && debRi.read_ms()>500) {
+            //verlasse while schleife zum aendern kp
+            debRi.reset();
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
+            lcd.locate(0,1);
+            lcd.printf(">kp >soll  >hand");
+            break;
+        }
+    }
+}
\ No newline at end of file