Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.

Dependencies:   TextLCD mbed

Committer:
Jules20
Date:
Tue May 31 03:06:27 2016 +0000
Revision:
0:b72d86a7b005
Committed May 2016

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jules20 0:b72d86a7b005 1 /**
Jules20 0:b72d86a7b005 2 *Funktionen fuer den Autmatikbetrieb
Jules20 0:b72d86a7b005 3 *
Jules20 0:b72d86a7b005 4 *CPP-Datei auto_func.cpp
Jules20 0:b72d86a7b005 5 *
Jules20 0:b72d86a7b005 6 *@version: 01.11.2015
Jules20 0:b72d86a7b005 7 *@author: Gustav Grether
Jules20 0:b72d86a7b005 8 */
Jules20 0:b72d86a7b005 9
Jules20 0:b72d86a7b005 10 #include "auto_func.h"
Jules20 0:b72d86a7b005 11 #include "mbed.h"
Jules20 0:b72d86a7b005 12 //Variablen fuer Automatikbetrieb
Jules20 0:b72d86a7b005 13 float TA=0.04; //Abtastzeit[s], entspricht Abtastrate 25 Hz
Jules20 0:b72d86a7b005 14 //Bereich, indem das Kantenpixel zum Start des Automatikbetriebs sein muss
Jules20 0:b72d86a7b005 15 int minPx=30;
Jules20 0:b72d86a7b005 16 int maxPx=100;
Jules20 0:b72d86a7b005 17 Timer t;// Timer der Uebergang zu Automatikbetrieb bei Fehler abbricht
Jules20 0:b72d86a7b005 18 int maxt=1; // Maximale zulaessige Zeit fuer Uebergang zu Automatikbetrieb
Jules20 0:b72d86a7b005 19
Jules20 0:b72d86a7b005 20 //Variablen fuer auto_sens_ctr()
Jules20 0:b72d86a7b005 21 int cnt_Err; //Zaehler fuer aufeinanderfolgende Fehler bei der Kantendetektion
Jules20 0:b72d86a7b005 22 int allow_Err=10; //zulaessige Anzahl aufeinanderfolgender Fehler bei der Kantendetektion
Jules20 0:b72d86a7b005 23 int auto_curPx; //Wert des aktuellen Kantenpixel
Jules20 0:b72d86a7b005 24 int auto_forPx; //Wert des vorhergehenden Kantenpixel
Jules20 0:b72d86a7b005 25 int threshDiff=15; //zulaessige Abweichung zu vorhergehendem Kantenpixel in Anzahl Pixel
Jules20 0:b72d86a7b005 26 Ticker tickerReg; //Ticker, der das Auslesen des Sensors und die Reglung taktet
Jules20 0:b72d86a7b005 27
Jules20 0:b72d86a7b005 28
Jules20 0:b72d86a7b005 29 //Variablen fuer auto_sollPx_set()
Jules20 0:b72d86a7b005 30 int auto_sollPx; //zwischenspeichern des Sollwertes
Jules20 0:b72d86a7b005 31 //Variablen fuer auto_kp_set()
Jules20 0:b72d86a7b005 32 float main_kp; //zwischenschpeichern von kp
Jules20 0:b72d86a7b005 33
Jules20 0:b72d86a7b005 34 void auto_setup()
Jules20 0:b72d86a7b005 35 {
Jules20 0:b72d86a7b005 36 cnt_Err=0;
Jules20 0:b72d86a7b005 37 t.reset();
Jules20 0:b72d86a7b005 38 t.start();
Jules20 0:b72d86a7b005 39
Jules20 0:b72d86a7b005 40 while(1) { //Finde Kante in Toleranzbereich
Jules20 0:b72d86a7b005 41 auto_curPx=edgePx_get();//Sensor auslesen
Jules20 0:b72d86a7b005 42 if(auto_curPx>minPx && auto_curPx<maxPx) {
Jules20 0:b72d86a7b005 43
Jules20 0:b72d86a7b005 44 t.stop();
Jules20 0:b72d86a7b005 45 regler_setup();
Jules20 0:b72d86a7b005 46 lcd.cls();
Jules20 0:b72d86a7b005 47 lcd.locate(0,0);
Jules20 0:b72d86a7b005 48 lcd.printf("Auto SOLL=%i",regler_sollPx_get());
Jules20 0:b72d86a7b005 49 lcd.locate(0,1);
Jules20 0:b72d86a7b005 50 lcd.printf(">kp >soll >hand");
Jules20 0:b72d86a7b005 51 //Ticker fuer Taktung der Reglung mit Funktion verknuepfen,Abtastrate TA
Jules20 0:b72d86a7b005 52
Jules20 0:b72d86a7b005 53 tickerReg.attach(&auto_sens_ctr,TA);
Jules20 0:b72d86a7b005 54
Jules20 0:b72d86a7b005 55 break;
Jules20 0:b72d86a7b005 56 } else {
Jules20 0:b72d86a7b005 57 lcd.cls();
Jules20 0:b72d86a7b005 58 lcd.locate(0,0);
Jules20 0:b72d86a7b005 59 lcd.printf("Detektion nicht moeglich.");
Jules20 0:b72d86a7b005 60
Jules20 0:b72d86a7b005 61 }
Jules20 0:b72d86a7b005 62 }
Jules20 0:b72d86a7b005 63
Jules20 0:b72d86a7b005 64
Jules20 0:b72d86a7b005 65 }
Jules20 0:b72d86a7b005 66
Jules20 0:b72d86a7b005 67 void auto_end()
Jules20 0:b72d86a7b005 68 {
Jules20 0:b72d86a7b005 69 tickerReg.detach();//Ticker fuer Taktung der Reglung beenden
Jules20 0:b72d86a7b005 70 regler_end();//Reglerparameter in Datei speichern
Jules20 0:b72d86a7b005 71 }
Jules20 0:b72d86a7b005 72
Jules20 0:b72d86a7b005 73 void auto_sens_ctr()
Jules20 0:b72d86a7b005 74 {
Jules20 0:b72d86a7b005 75 auto_forPx=auto_curPx;
Jules20 0:b72d86a7b005 76 auto_curPx=edgePx_get();//Sensor auslesen
Jules20 0:b72d86a7b005 77
Jules20 0:b72d86a7b005 78 if(auto_curPx<0) {
Jules20 0:b72d86a7b005 79 //Fehler bei Kantendetektion
Jules20 0:b72d86a7b005 80 cnt_Err++;
Jules20 0:b72d86a7b005 81 //nehme vorhergehenden Wert an, solange bis cnt_Err Grenzwert erreicht
Jules20 0:b72d86a7b005 82 auto_curPx=auto_forPx;
Jules20 0:b72d86a7b005 83 } else if(abs(auto_forPx-auto_curPx)>threshDiff) {
Jules20 0:b72d86a7b005 84 //Differenz zu vorhergendem Wert zu gross
Jules20 0:b72d86a7b005 85 cnt_Err++;
Jules20 0:b72d86a7b005 86 //nehme vorherhegenden an, solange bis cnt_Err Grenzwert erreicht
Jules20 0:b72d86a7b005 87 auto_curPx=auto_forPx;
Jules20 0:b72d86a7b005 88 } else { //Kantendetektion erfolgreich
Jules20 0:b72d86a7b005 89 cnt_Err=0; //setze zul. Fehler auf 0
Jules20 0:b72d86a7b005 90 }
Jules20 0:b72d86a7b005 91
Jules20 0:b72d86a7b005 92 if(cnt_Err<allow_Err) {
Jules20 0:b72d86a7b005 93 //fuehre Regelungalgorithmus aus
Jules20 0:b72d86a7b005 94 control(auto_curPx);
Jules20 0:b72d86a7b005 95 } else {
Jules20 0:b72d86a7b005 96 //NOTAUS, schalte Motor bewegungslos, keine Meldung auf Display
Jules20 0:b72d86a7b005 97 mtr_period_set(0); //Motor bewegungslos schalten
Jules20 0:b72d86a7b005 98 }
Jules20 0:b72d86a7b005 99
Jules20 0:b72d86a7b005 100 //fuehre Regelungalgorithmus aus
Jules20 0:b72d86a7b005 101 control(auto_curPx);
Jules20 0:b72d86a7b005 102 }
Jules20 0:b72d86a7b005 103
Jules20 0:b72d86a7b005 104 void auto_sollPx_set()
Jules20 0:b72d86a7b005 105 {
Jules20 0:b72d86a7b005 106 auto_sollPx=regler_sollPx_get();
Jules20 0:b72d86a7b005 107 lcd.cls();
Jules20 0:b72d86a7b005 108 lcd.locate(0,0);
Jules20 0:b72d86a7b005 109 lcd.printf("SOLL=%i", auto_sollPx);
Jules20 0:b72d86a7b005 110 lcd.locate(0,1);
Jules20 0:b72d86a7b005 111 lcd.printf(">+ >- >auto");
Jules20 0:b72d86a7b005 112 while(1) {
Jules20 0:b72d86a7b005 113 if(butLe==1 && debLe.read_ms()>500) {
Jules20 0:b72d86a7b005 114 //erhoehe sollwert
Jules20 0:b72d86a7b005 115 debLe.reset();
Jules20 0:b72d86a7b005 116 auto_sollPx=auto_sollPx+1;
Jules20 0:b72d86a7b005 117 regler_sollPx_set(auto_sollPx);
Jules20 0:b72d86a7b005 118 lcd.locate(0,0);
Jules20 0:b72d86a7b005 119 lcd.printf("SOLL=%i", auto_sollPx);
Jules20 0:b72d86a7b005 120 } else if(butMi==1 && debMi.read_ms()>500) {
Jules20 0:b72d86a7b005 121 //erhoehe sollwert
Jules20 0:b72d86a7b005 122 debMi.reset();
Jules20 0:b72d86a7b005 123 auto_sollPx=auto_sollPx-1;
Jules20 0:b72d86a7b005 124 regler_sollPx_set(auto_sollPx);
Jules20 0:b72d86a7b005 125 lcd.locate(0,0);
Jules20 0:b72d86a7b005 126 lcd.printf("SOLL=%i", auto_sollPx);
Jules20 0:b72d86a7b005 127 } else if(butRi==1 && debRi.read_ms()>500) {
Jules20 0:b72d86a7b005 128 //verlasse while schleife zum aendern von soll
Jules20 0:b72d86a7b005 129 debRi.reset();
Jules20 0:b72d86a7b005 130 lcd.cls();
Jules20 0:b72d86a7b005 131 lcd.locate(0,0);
Jules20 0:b72d86a7b005 132 lcd.printf("Auto SOLL=%i",regler_sollPx_get());
Jules20 0:b72d86a7b005 133 lcd.locate(0,1);
Jules20 0:b72d86a7b005 134 lcd.printf(">kp >soll >hand");
Jules20 0:b72d86a7b005 135 break;
Jules20 0:b72d86a7b005 136 }
Jules20 0:b72d86a7b005 137 }
Jules20 0:b72d86a7b005 138 }
Jules20 0:b72d86a7b005 139 void auto_kp_set()
Jules20 0:b72d86a7b005 140 {
Jules20 0:b72d86a7b005 141 main_kp=regler_kp_get();
Jules20 0:b72d86a7b005 142 lcd.cls();
Jules20 0:b72d86a7b005 143 lcd.locate(0,0);
Jules20 0:b72d86a7b005 144 lcd.printf("kp=%.1f", main_kp);
Jules20 0:b72d86a7b005 145 lcd.locate(0,1);
Jules20 0:b72d86a7b005 146 lcd.printf(">+ >- >auto");
Jules20 0:b72d86a7b005 147 while(1) {
Jules20 0:b72d86a7b005 148 if(butLe==1 && debLe.read_ms()>500) {
Jules20 0:b72d86a7b005 149 //erhoehe kp
Jules20 0:b72d86a7b005 150 debLe.reset();
Jules20 0:b72d86a7b005 151 main_kp=main_kp+0.1;
Jules20 0:b72d86a7b005 152 regler_kp_set(main_kp);
Jules20 0:b72d86a7b005 153 lcd.locate(0,0);
Jules20 0:b72d86a7b005 154 lcd.printf("kp=%.1f", main_kp);
Jules20 0:b72d86a7b005 155 } else if(butMi==1 && debMi.read_ms()>500) {
Jules20 0:b72d86a7b005 156 //verringere kp
Jules20 0:b72d86a7b005 157 debMi.reset();
Jules20 0:b72d86a7b005 158 main_kp=main_kp-0.1;
Jules20 0:b72d86a7b005 159 regler_kp_set(main_kp);
Jules20 0:b72d86a7b005 160 lcd.locate(0,0);
Jules20 0:b72d86a7b005 161 lcd.printf("kp=%.1f", main_kp);
Jules20 0:b72d86a7b005 162 } else if(butRi==1 && debRi.read_ms()>500) {
Jules20 0:b72d86a7b005 163 //verlasse while schleife zum aendern kp
Jules20 0:b72d86a7b005 164 debRi.reset();
Jules20 0:b72d86a7b005 165 lcd.cls();
Jules20 0:b72d86a7b005 166 lcd.locate(0,0);
Jules20 0:b72d86a7b005 167 lcd.printf("Auto SOLL=%i",regler_sollPx_get());
Jules20 0:b72d86a7b005 168 lcd.locate(0,1);
Jules20 0:b72d86a7b005 169 lcd.printf(">kp >soll >hand");
Jules20 0:b72d86a7b005 170 break;
Jules20 0:b72d86a7b005 171 }
Jules20 0:b72d86a7b005 172 }
Jules20 0:b72d86a7b005 173 }