Programmcodes Einzelblattstapelbildung / Mbed 2 deprecated Bahnkantenregelung_Julian

Dependencies:   TextLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers auto_func.cpp Source File

auto_func.cpp

00001 /**
00002 *Funktionen fuer den Autmatikbetrieb
00003 *
00004 *CPP-Datei auto_func.cpp
00005 *
00006 *@version: 01.11.2015
00007 *@author: Gustav Grether
00008 */
00009 
00010 #include "auto_func.h"
00011 #include "mbed.h"
00012 //Variablen fuer Automatikbetrieb
00013 float TA=0.04; //Abtastzeit[s], entspricht Abtastrate 25 Hz
00014 //Bereich, indem das Kantenpixel zum Start des Automatikbetriebs sein muss
00015 int minPx=30;
00016 int maxPx=100;
00017 Timer t;// Timer der Uebergang zu Automatikbetrieb bei Fehler abbricht
00018 int maxt=1; // Maximale zulaessige Zeit fuer Uebergang zu Automatikbetrieb
00019 
00020 //Variablen fuer auto_sens_ctr()
00021 int cnt_Err; //Zaehler fuer aufeinanderfolgende Fehler bei der Kantendetektion
00022 int allow_Err=10; //zulaessige Anzahl aufeinanderfolgender Fehler bei der Kantendetektion
00023 int auto_curPx; //Wert des aktuellen Kantenpixel
00024 int auto_forPx; //Wert des vorhergehenden Kantenpixel
00025 int threshDiff=15; //zulaessige Abweichung zu vorhergehendem Kantenpixel in Anzahl Pixel
00026 Ticker tickerReg; //Ticker, der das Auslesen des Sensors und die Reglung taktet
00027 
00028 
00029 //Variablen fuer auto_sollPx_set()
00030 int auto_sollPx; //zwischenspeichern des Sollwertes
00031 //Variablen fuer auto_kp_set()
00032 float main_kp; //zwischenschpeichern von kp
00033 
00034 void auto_setup()
00035 {
00036     cnt_Err=0;
00037     t.reset();
00038     t.start();
00039 
00040     while(1) { //Finde Kante in Toleranzbereich
00041         auto_curPx=edgePx_get();//Sensor auslesen
00042         if(auto_curPx>minPx && auto_curPx<maxPx) {
00043 
00044             t.stop();
00045             regler_setup();
00046             lcd.cls();
00047             lcd.locate(0,0);
00048             lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
00049             lcd.locate(0,1);
00050             lcd.printf(">kp >soll  >hand");
00051             //Ticker fuer Taktung der Reglung mit Funktion verknuepfen,Abtastrate TA
00052             
00053             tickerReg.attach(&auto_sens_ctr,TA);
00054             
00055             break;
00056         } else {
00057             lcd.cls();
00058             lcd.locate(0,0);
00059             lcd.printf("Detektion nicht moeglich.");
00060             
00061         }
00062     }
00063 
00064 
00065 }
00066 
00067 void auto_end()
00068 {
00069     tickerReg.detach();//Ticker fuer Taktung der Reglung beenden
00070     regler_end();//Reglerparameter in Datei speichern
00071 }
00072 
00073 void auto_sens_ctr()
00074 {
00075     auto_forPx=auto_curPx; 
00076     auto_curPx=edgePx_get();//Sensor auslesen
00077    
00078     if(auto_curPx<0) {
00079         //Fehler bei Kantendetektion
00080         cnt_Err++;
00081         //nehme vorhergehenden Wert an, solange bis cnt_Err Grenzwert erreicht
00082         auto_curPx=auto_forPx;
00083     } else if(abs(auto_forPx-auto_curPx)>threshDiff) {
00084         //Differenz zu vorhergendem Wert zu gross
00085         cnt_Err++;
00086         //nehme vorherhegenden an, solange bis cnt_Err Grenzwert erreicht
00087         auto_curPx=auto_forPx;
00088     } else { //Kantendetektion erfolgreich
00089         cnt_Err=0; //setze zul. Fehler auf 0
00090     }
00091 
00092     if(cnt_Err<allow_Err) {
00093         //fuehre Regelungalgorithmus aus
00094         control(auto_curPx);
00095     } else {
00096         //NOTAUS, schalte Motor bewegungslos, keine Meldung auf Display
00097         mtr_period_set(0); //Motor bewegungslos schalten
00098     }
00099 
00100     //fuehre Regelungalgorithmus aus
00101     control(auto_curPx);
00102 }
00103 
00104 void auto_sollPx_set() 
00105 {
00106     auto_sollPx=regler_sollPx_get();
00107     lcd.cls();
00108     lcd.locate(0,0);
00109     lcd.printf("SOLL=%i", auto_sollPx);
00110     lcd.locate(0,1);
00111     lcd.printf(">+    >-   >auto");
00112     while(1) {
00113         if(butLe==1 && debLe.read_ms()>500) {
00114             //erhoehe sollwert
00115             debLe.reset();
00116             auto_sollPx=auto_sollPx+1;
00117             regler_sollPx_set(auto_sollPx);
00118             lcd.locate(0,0);
00119             lcd.printf("SOLL=%i", auto_sollPx);
00120         } else if(butMi==1 && debMi.read_ms()>500) {
00121             //erhoehe sollwert
00122             debMi.reset();
00123             auto_sollPx=auto_sollPx-1;
00124             regler_sollPx_set(auto_sollPx);
00125             lcd.locate(0,0);
00126             lcd.printf("SOLL=%i", auto_sollPx);
00127         } else if(butRi==1 && debRi.read_ms()>500) {
00128             //verlasse while schleife zum aendern von soll
00129             debRi.reset();
00130             lcd.cls();
00131             lcd.locate(0,0);
00132             lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
00133             lcd.locate(0,1);
00134             lcd.printf(">kp >soll  >hand");
00135             break;
00136         }
00137     }
00138 }
00139 void auto_kp_set()
00140 {
00141     main_kp=regler_kp_get();
00142     lcd.cls();
00143     lcd.locate(0,0);
00144     lcd.printf("kp=%.1f", main_kp);
00145     lcd.locate(0,1);
00146     lcd.printf(">+    >-   >auto");
00147     while(1) {
00148         if(butLe==1 && debLe.read_ms()>500) {
00149             //erhoehe kp
00150             debLe.reset();
00151             main_kp=main_kp+0.1;
00152             regler_kp_set(main_kp);
00153             lcd.locate(0,0);
00154             lcd.printf("kp=%.1f", main_kp);
00155         } else if(butMi==1 && debMi.read_ms()>500) {
00156             //verringere kp
00157             debMi.reset();
00158             main_kp=main_kp-0.1;
00159             regler_kp_set(main_kp);
00160             lcd.locate(0,0);
00161             lcd.printf("kp=%.1f", main_kp);
00162         } else if(butRi==1 && debRi.read_ms()>500) {
00163             //verlasse while schleife zum aendern kp
00164             debRi.reset();
00165             lcd.cls();
00166             lcd.locate(0,0);
00167             lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
00168             lcd.locate(0,1);
00169             lcd.printf(">kp >soll  >hand");
00170             break;
00171         }
00172     }
00173 }