
Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.
regler.cpp@0:b72d86a7b005, 2016-05-31 (annotated)
- Committer:
- Jules20
- Date:
- Tue May 31 03:06:27 2016 +0000
- Revision:
- 0:b72d86a7b005
Committed May 2016
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jules20 | 0:b72d86a7b005 | 1 | /** |
Jules20 | 0:b72d86a7b005 | 2 | *Funktionen des P-Regleralgorithmus |
Jules20 | 0:b72d86a7b005 | 3 | * |
Jules20 | 0:b72d86a7b005 | 4 | *CPP-Datei regler_func.cpp |
Jules20 | 0:b72d86a7b005 | 5 | * |
Jules20 | 0:b72d86a7b005 | 6 | *@version: 01.11.2015 |
Jules20 | 0:b72d86a7b005 | 7 | *@author: Gustav Grether & Julian Mueller |
Jules20 | 0:b72d86a7b005 | 8 | */ |
Jules20 | 0:b72d86a7b005 | 9 | |
Jules20 | 0:b72d86a7b005 | 10 | |
Jules20 | 0:b72d86a7b005 | 11 | #include "regler.h" |
Jules20 | 0:b72d86a7b005 | 12 | |
Jules20 | 0:b72d86a7b005 | 13 | //Dateisystem zum speichern der Reglerparameter |
Jules20 | 0:b72d86a7b005 | 14 | LocalFileSystem local("local"); |
Jules20 | 0:b72d86a7b005 | 15 | |
Jules20 | 0:b72d86a7b005 | 16 | int regler_sollPx=64; //Sollwerte fuer Kantenpixel |
Jules20 | 0:b72d86a7b005 | 17 | int e;//Regeldifferenz |
Jules20 | 0:b72d86a7b005 | 18 | float regler_kp=1.0; //zwischenspeichern Proportinalverstaerkung Regler |
Jules20 | 0:b72d86a7b005 | 19 | float k0=250.0;//Proportionalverstaerkung Regler bei kp=1.0 |
Jules20 | 0:b72d86a7b005 | 20 | |
Jules20 | 0:b72d86a7b005 | 21 | float f;//Stellgroesse in Frequenz [Hz] |
Jules20 | 0:b72d86a7b005 | 22 | float fmax=2500.0; //max. Frequenz [Hz], Stellgroessenbegrenzung |
Jules20 | 0:b72d86a7b005 | 23 | |
Jules20 | 0:b72d86a7b005 | 24 | int T;//Stellgroesse als Periodendauer [us] |
Jules20 | 0:b72d86a7b005 | 25 | int Tmin=floor(1.0/fmax*1000000.0); //Stellgroessenbegrenzung als Periodendauer |
Jules20 | 0:b72d86a7b005 | 26 | |
Jules20 | 0:b72d86a7b005 | 27 | void regler_setup() |
Jules20 | 0:b72d86a7b005 | 28 | { |
Jules20 | 0:b72d86a7b005 | 29 | //Einlesen der Reglerparamter aus Dateien |
Jules20 | 0:b72d86a7b005 | 30 | //Einlesen des Soll Pixels |
Jules20 | 0:b72d86a7b005 | 31 | FILE* inFileSoll = fopen ("/local/sollwert.txt","r"); |
Jules20 | 0:b72d86a7b005 | 32 | if(inFileSoll!=NULL) {//Datei geoeffnet |
Jules20 | 0:b72d86a7b005 | 33 | regler_sollPx = fgetc(inFileSoll); |
Jules20 | 0:b72d86a7b005 | 34 | } else {//Datei konnte nicht geoeffnet werden |
Jules20 | 0:b72d86a7b005 | 35 | regler_sollPx=64; |
Jules20 | 0:b72d86a7b005 | 36 | } |
Jules20 | 0:b72d86a7b005 | 37 | if(regler_sollPx<40 || regler_sollPx>90) { |
Jules20 | 0:b72d86a7b005 | 38 | //SollPx nicht in realistischem Bereich, evtl. Fehler in Datei |
Jules20 | 0:b72d86a7b005 | 39 | regler_sollPx=64; |
Jules20 | 0:b72d86a7b005 | 40 | } |
Jules20 | 0:b72d86a7b005 | 41 | fclose(inFileSoll); |
Jules20 | 0:b72d86a7b005 | 42 | |
Jules20 | 0:b72d86a7b005 | 43 | //Einlesen von kp |
Jules20 | 0:b72d86a7b005 | 44 | FILE* inFilekp = fopen ("/local/kp.txt","r"); |
Jules20 | 0:b72d86a7b005 | 45 | if(inFileSoll!=NULL) {//Datei geoeffnet |
Jules20 | 0:b72d86a7b005 | 46 | fscanf (inFilekp, "%f", ®ler_kp);} |
Jules20 | 0:b72d86a7b005 | 47 | else {//Datei konnte nicht geoeffnet werden |
Jules20 | 0:b72d86a7b005 | 48 | regler_kp=1.0; |
Jules20 | 0:b72d86a7b005 | 49 | } |
Jules20 | 0:b72d86a7b005 | 50 | if(regler_kp<0.4 || regler_kp>3.0) { |
Jules20 | 0:b72d86a7b005 | 51 | //kp nicht in realistischem Bereich, evtl. Fehler in Datei |
Jules20 | 0:b72d86a7b005 | 52 | regler_kp=1.0; |
Jules20 | 0:b72d86a7b005 | 53 | } |
Jules20 | 0:b72d86a7b005 | 54 | |
Jules20 | 0:b72d86a7b005 | 55 | fclose(inFilekp); |
Jules20 | 0:b72d86a7b005 | 56 | } |
Jules20 | 0:b72d86a7b005 | 57 | |
Jules20 | 0:b72d86a7b005 | 58 | void regler_end() |
Jules20 | 0:b72d86a7b005 | 59 | { |
Jules20 | 0:b72d86a7b005 | 60 | FILE* outFileSoll = fopen("/local/sollwert.txt","w"); |
Jules20 | 0:b72d86a7b005 | 61 | fputc(regler_sollPx, outFileSoll); |
Jules20 | 0:b72d86a7b005 | 62 | fclose(outFileSoll); |
Jules20 | 0:b72d86a7b005 | 63 | |
Jules20 | 0:b72d86a7b005 | 64 | FILE* outFilekp = fopen("/local/kp.txt","w"); |
Jules20 | 0:b72d86a7b005 | 65 | fprintf(outFilekp,"%.1f",regler_kp); |
Jules20 | 0:b72d86a7b005 | 66 | fclose(outFilekp); |
Jules20 | 0:b72d86a7b005 | 67 | } |
Jules20 | 0:b72d86a7b005 | 68 | |
Jules20 | 0:b72d86a7b005 | 69 | void regler_sollPx_set(int sollPx) |
Jules20 | 0:b72d86a7b005 | 70 | { |
Jules20 | 0:b72d86a7b005 | 71 | regler_sollPx=sollPx; |
Jules20 | 0:b72d86a7b005 | 72 | } |
Jules20 | 0:b72d86a7b005 | 73 | |
Jules20 | 0:b72d86a7b005 | 74 | int regler_sollPx_get() |
Jules20 | 0:b72d86a7b005 | 75 | { |
Jules20 | 0:b72d86a7b005 | 76 | return regler_sollPx; |
Jules20 | 0:b72d86a7b005 | 77 | } |
Jules20 | 0:b72d86a7b005 | 78 | |
Jules20 | 0:b72d86a7b005 | 79 | void regler_kp_set(float kp) |
Jules20 | 0:b72d86a7b005 | 80 | { |
Jules20 | 0:b72d86a7b005 | 81 | regler_kp=kp; |
Jules20 | 0:b72d86a7b005 | 82 | } |
Jules20 | 0:b72d86a7b005 | 83 | |
Jules20 | 0:b72d86a7b005 | 84 | float regler_kp_get() |
Jules20 | 0:b72d86a7b005 | 85 | { |
Jules20 | 0:b72d86a7b005 | 86 | return regler_kp; |
Jules20 | 0:b72d86a7b005 | 87 | } |
Jules20 | 0:b72d86a7b005 | 88 | |
Jules20 | 0:b72d86a7b005 | 89 | |
Jules20 | 0:b72d86a7b005 | 90 | void control(int edgePx) |
Jules20 | 0:b72d86a7b005 | 91 | { |
Jules20 | 0:b72d86a7b005 | 92 | e=regler_sollPx-edgePx; |
Jules20 | 0:b72d86a7b005 | 93 | |
Jules20 | 0:b72d86a7b005 | 94 | if(e==0) {//keine Motorbewegung |
Jules20 | 0:b72d86a7b005 | 95 | if(mtr_period_get()!=0) { |
Jules20 | 0:b72d86a7b005 | 96 | T=0; |
Jules20 | 0:b72d86a7b005 | 97 | mtr_period_set(T); |
Jules20 | 0:b72d86a7b005 | 98 | } |
Jules20 | 0:b72d86a7b005 | 99 | |
Jules20 | 0:b72d86a7b005 | 100 | } else { |
Jules20 | 0:b72d86a7b005 | 101 | if(e<0) { //fahre in +y |
Jules20 | 0:b72d86a7b005 | 102 | mtr_dir_set(1); |
Jules20 | 0:b72d86a7b005 | 103 | } else if(e>0) { //fahre in -y |
Jules20 | 0:b72d86a7b005 | 104 | mtr_dir_set(0); |
Jules20 | 0:b72d86a7b005 | 105 | } |
Jules20 | 0:b72d86a7b005 | 106 | f=k0*regler_kp*abs(e);//Stellgroesse in [Hz] |
Jules20 | 0:b72d86a7b005 | 107 | |
Jules20 | 0:b72d86a7b005 | 108 | if(f>fmax) { //Stellgroessenbegrenzung,maximale Geschwindigkeit |
Jules20 | 0:b72d86a7b005 | 109 | T=Tmin;//Stellgroesse in [us] |
Jules20 | 0:b72d86a7b005 | 110 | lcd.locate(0,1); |
Jules20 | 0:b72d86a7b005 | 111 | } else { |
Jules20 | 0:b72d86a7b005 | 112 | T=floor(1.0/f*1000000.0); //Stellgroesse in [us] |
Jules20 | 0:b72d86a7b005 | 113 | } |
Jules20 | 0:b72d86a7b005 | 114 | mtr_period_set(T); |
Jules20 | 0:b72d86a7b005 | 115 | } |
Jules20 | 0:b72d86a7b005 | 116 | } |