
Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.
auto_func.cpp
- Committer:
- Jules20
- Date:
- 2016-05-31
- Revision:
- 0:b72d86a7b005
File content as of revision 0:b72d86a7b005:
/** *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; } } }