
Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.
Diff: auto_func.cpp
- 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