Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Tue Jul 19 2022 13:01:49 by
1.7.2