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 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", &regler_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 }