Code für die Regelungsplatine
Dependencies: mbed-dev
main.cpp@0:e06857c6841e, 2017-05-10 (annotated)
- 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?
User | Revision | Line number | New 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(®ler_zustand,Ta_zustand); |
David_90210 | 0:e06857c6841e | 116 | //regelung_strom.attach(®ler_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 | } |