03082014

Dependencies:   Buffer ConfigFile SDFileSystem mbed mon timer0

Fork of 15_PT1000 by Temp27

Committer:
rs27
Date:
Sun Aug 03 19:15:35 2014 +0000
Revision:
8:91ea38fc3675
Parent:
7:c1602e28a906
03082014

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 8:91ea38fc3675 1 // Version 16 03.08.2014
rs27 0:e248310dfcdb 2 // die Ausgabe auf das Format #nr val umgestellt
rs27 6:f53dd76c8806 3 // 03.08.14 Monitorbefehle hinzugefügt
rs27 0:e248310dfcdb 4
rs27 0:e248310dfcdb 5 #include "mbed.h"
rs27 2:f48d2eb0cc55 6 #include "ConfigFile.h"
rs27 2:f48d2eb0cc55 7 #include "SDFileSystem.h"
Sven3010 7:c1602e28a906 8 //#include "DS2482.h"
rs27 0:e248310dfcdb 9 #include "timer0.h"
rs27 0:e248310dfcdb 10 #include "Buffer.h"
rs27 8:91ea38fc3675 11 #include "mon.h"
rs27 0:e248310dfcdb 12
rs27 0:e248310dfcdb 13 #define CR 13
rs27 0:e248310dfcdb 14
rs27 6:f53dd76c8806 15 #define SOLL_WERT 27.0 // Sollwert für den Fühler in der Flüssigkeit
rs27 6:f53dd76c8806 16 #define R_TEMP_MAX 40.0 // Maximaltermperatur für den Widerstand
rs27 6:f53dd76c8806 17 #define OFFSET 28510 // AD Wert für 0° Abgleich
rs27 6:f53dd76c8806 18 //#define OFFSET 27100 // AD Wert für 0° Abgleich Steuerung Flosrian
rs27 6:f53dd76c8806 19 #define GAIN 113 // Digit pro °C >> 112.3 Steuerung Florian
rs27 6:f53dd76c8806 20 //#define GAIN 112.3 // Digit pro °C >> 112.3 Steuerung Florian
Sven3010 4:46365f765d30 21
rs27 6:f53dd76c8806 22 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 23 // Anlegen von Klassen
Sven3010 4:46365f765d30 24
rs27 2:f48d2eb0cc55 25 SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, "sd"); // The pinout (MOSI, MISO, SCLK, CS)
rs27 2:f48d2eb0cc55 26 timer0 down_timer; // Zeitsteuerung
rs27 2:f48d2eb0cc55 27 Serial pc(USBTX, USBRX); // tx, rx
rs27 6:f53dd76c8806 28 Serial com(PTC4, PTC3);
rs27 2:f48d2eb0cc55 29 Buffer <char> buf; // Ringbuffer für ankommende Zeichen
rs27 6:f53dd76c8806 30 // DS2482 ow(PTE0,PTE1,0x30); // sda, scl, adr
rs27 6:f53dd76c8806 31
rs27 0:e248310dfcdb 32
rs27 6:f53dd76c8806 33 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 34 // Zuordnung von Eingängen und Ausgängen
rs27 6:f53dd76c8806 35
rs27 6:f53dd76c8806 36 InterruptIn tropfen(PTA5); // Eingang für Tropfensensor
rs27 6:f53dd76c8806 37 PwmOut heizung(PTA13); // Ausgang für den PWM der die Heizung steuert
rs27 0:e248310dfcdb 38
rs27 0:e248310dfcdb 39 DigitalOut r(LED_RED);
rs27 0:e248310dfcdb 40 DigitalOut g(LED_GREEN);
rs27 0:e248310dfcdb 41 DigitalOut b(LED_BLUE);
rs27 0:e248310dfcdb 42
rs27 0:e248310dfcdb 43 DigitalOut led1(LED1);
rs27 0:e248310dfcdb 44 //DigitalOut LED2(PTA2);
Sven3010 4:46365f765d30 45 DigitalOut LED5(PTA4);
Sven3010 1:82c47e2d81f0 46 DigitalOut LED_4(PTA12);
rs27 0:e248310dfcdb 47
rs27 6:f53dd76c8806 48 // Schalter 4051 weden in der Andwendung nicht benötigt
rs27 0:e248310dfcdb 49 DigitalOut DC_A(PTE2);
rs27 0:e248310dfcdb 50 DigitalOut DC_B(PTE3);
rs27 0:e248310dfcdb 51 DigitalOut DC_C(PTE4);
rs27 0:e248310dfcdb 52 DigitalOut DC_EN(PTE5);
rs27 0:e248310dfcdb 53
rs27 6:f53dd76c8806 54 // PT1000 Karte 1 >> Analogeingänge auf der Grundkarte
rs27 0:e248310dfcdb 55 AnalogIn an1(PTC0);
rs27 0:e248310dfcdb 56 AnalogIn an2(PTB1);
rs27 0:e248310dfcdb 57 AnalogIn an3(PTB2);
rs27 0:e248310dfcdb 58 AnalogIn an4(PTB3);
rs27 0:e248310dfcdb 59 AnalogIn an5(PTC2);
rs27 0:e248310dfcdb 60 AnalogIn an6(PTD5);
rs27 0:e248310dfcdb 61
rs27 0:e248310dfcdb 62 // 0 bis 5V
rs27 6:f53dd76c8806 63 // AnalogIn an13(PTD6);
rs27 0:e248310dfcdb 64
rs27 0:e248310dfcdb 65 // Analog pins
rs27 0:e248310dfcdb 66 /*
rs27 0:e248310dfcdb 67 1 PTE20, ADC0_SE0, 0}, k2.2
rs27 0:e248310dfcdb 68 2 PTE22, ADC0_SE3, 0}, k2.3
rs27 0:e248310dfcdb 69 3 PTE21, ADC0_SE4a, 0},
rs27 0:e248310dfcdb 70 4 PTE29, ADC0_SE4b, 0}, k2,4
rs27 0:e248310dfcdb 71 5 PTE30, ADC0_SE23, 0}, k2.5
rs27 0:e248310dfcdb 72 6 PTE23, ADC0_SE7a, 0},
rs27 0:e248310dfcdb 73 7 PTB0, ADC0_SE8, 0}, k2.1
rs27 0:e248310dfcdb 74 8 PTB1, ADC0_SE9, 0}, k1.2
rs27 0:e248310dfcdb 75 9 PTB2, ADC0_SE12, 0}, k1.3
rs27 0:e248310dfcdb 76 10 PTB3, ADC0_SE13, 0}, k1.4
rs27 0:e248310dfcdb 77 11 PTC0, ADC0_SE14, 0}, k1.1
rs27 0:e248310dfcdb 78 12 PTC1, ADC0_SE15, 0}, k2.6
rs27 0:e248310dfcdb 79 13 PTC2, ADC0_SE11, 0}, k1.5
rs27 0:e248310dfcdb 80 14 PTD1, ADC0_SE5b, 0},
rs27 0:e248310dfcdb 81 15 PTD5, ADC0_SE6b, 0}, k1.6
rs27 0:e248310dfcdb 82 16 PTD6, ADC0_SE7b, 0}, k3.1
rs27 0:e248310dfcdb 83 */
rs27 0:e248310dfcdb 84
rs27 6:f53dd76c8806 85
rs27 6:f53dd76c8806 86 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 87 // Globale Variablen
rs27 6:f53dd76c8806 88
Sven3010 3:72a65324d50d 89 float temp1, temp_mw;
rs27 0:e248310dfcdb 90 uint16_t temp_word;
rs27 0:e248310dfcdb 91 uint8_t n, y, status, ds1820_status;
rs27 0:e248310dfcdb 92
Sven3010 4:46365f765d30 93 int tropfen_anz = 0;
Sven3010 7:c1602e28a906 94 bool send_flag = true;
Sven3010 3:72a65324d50d 95
Sven3010 4:46365f765d30 96 float temp_float, temp_diff, temp_neu, esum, temp_soll;
Sven3010 1:82c47e2d81f0 97
rs27 2:f48d2eb0cc55 98
rs27 2:f48d2eb0cc55 99 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 100 // Definitionen und Variablen für das Config File
rs27 6:f53dd76c8806 101 ConfigFile cfg;
rs27 6:f53dd76c8806 102 char value[BUFSIZ]; // Variablen für das Config file
rs27 6:f53dd76c8806 103
rs27 6:f53dd76c8806 104 bool t_flag = true; // Heizung aus / ein
rs27 6:f53dd76c8806 105 bool f_flag = true; // Tropfen sperren / freigeben
rs27 6:f53dd76c8806 106
rs27 6:f53dd76c8806 107 int drops = 10; // Anzahl Tropfen pro Zeiteinheit
rs27 8:91ea38fc3675 108 int interval = 60; // Zeitintervall für das Zählen der Tropfen
rs27 6:f53dd76c8806 109
rs27 2:f48d2eb0cc55 110 float offset = 0.0;
rs27 6:f53dd76c8806 111 float soll_wert = 27.0; // Sollwert für den Temperaturfühler in der Flüssigkeit
rs27 2:f48d2eb0cc55 112
rs27 2:f48d2eb0cc55 113 //------------------------------------------------------------------------------
Sven3010 4:46365f765d30 114 // Interruptroutine wird bei jedem Tropfen aufgerufen
rs27 6:f53dd76c8806 115
rs27 6:f53dd76c8806 116 void tropfen_handler()
rs27 6:f53dd76c8806 117 {
Sven3010 4:46365f765d30 118 tropfen_anz++;
rs27 6:f53dd76c8806 119 }
Sven3010 4:46365f765d30 120
Sven3010 4:46365f765d30 121 //------------------------------------------------------------------------------
rs27 0:e248310dfcdb 122 // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen
rs27 0:e248310dfcdb 123 void rx_handler(void)
rs27 0:e248310dfcdb 124 {
rs27 0:e248310dfcdb 125 // Note: you need to actually read from the serial to clear the RX interrupt
rs27 0:e248310dfcdb 126
rs27 0:e248310dfcdb 127 char ch;
rs27 0:e248310dfcdb 128
rs27 0:e248310dfcdb 129 while (pc.readable())
rs27 0:e248310dfcdb 130 {
rs27 0:e248310dfcdb 131 ch = pc.getc();
rs27 0:e248310dfcdb 132 buf.put(ch);
rs27 0:e248310dfcdb 133 }
rs27 0:e248310dfcdb 134 }
rs27 0:e248310dfcdb 135
rs27 2:f48d2eb0cc55 136 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 137 // lesen der PT1000 AD-Werte
rs27 2:f48d2eb0cc55 138 //
rs27 2:f48d2eb0cc55 139 // Um Störungen zu reduzieren werden 16 Werte gelesen und daraus wird der
rs27 2:f48d2eb0cc55 140 // Mittelwert berechnet. Eine Messung dauert ca. 30µs. Somit wird für eine Messung
rs27 2:f48d2eb0cc55 141 // ca. eine Zeit von 0,5ms benötigt.
rs27 2:f48d2eb0cc55 142 //
rs27 0:e248310dfcdb 143 int read_mw(uint8_t pos)
rs27 0:e248310dfcdb 144 {
rs27 0:e248310dfcdb 145 uint8_t n;
rs27 0:e248310dfcdb 146
rs27 0:e248310dfcdb 147 int val = 0;
rs27 0:e248310dfcdb 148 int mw = 0;
rs27 0:e248310dfcdb 149
Sven3010 1:82c47e2d81f0 150 LED_4 = 0;
Sven3010 1:82c47e2d81f0 151
rs27 0:e248310dfcdb 152 // 16 Messungen für eine bessere Mittelung durchführen
rs27 0:e248310dfcdb 153
rs27 0:e248310dfcdb 154 for (n = 0; n < 16; n++)
rs27 0:e248310dfcdb 155 {
rs27 0:e248310dfcdb 156 switch (pos)
rs27 0:e248310dfcdb 157 {
rs27 0:e248310dfcdb 158 // PT1000 Karte 1
rs27 0:e248310dfcdb 159 case 0: val = an1.read_u16(); break;
rs27 0:e248310dfcdb 160 case 1: val = an2.read_u16(); break;
rs27 0:e248310dfcdb 161 case 2: val = an3.read_u16(); break;
rs27 0:e248310dfcdb 162 case 3: val = an4.read_u16(); break;
rs27 0:e248310dfcdb 163 case 4: val = an5.read_u16(); break;
rs27 0:e248310dfcdb 164 case 5: val = an6.read_u16(); break;
rs27 0:e248310dfcdb 165 }
rs27 0:e248310dfcdb 166 mw += val;
rs27 0:e248310dfcdb 167 } // end for
rs27 0:e248310dfcdb 168
rs27 0:e248310dfcdb 169 // Temperatur berechnen
rs27 0:e248310dfcdb 170 // Wert durch 16 teilen
rs27 0:e248310dfcdb 171
rs27 0:e248310dfcdb 172 mw = mw >> 4;
Sven3010 1:82c47e2d81f0 173
Sven3010 1:82c47e2d81f0 174 LED_4 = 1;
Sven3010 1:82c47e2d81f0 175
rs27 0:e248310dfcdb 176 return mw;
rs27 0:e248310dfcdb 177 }
rs27 0:e248310dfcdb 178
rs27 2:f48d2eb0cc55 179 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 180 //
rs27 0:e248310dfcdb 181
rs27 0:e248310dfcdb 182 int main()
rs27 0:e248310dfcdb 183 {
rs27 6:f53dd76c8806 184 //------------------------------------------------------------------------------
rs27 0:e248310dfcdb 185
Sven3010 3:72a65324d50d 186 heizung.period(0.020); // requires a 20ms period
Sven3010 3:72a65324d50d 187 heizung.pulsewidth(0.005);
Sven3010 4:46365f765d30 188 esum = 0.0;
Sven3010 3:72a65324d50d 189
Sven3010 4:46365f765d30 190 tropfen.fall(&tropfen_handler);
Sven3010 3:72a65324d50d 191
rs27 2:f48d2eb0cc55 192 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 193 // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
rs27 2:f48d2eb0cc55 194 //
Sven3010 3:72a65324d50d 195 pc.baud(115200);
rs27 0:e248310dfcdb 196 pc.attach(&rx_handler, Serial::RxIrq);
Sven3010 1:82c47e2d81f0 197 pc.printf("\n V08 was compiled on %s %s \n", __DATE__,__TIME__);
rs27 0:e248310dfcdb 198
rs27 2:f48d2eb0cc55 199 mon_init();
rs27 6:f53dd76c8806 200
rs27 6:f53dd76c8806 201 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 202 // RS232 Schnittstellt zum Ansteuern der Magnetventile
rs27 6:f53dd76c8806 203 //
rs27 6:f53dd76c8806 204 com.baud(9600);
rs27 6:f53dd76c8806 205
rs27 2:f48d2eb0cc55 206 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 207 // Timer für die Zeitsteuerung
rs27 2:f48d2eb0cc55 208 //
rs27 0:e248310dfcdb 209 down_timer.SetCountdownTimer(0,1,50); // Timer für die LED
rs27 6:f53dd76c8806 210 down_timer.SetCountdownTimer(1,1,500); // Timer für die Tropfensteuerung
rs27 0:e248310dfcdb 211 down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten
rs27 0:e248310dfcdb 212
rs27 0:e248310dfcdb 213 r = g = b = 1; // RGB LED ausschalten
rs27 2:f48d2eb0cc55 214
rs27 2:f48d2eb0cc55 215 //--------------------------------------------------------------------
rs27 2:f48d2eb0cc55 216 // Variablen von der SD Karte initialisieren
rs27 2:f48d2eb0cc55 217
rs27 2:f48d2eb0cc55 218 cfg.read("/sd/input.cfg");
rs27 6:f53dd76c8806 219
rs27 6:f53dd76c8806 220 if (cfg.getValue("t_flag", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 221 {
rs27 6:f53dd76c8806 222 if (atoi(value) == 1)
rs27 6:f53dd76c8806 223 {
rs27 6:f53dd76c8806 224 t_flag = true;
rs27 6:f53dd76c8806 225 pc.printf("\nHeizung aktiviert");
rs27 6:f53dd76c8806 226 }
rs27 6:f53dd76c8806 227 else
rs27 6:f53dd76c8806 228 {
rs27 6:f53dd76c8806 229 t_flag = false;
rs27 6:f53dd76c8806 230 pc.printf("\nHeizung deaktiviert");
rs27 6:f53dd76c8806 231 }
rs27 6:f53dd76c8806 232 }
rs27 6:f53dd76c8806 233
rs27 6:f53dd76c8806 234 if (cfg.getValue("f_flag", &value[0], sizeof(value)))
rs27 2:f48d2eb0cc55 235 {
rs27 6:f53dd76c8806 236 if (atoi(value) == 1)
rs27 6:f53dd76c8806 237 {
rs27 6:f53dd76c8806 238 f_flag = true;
rs27 6:f53dd76c8806 239 pc.printf("\nTrofen aktiviert");
rs27 6:f53dd76c8806 240 }
rs27 6:f53dd76c8806 241 else
rs27 6:f53dd76c8806 242 {
rs27 6:f53dd76c8806 243 f_flag = false;
rs27 6:f53dd76c8806 244 pc.printf("\nTropfen deaktiviert");
rs27 6:f53dd76c8806 245 }
rs27 6:f53dd76c8806 246 }
rs27 6:f53dd76c8806 247
rs27 6:f53dd76c8806 248 if (cfg.getValue("drops", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 249 {
rs27 6:f53dd76c8806 250 drops = atoi(value);
rs27 6:f53dd76c8806 251 pc.printf("\nAnzahl Tropfen = %d", drops);
rs27 6:f53dd76c8806 252 }
rs27 8:91ea38fc3675 253
rs27 8:91ea38fc3675 254 if (cfg.getValue("interval", &value[0], sizeof(value)))
rs27 8:91ea38fc3675 255 {
rs27 8:91ea38fc3675 256 interval = atoi(value);
rs27 8:91ea38fc3675 257 pc.printf("\nIntervalzeit = %d Sekunden", drops);
rs27 8:91ea38fc3675 258 }
rs27 8:91ea38fc3675 259
rs27 6:f53dd76c8806 260 if (cfg.getValue("soll", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 261 {
rs27 6:f53dd76c8806 262 soll_wert = atof(value);
Sven3010 7:c1602e28a906 263 pc.printf("\nsoll_wert = %f\n", soll_wert);
rs27 2:f48d2eb0cc55 264 }
rs27 2:f48d2eb0cc55 265
rs27 0:e248310dfcdb 266 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 267 // Anfangswert bestimmen
rs27 0:e248310dfcdb 268
Sven3010 3:72a65324d50d 269 temp_mw = read_mw(0);
rs27 0:e248310dfcdb 270
rs27 2:f48d2eb0cc55 271
rs27 0:e248310dfcdb 272 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 273 // Schleife fuer die Datenerfassung
rs27 0:e248310dfcdb 274
rs27 0:e248310dfcdb 275 while(1)
rs27 0:e248310dfcdb 276 {
rs27 2:f48d2eb0cc55 277 //-------------------------------------------
rs27 2:f48d2eb0cc55 278 // Prüfen ob Zeichen eingegeben wurden
rs27 2:f48d2eb0cc55 279
rs27 2:f48d2eb0cc55 280 get_line();
rs27 6:f53dd76c8806 281
rs27 6:f53dd76c8806 282 //-------------------------------------------
rs27 6:f53dd76c8806 283 // Prüfen ob Tropfenzahl erreicht
rs27 0:e248310dfcdb 284
Sven3010 7:c1602e28a906 285
rs27 6:f53dd76c8806 286 if (tropfen_anz >= drops){
rs27 6:f53dd76c8806 287
rs27 6:f53dd76c8806 288 // mit einer 9 die Tropfen sperren
rs27 8:91ea38fc3675 289 if(send_flag){
rs27 8:91ea38fc3675 290 com.putc('9');
rs27 8:91ea38fc3675 291 send_flag = false;
rs27 8:91ea38fc3675 292 }
rs27 6:f53dd76c8806 293 }
rs27 6:f53dd76c8806 294
rs27 0:e248310dfcdb 295 //-------------------------------------------
rs27 0:e248310dfcdb 296 // timer 0 steuert die LED
rs27 0:e248310dfcdb 297
rs27 0:e248310dfcdb 298 if (down_timer.GetTimerStatus(0) == 0)
rs27 0:e248310dfcdb 299 {
rs27 0:e248310dfcdb 300 down_timer.SetCountdownTimer(0,1,500);
rs27 0:e248310dfcdb 301 LED5 = !LED5;
rs27 0:e248310dfcdb 302 }
rs27 0:e248310dfcdb 303
rs27 0:e248310dfcdb 304 //-------------------------------------------
rs27 6:f53dd76c8806 305 // Tropfensteuerung freigeben
rs27 6:f53dd76c8806 306
rs27 0:e248310dfcdb 307 if (down_timer.GetTimerStatus(1) == 0)
rs27 6:f53dd76c8806 308 {
rs27 8:91ea38fc3675 309 down_timer.SetCountdownTimer(1,2,interval);
rs27 6:f53dd76c8806 310
rs27 6:f53dd76c8806 311 tropfen_anz = 0;
rs27 6:f53dd76c8806 312
rs27 6:f53dd76c8806 313 // mit einer 1 die Tropfen freigeben
rs27 8:91ea38fc3675 314 if (f_flag){
rs27 8:91ea38fc3675 315 com.putc('1');
rs27 8:91ea38fc3675 316 send_flag = true;
rs27 8:91ea38fc3675 317 }
rs27 6:f53dd76c8806 318 }
rs27 0:e248310dfcdb 319
rs27 0:e248310dfcdb 320 //-------------------------------------------
rs27 6:f53dd76c8806 321 // timer 2 steuert das Messen der Temperaturen und gibt die Leistung für
rs27 6:f53dd76c8806 322 // die Heizung vor
rs27 0:e248310dfcdb 323
rs27 0:e248310dfcdb 324 if (down_timer.GetTimerStatus(2) == 0)
rs27 0:e248310dfcdb 325 {
Sven3010 3:72a65324d50d 326 down_timer.SetCountdownTimer(2,1,500);
rs27 0:e248310dfcdb 327
rs27 0:e248310dfcdb 328 //------------------------------------------------------
rs27 6:f53dd76c8806 329 // PT1000 Kanal 1 ( Fühler in Flüssigkeit) lesen und die Temperatur berechnen
rs27 6:f53dd76c8806 330
rs27 0:e248310dfcdb 331
Sven3010 4:46365f765d30 332 temp_word = read_mw(1);
rs27 6:f53dd76c8806 333 temp_soll = (temp_word - OFFSET);
rs27 6:f53dd76c8806 334 temp_soll /= GAIN;
rs27 6:f53dd76c8806 335
rs27 6:f53dd76c8806 336 //pc.printf("%d;",temp_word); // Rohwert ausgeben
Sven3010 7:c1602e28a906 337 pc.printf("Soll %2.2f; Soll ist %2.2f; ",soll_wert, temp_soll); // Temperaturwert soll Flüssigkeit
rs27 6:f53dd76c8806 338
rs27 6:f53dd76c8806 339 //------------------------------------------------------
rs27 6:f53dd76c8806 340 // PT1000 Kanal 0 ( Fühler am Heizwiderstand ) lesen und die Temperatur berechnen
rs27 6:f53dd76c8806 341
rs27 0:e248310dfcdb 342 temp_word = read_mw(0);
rs27 6:f53dd76c8806 343 temp_float = (temp_word - OFFSET);
rs27 6:f53dd76c8806 344 temp_float /= GAIN;
Sven3010 3:72a65324d50d 345
Sven3010 3:72a65324d50d 346
Sven3010 4:46365f765d30 347 pc.printf("Temp-R %0.2f; ",temp_float); // Rohdaten ausgeben
Sven3010 1:82c47e2d81f0 348
rs27 6:f53dd76c8806 349 //------------------------------------------------------
rs27 6:f53dd76c8806 350 // Regelabweichung berechnen
rs27 6:f53dd76c8806 351
rs27 6:f53dd76c8806 352 temp_diff = (soll_wert - temp_soll);
Sven3010 3:72a65324d50d 353
rs27 6:f53dd76c8806 354 //------------------------------------------------------
rs27 6:f53dd76c8806 355 // Begrenzen der Eingangsgröße
rs27 6:f53dd76c8806 356
rs27 6:f53dd76c8806 357 if(temp_diff > soll_wert)temp_diff = soll_wert;
Sven3010 4:46365f765d30 358
Sven3010 4:46365f765d30 359 //temp_neu = ((temp_diff*0.0005) + (temp_alt*0.9));
rs27 6:f53dd76c8806 360
rs27 6:f53dd76c8806 361 //------------------------------------------------------
rs27 6:f53dd76c8806 362 // bei geringen Abweichungen ein I-Anteil berechnen, damit Regelabweichung
rs27 6:f53dd76c8806 363 // auf 0 gefahren werden
Sven3010 4:46365f765d30 364 if(temp_diff < 3){
Sven3010 4:46365f765d30 365 esum += temp_diff * 0.00001;
rs27 6:f53dd76c8806 366 }
rs27 6:f53dd76c8806 367
rs27 6:f53dd76c8806 368 //------------------------------------------------------
rs27 6:f53dd76c8806 369 // berechnen der Steuergröße
Sven3010 4:46365f765d30 370
Sven3010 4:46365f765d30 371 temp_neu = (temp_diff*0.0005) + esum;
Sven3010 3:72a65324d50d 372
rs27 6:f53dd76c8806 373 //------------------------------------------------------
rs27 6:f53dd76c8806 374 // Regler nach oben begrezen
rs27 6:f53dd76c8806 375
Sven3010 3:72a65324d50d 376 if(temp_neu > 0.02){
Sven3010 3:72a65324d50d 377 temp_neu = 0.02;
Sven3010 3:72a65324d50d 378 }
rs27 6:f53dd76c8806 379
rs27 6:f53dd76c8806 380 //------------------------------------------------------
rs27 6:f53dd76c8806 381 // Regler nach unten begrezen
rs27 6:f53dd76c8806 382
rs27 6:f53dd76c8806 383 if(temp_soll > soll_wert){
Sven3010 3:72a65324d50d 384 temp_neu = 0.0;
Sven3010 4:46365f765d30 385 esum = 0.0;
Sven3010 4:46365f765d30 386 }
Sven3010 4:46365f765d30 387
rs27 6:f53dd76c8806 388 //------------------------------------------------------
rs27 6:f53dd76c8806 389 // Zulössige Temperatur für den Heizwiderstand begrezen
rs27 6:f53dd76c8806 390
Sven3010 4:46365f765d30 391 if(temp_float > R_TEMP_MAX){
Sven3010 4:46365f765d30 392 temp_neu = 0.0;
Sven3010 4:46365f765d30 393 esum = 0.0;
Sven3010 4:46365f765d30 394 }
Sven3010 3:72a65324d50d 395
rs27 6:f53dd76c8806 396 //------------------------------------------------------
rs27 6:f53dd76c8806 397 // Heizwiederstand ansteuern >> 0,02 entspricht 100%
rs27 6:f53dd76c8806 398
rs27 6:f53dd76c8806 399 if (t_flag)
rs27 6:f53dd76c8806 400 {
rs27 6:f53dd76c8806 401 heizung.pulsewidth(0.0001 + temp_neu);
rs27 6:f53dd76c8806 402 //pc.printf("%0.4f;",temp_alt);
rs27 6:f53dd76c8806 403 }
rs27 6:f53dd76c8806 404 else
rs27 6:f53dd76c8806 405 {
rs27 6:f53dd76c8806 406 heizung.pulsewidth(0.000000);
rs27 6:f53dd76c8806 407 }
Sven3010 7:c1602e28a906 408 pc.printf("%0.4f; ",temp_neu);
Sven3010 7:c1602e28a906 409 if(t_flag)
Sven3010 7:c1602e28a906 410 pc.printf("on");
Sven3010 7:c1602e28a906 411 else
Sven3010 7:c1602e28a906 412 pc.printf("off");
Sven3010 7:c1602e28a906 413 pc.printf("\n");
rs27 0:e248310dfcdb 414 } // end if(down_timer ...
Sven3010 7:c1602e28a906 415
rs27 0:e248310dfcdb 416 } // end while
rs27 0:e248310dfcdb 417 }
rs27 0:e248310dfcdb 418