Code für die Regelungsplatine

Dependencies:   mbed-dev

Committer:
David_90210
Date:
Wed May 10 09:32:51 2017 +0000
Revision:
0:e06857c6841e
Code f?r die Regelungsplatine

Who changed what in which revision?

UserRevisionLine numberNew contents of line
David_90210 0:e06857c6841e 1 /*
David_90210 0:e06857c6841e 2 Versuche um die 24. mal Problematik zu lösen:
David_90210 0:e06857c6841e 3 1. Zeile einfügen:
David_90210 0:e06857c6841e 4 ------------code-----------
David_90210 0:e06857c6841e 5 RCC->APB1ENR |= 0x24000000; // Enable Interface clock for DAC1 and DAC2
David_90210 0:e06857c6841e 6 ------------code-----------
David_90210 0:e06857c6841e 7 2. Analog Ausgang anders programmieren Programmzeilen für die Registerprogrammierung entfernen
David_90210 0:e06857c6841e 8 ------------code-----------
David_90210 0:e06857c6841e 9 aout1.write((512.0f*stellges_spannung+2047.0f)/4095.0f);
David_90210 0:e06857c6841e 10 aout1.write(0.5);
David_90210 0:e06857c6841e 11 ------------code-----------
David_90210 0:e06857c6841e 12 3. Zeilen entfernen:
David_90210 0:e06857c6841e 13 ------------code-----------
David_90210 0:e06857c6841e 14 AnalogOut aout(PA_4); //A3 wird zunächst nicht gebraucht
David_90210 0:e06857c6841e 15 AnalogOut aout1(PA_5); //A4 Ausgabespannung für Motor 1
David_90210 0:e06857c6841e 16 AnalogOut aout2(PA_6); //A5 Ausgabespannung für Motor 2
David_90210 0:e06857c6841e 17 ------------code-----------
David_90210 0:e06857c6841e 18 4. ohne die spezifische Library sondern mit der gelieferten
David_90210 0:e06857c6841e 19 mbed library
David_90210 0:e06857c6841e 20 */
David_90210 0:e06857c6841e 21
David_90210 0:e06857c6841e 22 #include "mbed.h"
David_90210 0:e06857c6841e 23 #include "strdup.h"
David_90210 0:e06857c6841e 24
David_90210 0:e06857c6841e 25 //#include <stdio.h>
David_90210 0:e06857c6841e 26
David_90210 0:e06857c6841e 27 Serial pc(SERIAL_TX, SERIAL_RX);
David_90210 0:e06857c6841e 28
David_90210 0:e06857c6841e 29 Ticker regelung_strom;
David_90210 0:e06857c6841e 30 Ticker regelung_zustand;
David_90210 0:e06857c6841e 31
David_90210 0:e06857c6841e 32 DigitalOut out5(PA_11);
David_90210 0:e06857c6841e 33
David_90210 0:e06857c6841e 34 /*
David_90210 0:e06857c6841e 35 AnalogOut aout(PA_4); //A3 wird zunächst nicht gebraucht
David_90210 0:e06857c6841e 36 AnalogOut aout1(PA_5); //A4 Ausgabespannung für Motor 1
David_90210 0:e06857c6841e 37 AnalogOut aout2(PA_6); //A5 Ausgabespannung für Motor 2
David_90210 0:e06857c6841e 38 */
David_90210 0:e06857c6841e 39
David_90210 0:e06857c6841e 40 AnalogIn ain1(PA_1); //A0 Messung des Stromsensors von Motor 1
David_90210 0:e06857c6841e 41 AnalogIn ain2(PA_0); //A1 Messung des Stromsensors von Motor 2
David_90210 0:e06857c6841e 42 AnalogIn ain4(PA_3); //A2 Messung der Drehzahl von Motor 1 !!!!!!!!!!!!!!!!!!!! MOTOREN VERTAUSCHT
David_90210 0:e06857c6841e 43 AnalogIn ain3(PA_7); //A6 Messung der Drehzahl von Motor 2
David_90210 0:e06857c6841e 44
David_90210 0:e06857c6841e 45 unsigned int i;
David_90210 0:e06857c6841e 46 unsigned int j;
David_90210 0:e06857c6841e 47 int Kennwert0, Kennwert1, Kennwert2, Kennwert3, Kennwert4;
David_90210 0:e06857c6841e 48
David_90210 0:e06857c6841e 49 //**************************************************************//
David_90210 0:e06857c6841e 50 //Deklaration und Funktionen für Stromregelung //
David_90210 0:e06857c6841e 51 //**************************************************************//
David_90210 0:e06857c6841e 52
David_90210 0:e06857c6841e 53 int Kp_strom = 0;
David_90210 0:e06857c6841e 54 int Ki_strom = 0;
David_90210 0:e06857c6841e 55 float Ta_strom = 0.0001;
David_90210 0:e06857c6841e 56 int sollstrom = 0; //gerade so kein drehen
David_90210 0:e06857c6841e 57
David_90210 0:e06857c6841e 58 float meas1, meas2, ai_real1, ai_real2, stromwert1, stromwert2;
David_90210 0:e06857c6841e 59 float stellP_strom, stellI_strom_alt, stellI_strom, stellges_spannung;
David_90210 0:e06857c6841e 60
David_90210 0:e06857c6841e 61 float stromsensor1(void);
David_90210 0:e06857c6841e 62 float stromsensor2(void);
David_90210 0:e06857c6841e 63 void pi_regler_strom(int, float);
David_90210 0:e06857c6841e 64
David_90210 0:e06857c6841e 65 //void set_stellgroesse_spannung(float);
David_90210 0:e06857c6841e 66
David_90210 0:e06857c6841e 67 //**************************************************************//
David_90210 0:e06857c6841e 68 //Deklaration und Funktionen für Drehzahlmessung //
David_90210 0:e06857c6841e 69 //**************************************************************//
David_90210 0:e06857c6841e 70
David_90210 0:e06857c6841e 71 float meas3, meas4, ai_real3, ai_real4, drehzahl1, drehzahl2;
David_90210 0:e06857c6841e 72
David_90210 0:e06857c6841e 73 float drehzahlsensor1(void);
David_90210 0:e06857c6841e 74 float drehzahlsensor2(void);
David_90210 0:e06857c6841e 75
David_90210 0:e06857c6841e 76 //**************************************************************//
David_90210 0:e06857c6841e 77 //Deklaration und Funktionen für die Zustandsregelung //
David_90210 0:e06857c6841e 78 //**************************************************************//
David_90210 0:e06857c6841e 79
David_90210 0:e06857c6841e 80 int K_faktor = 0;
David_90210 0:e06857c6841e 81 float Ta_zustand = 0.0001;
David_90210 0:e06857c6841e 82 int M_soll = 0;
David_90210 0:e06857c6841e 83 int M_stell = 0 ;
David_90210 0:e06857c6841e 84 void zustandsregler(float, float, float);
David_90210 0:e06857c6841e 85
David_90210 0:e06857c6841e 86 //**************************************************************//
David_90210 0:e06857c6841e 87 //Deklaration und Funktionen für das Einlesen der Bytes //
David_90210 0:e06857c6841e 88 //**************************************************************//
David_90210 0:e06857c6841e 89 char a;
David_90210 0:e06857c6841e 90 char c[99];
David_90210 0:e06857c6841e 91 char *ptr;
David_90210 0:e06857c6841e 92 char *ptr2=c;
David_90210 0:e06857c6841e 93 char *my_tokens[10] = { 0 };
David_90210 0:e06857c6841e 94 int parameter[10];
David_90210 0:e06857c6841e 95 void read_parameter(void);
David_90210 0:e06857c6841e 96
David_90210 0:e06857c6841e 97 void regler_strom() {
David_90210 0:e06857c6841e 98 pi_regler_strom(sollstrom, stromsensor1());
David_90210 0:e06857c6841e 99 }
David_90210 0:e06857c6841e 100
David_90210 0:e06857c6841e 101 void regler_zustand() {
David_90210 0:e06857c6841e 102 zustandsregler(stromsensor1(), drehzahlsensor1(), drehzahlsensor2());
David_90210 0:e06857c6841e 103 }
David_90210 0:e06857c6841e 104
David_90210 0:e06857c6841e 105 int main () {
David_90210 0:e06857c6841e 106 pc.baud(9600);
David_90210 0:e06857c6841e 107
David_90210 0:e06857c6841e 108 RCC->APB1ENR |= 0x24000000; // Enable Clock for DAC
David_90210 0:e06857c6841e 109 GPIOA->MODER |= 0x00003f00; // MODE PortA, PA4 PA5 & PA6 are analog!
David_90210 0:e06857c6841e 110 DAC->CR |= 0x00030003; // DAC control reg, both channels ON
David_90210 0:e06857c6841e 111 DAC2->CR |= 0x00000003; // DAC2 control reg channel 1 ON
David_90210 0:e06857c6841e 112
David_90210 0:e06857c6841e 113 wait(0.1);
David_90210 0:e06857c6841e 114
David_90210 0:e06857c6841e 115 regelung_zustand.attach(&regler_zustand,Ta_zustand);
David_90210 0:e06857c6841e 116 //regelung_strom.attach(&regler_strom, Ta_strom);
David_90210 0:e06857c6841e 117
David_90210 0:e06857c6841e 118 while (1) { // infinite loop
David_90210 0:e06857c6841e 119 read_parameter();
David_90210 0:e06857c6841e 120 }
David_90210 0:e06857c6841e 121 }
David_90210 0:e06857c6841e 122
David_90210 0:e06857c6841e 123 float stromsensor1()
David_90210 0:e06857c6841e 124 {
David_90210 0:e06857c6841e 125 meas1 = ain1.read();
David_90210 0:e06857c6841e 126 ai_real1 = 2.424242f*(meas1*3.3f)-4.0f;
David_90210 0:e06857c6841e 127 stromwert1 = ai_real1*1.25f;
David_90210 0:e06857c6841e 128 //printf("ADC Wert: %f reale Eingangsspannung vor OPV: %f V Stromwert Motor 1: %f A Durchschnitt Strom %f A\n", (meas1*3.3f), ai_real1, stromwert1, avg_stromwert);
David_90210 0:e06857c6841e 129 return stromwert1; //hier gehört stromwert1 herein
David_90210 0:e06857c6841e 130 }
David_90210 0:e06857c6841e 131
David_90210 0:e06857c6841e 132 float stromsensor2()
David_90210 0:e06857c6841e 133 {
David_90210 0:e06857c6841e 134 meas2 = ain2.read();
David_90210 0:e06857c6841e 135 ai_real2=6.06060606f*(meas2*3.3f)-10.0f;
David_90210 0:e06857c6841e 136 stromwert2 = 7.575757f*(meas2*3.3f)-12.5f;
David_90210 0:e06857c6841e 137 //printf("reale Eingangsspannung an Analog Input 2:%f Volt umgerechneter Strom Motor 2: %f Ampere \n", ai_real2, stromwert2);
David_90210 0:e06857c6841e 138 return stromwert2;
David_90210 0:e06857c6841e 139 }
David_90210 0:e06857c6841e 140
David_90210 0:e06857c6841e 141 float drehzahlsensor1()
David_90210 0:e06857c6841e 142 {
David_90210 0:e06857c6841e 143 meas3 = ain3.read();
David_90210 0:e06857c6841e 144 ai_real3=6.06060606f*(meas3*3.3f)-10.0f;
David_90210 0:e06857c6841e 145 drehzahl1 = ai_real3/4.0f;
David_90210 0:e06857c6841e 146 //printf("reale Eingangsspannung an Analog Input 3:%f Volt umgerechnete Drehzahl Motor 1: %f Hz \n", ai_real3, drehzahl1);
David_90210 0:e06857c6841e 147 return drehzahl1;
David_90210 0:e06857c6841e 148 }
David_90210 0:e06857c6841e 149
David_90210 0:e06857c6841e 150 float drehzahlsensor2()
David_90210 0:e06857c6841e 151 {
David_90210 0:e06857c6841e 152 meas4 = ain4.read();
David_90210 0:e06857c6841e 153 ai_real4=6.06060606f*(meas4*3.3f)-10.0f;
David_90210 0:e06857c6841e 154 drehzahl2 = ai_real4/4.0f;
David_90210 0:e06857c6841e 155 //printf("reale Eingangsspannung an Analog Input 4:%f Volt umgerechnete Drehzahl Motor 2: %f Hz \n", ai_real4, drehzahl2);
David_90210 0:e06857c6841e 156 return drehzahl2;
David_90210 0:e06857c6841e 157 }
David_90210 0:e06857c6841e 158
David_90210 0:e06857c6841e 159 void zustandsregler(float strom, float dreh1, float dreh2) {
David_90210 0:e06857c6841e 160 M_stell = K_faktor*((int)(1000*dreh1-1000*dreh2));
David_90210 0:e06857c6841e 161 M_stell = M_stell/50;
David_90210 0:e06857c6841e 162 pi_regler_strom(M_soll+M_stell, strom);
David_90210 0:e06857c6841e 163 }
David_90210 0:e06857c6841e 164
David_90210 0:e06857c6841e 165 void pi_regler_strom(int soll, float ist) {
David_90210 0:e06857c6841e 166
David_90210 0:e06857c6841e 167 float regelabweichung_strom = 0;
David_90210 0:e06857c6841e 168 out5 = 1;
David_90210 0:e06857c6841e 169 regelabweichung_strom = soll*0.01f - ist;
David_90210 0:e06857c6841e 170 out5 = 0;
David_90210 0:e06857c6841e 171 stellP_strom = Kp_strom*0.01f*regelabweichung_strom;
David_90210 0:e06857c6841e 172
David_90210 0:e06857c6841e 173 stellI_strom_alt = stellI_strom;
David_90210 0:e06857c6841e 174 stellI_strom = Ki_strom*0.01f*Ta_strom*regelabweichung_strom+stellI_strom_alt;
David_90210 0:e06857c6841e 175
David_90210 0:e06857c6841e 176 if (stellI_strom > 4.0f) {
David_90210 0:e06857c6841e 177 stellI_strom = 4.0f;
David_90210 0:e06857c6841e 178 }
David_90210 0:e06857c6841e 179 else if (stellI_strom < 0.0f) {
David_90210 0:e06857c6841e 180 stellI_strom = 0.0f;
David_90210 0:e06857c6841e 181 }
David_90210 0:e06857c6841e 182 stellges_spannung = stellP_strom + stellI_strom;
David_90210 0:e06857c6841e 183 if (stellges_spannung > 4.0f) {
David_90210 0:e06857c6841e 184 stellges_spannung = 4.0f;
David_90210 0:e06857c6841e 185 }
David_90210 0:e06857c6841e 186 else if (stellges_spannung < 0.0f) {
David_90210 0:e06857c6841e 187 stellges_spannung = 0.0f;
David_90210 0:e06857c6841e 188 }
David_90210 0:e06857c6841e 189 //return stellges_spannung;
David_90210 0:e06857c6841e 190 if (stellges_spannung >= 0) {
David_90210 0:e06857c6841e 191 DAC->DHR12R2=((int)(512.0f*stellges_spannung+2047.0f));
David_90210 0:e06857c6841e 192 }
David_90210 0:e06857c6841e 193 else {
David_90210 0:e06857c6841e 194 DAC->DHR12R2=2047;
David_90210 0:e06857c6841e 195 }
David_90210 0:e06857c6841e 196 //printf("soll strom: %f, iststrom: %f, regelabweichung: %f, stellP: %f, stellI_alt: %f, stellI: %f, Stellgroesse Spannung: %f \n", soll, ist, regelabweichung_strom, stellP_strom, stellI_strom_alt, stellI_strom, stellges_spannung);
David_90210 0:e06857c6841e 197
David_90210 0:e06857c6841e 198 }
David_90210 0:e06857c6841e 199
David_90210 0:e06857c6841e 200 void read_parameter() {
David_90210 0:e06857c6841e 201 while (pc.readable()) {
David_90210 0:e06857c6841e 202
David_90210 0:e06857c6841e 203 a = pc.getc();
David_90210 0:e06857c6841e 204
David_90210 0:e06857c6841e 205 //if character is $ than it is the start of a sentence
David_90210 0:e06857c6841e 206 if (a == '$') {
David_90210 0:e06857c6841e 207 //b.clear();
David_90210 0:e06857c6841e 208 //c[0] = '\0';
David_90210 0:e06857c6841e 209 i=0; //write buffer character to big buffer string
David_90210 0:e06857c6841e 210 }
David_90210 0:e06857c6841e 211 //b += a;
David_90210 0:e06857c6841e 212 //c[i]=a;
David_90210 0:e06857c6841e 213
David_90210 0:e06857c6841e 214 //if the character is # than the end of the sentence is reached and some stuff has to be done
David_90210 0:e06857c6841e 215 if (a == '#')
David_90210 0:e06857c6841e 216 {
David_90210 0:e06857c6841e 217 //b.erase(0,1);
David_90210 0:e06857c6841e 218 //b.erase(b.length()-1,1);
David_90210 0:e06857c6841e 219 //rpm=atoi(b.c_str());
David_90210 0:e06857c6841e 220 //pc.printf("String: %s \n Drehzahl: %d \n", b, rpm);
David_90210 0:e06857c6841e 221 c[0] = '0';
David_90210 0:e06857c6841e 222 ptr = strtok(c, ",");
David_90210 0:e06857c6841e 223 j=0;
David_90210 0:e06857c6841e 224 while(ptr != NULL)
David_90210 0:e06857c6841e 225 {
David_90210 0:e06857c6841e 226 //my_tokens[j] = strdup(ptr);
David_90210 0:e06857c6841e 227 // naechsten Abschnitt erstellen
David_90210 0:e06857c6841e 228 parameter[j]=atoi(ptr);
David_90210 0:e06857c6841e 229 printf("\n %d \n",parameter[j]);
David_90210 0:e06857c6841e 230 ptr = strtok(NULL, ",");
David_90210 0:e06857c6841e 231 //arrays[i]=str;
David_90210 0:e06857c6841e 232 j++;
David_90210 0:e06857c6841e 233 }
David_90210 0:e06857c6841e 234 pc.putc('\n');
David_90210 0:e06857c6841e 235 Kp_strom = parameter[0];
David_90210 0:e06857c6841e 236 pc.putc('0');
David_90210 0:e06857c6841e 237 Ki_strom = parameter[1];
David_90210 0:e06857c6841e 238 pc.putc('1');
David_90210 0:e06857c6841e 239 sollstrom = parameter[2];
David_90210 0:e06857c6841e 240 pc.putc('2');
David_90210 0:e06857c6841e 241 K_faktor = parameter[3];
David_90210 0:e06857c6841e 242 pc.putc('3');
David_90210 0:e06857c6841e 243 M_soll = parameter[4];
David_90210 0:e06857c6841e 244 pc.putc('4');
David_90210 0:e06857c6841e 245 Kennwert0 = parameter[5];
David_90210 0:e06857c6841e 246 pc.putc('5');
David_90210 0:e06857c6841e 247 Kennwert1 = parameter[6];
David_90210 0:e06857c6841e 248 pc.putc('6');
David_90210 0:e06857c6841e 249 Kennwert2 = parameter[7];
David_90210 0:e06857c6841e 250 pc.putc('7');
David_90210 0:e06857c6841e 251 Kennwert3 = parameter[8];
David_90210 0:e06857c6841e 252 pc.putc('8');
David_90210 0:e06857c6841e 253 Kennwert4 = parameter[9];
David_90210 0:e06857c6841e 254 if (Kennwert4==66) {
David_90210 0:e06857c6841e 255 pc.putc('9');
David_90210 0:e06857c6841e 256 }
David_90210 0:e06857c6841e 257 a='\0';
David_90210 0:e06857c6841e 258 for(i=0; i<=99; i++)
David_90210 0:e06857c6841e 259 {
David_90210 0:e06857c6841e 260 c[i]='\0';
David_90210 0:e06857c6841e 261 }
David_90210 0:e06857c6841e 262 }
David_90210 0:e06857c6841e 263 c[i]=a;
David_90210 0:e06857c6841e 264 i++;
David_90210 0:e06857c6841e 265
David_90210 0:e06857c6841e 266 }
David_90210 0:e06857c6841e 267
David_90210 0:e06857c6841e 268 }