070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Sun Aug 03 08:12:55 2014 +0000
Revision:
6:f53dd76c8806
Parent:
5:7c6fbe5d62e5
Child:
7:c1602e28a906
update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 6:f53dd76c8806 1 // Version 12 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"
rs27 0:e248310dfcdb 8 #include "DS2482.h"
rs27 0:e248310dfcdb 9 #include "timer0.h"
rs27 0:e248310dfcdb 10 #include "Buffer.h"
rs27 0:e248310dfcdb 11 #include "monitor.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 3:72a65324d50d 94
Sven3010 4:46365f765d30 95 float temp_float, temp_diff, temp_neu, esum, temp_soll;
Sven3010 1:82c47e2d81f0 96
rs27 2:f48d2eb0cc55 97
rs27 2:f48d2eb0cc55 98 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 99 // Definitionen und Variablen für das Config File
rs27 6:f53dd76c8806 100 ConfigFile cfg;
rs27 6:f53dd76c8806 101 char value[BUFSIZ]; // Variablen für das Config file
rs27 6:f53dd76c8806 102
rs27 6:f53dd76c8806 103 bool t_flag = true; // Heizung aus / ein
rs27 6:f53dd76c8806 104 bool f_flag = true; // Tropfen sperren / freigeben
rs27 6:f53dd76c8806 105
rs27 6:f53dd76c8806 106 int drops = 10; // Anzahl Tropfen pro Zeiteinheit
rs27 6:f53dd76c8806 107
rs27 2:f48d2eb0cc55 108 float offset = 0.0;
rs27 6:f53dd76c8806 109 float soll_wert = 27.0; // Sollwert für den Temperaturfühler in der Flüssigkeit
rs27 2:f48d2eb0cc55 110
rs27 2:f48d2eb0cc55 111 //------------------------------------------------------------------------------
Sven3010 4:46365f765d30 112 // Interruptroutine wird bei jedem Tropfen aufgerufen
rs27 6:f53dd76c8806 113
rs27 6:f53dd76c8806 114 void tropfen_handler()
rs27 6:f53dd76c8806 115 {
Sven3010 4:46365f765d30 116 tropfen_anz++;
rs27 6:f53dd76c8806 117 }
Sven3010 4:46365f765d30 118
Sven3010 4:46365f765d30 119 //------------------------------------------------------------------------------
rs27 0:e248310dfcdb 120 // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen
rs27 0:e248310dfcdb 121 void rx_handler(void)
rs27 0:e248310dfcdb 122 {
rs27 0:e248310dfcdb 123 // Note: you need to actually read from the serial to clear the RX interrupt
rs27 0:e248310dfcdb 124
rs27 0:e248310dfcdb 125 char ch;
rs27 0:e248310dfcdb 126
rs27 0:e248310dfcdb 127 while (pc.readable())
rs27 0:e248310dfcdb 128 {
rs27 0:e248310dfcdb 129 ch = pc.getc();
rs27 0:e248310dfcdb 130 buf.put(ch);
rs27 0:e248310dfcdb 131 }
rs27 0:e248310dfcdb 132 }
rs27 0:e248310dfcdb 133
rs27 2:f48d2eb0cc55 134 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 135 // lesen der PT1000 AD-Werte
rs27 2:f48d2eb0cc55 136 //
rs27 2:f48d2eb0cc55 137 // Um Störungen zu reduzieren werden 16 Werte gelesen und daraus wird der
rs27 2:f48d2eb0cc55 138 // Mittelwert berechnet. Eine Messung dauert ca. 30µs. Somit wird für eine Messung
rs27 2:f48d2eb0cc55 139 // ca. eine Zeit von 0,5ms benötigt.
rs27 2:f48d2eb0cc55 140 //
rs27 0:e248310dfcdb 141 int read_mw(uint8_t pos)
rs27 0:e248310dfcdb 142 {
rs27 0:e248310dfcdb 143 uint8_t n;
rs27 0:e248310dfcdb 144
rs27 0:e248310dfcdb 145 int val = 0;
rs27 0:e248310dfcdb 146 int mw = 0;
rs27 0:e248310dfcdb 147
Sven3010 1:82c47e2d81f0 148 LED_4 = 0;
Sven3010 1:82c47e2d81f0 149
rs27 0:e248310dfcdb 150 // 16 Messungen für eine bessere Mittelung durchführen
rs27 0:e248310dfcdb 151
rs27 0:e248310dfcdb 152 for (n = 0; n < 16; n++)
rs27 0:e248310dfcdb 153 {
rs27 0:e248310dfcdb 154 switch (pos)
rs27 0:e248310dfcdb 155 {
rs27 0:e248310dfcdb 156 // PT1000 Karte 1
rs27 0:e248310dfcdb 157 case 0: val = an1.read_u16(); break;
rs27 0:e248310dfcdb 158 case 1: val = an2.read_u16(); break;
rs27 0:e248310dfcdb 159 case 2: val = an3.read_u16(); break;
rs27 0:e248310dfcdb 160 case 3: val = an4.read_u16(); break;
rs27 0:e248310dfcdb 161 case 4: val = an5.read_u16(); break;
rs27 0:e248310dfcdb 162 case 5: val = an6.read_u16(); break;
rs27 0:e248310dfcdb 163 }
rs27 0:e248310dfcdb 164 mw += val;
rs27 0:e248310dfcdb 165 } // end for
rs27 0:e248310dfcdb 166
rs27 0:e248310dfcdb 167 // Temperatur berechnen
rs27 0:e248310dfcdb 168 // Wert durch 16 teilen
rs27 0:e248310dfcdb 169
rs27 0:e248310dfcdb 170 mw = mw >> 4;
Sven3010 1:82c47e2d81f0 171
Sven3010 1:82c47e2d81f0 172 LED_4 = 1;
Sven3010 1:82c47e2d81f0 173
rs27 0:e248310dfcdb 174 return mw;
rs27 0:e248310dfcdb 175 }
rs27 0:e248310dfcdb 176
rs27 2:f48d2eb0cc55 177 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 178 //
rs27 0:e248310dfcdb 179
rs27 0:e248310dfcdb 180 int main()
rs27 0:e248310dfcdb 181 {
rs27 6:f53dd76c8806 182 //------------------------------------------------------------------------------
rs27 0:e248310dfcdb 183
Sven3010 3:72a65324d50d 184 heizung.period(0.020); // requires a 20ms period
Sven3010 3:72a65324d50d 185 heizung.pulsewidth(0.005);
Sven3010 4:46365f765d30 186 esum = 0.0;
Sven3010 3:72a65324d50d 187
Sven3010 4:46365f765d30 188 tropfen.fall(&tropfen_handler);
Sven3010 3:72a65324d50d 189
rs27 2:f48d2eb0cc55 190 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 191 // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
rs27 2:f48d2eb0cc55 192 //
Sven3010 3:72a65324d50d 193 pc.baud(115200);
rs27 0:e248310dfcdb 194 pc.attach(&rx_handler, Serial::RxIrq);
Sven3010 1:82c47e2d81f0 195 pc.printf("\n V08 was compiled on %s %s \n", __DATE__,__TIME__);
rs27 0:e248310dfcdb 196
rs27 2:f48d2eb0cc55 197 mon_init();
rs27 6:f53dd76c8806 198
rs27 6:f53dd76c8806 199 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 200 // RS232 Schnittstellt zum Ansteuern der Magnetventile
rs27 6:f53dd76c8806 201 //
rs27 6:f53dd76c8806 202 com.baud(9600);
rs27 6:f53dd76c8806 203
rs27 2:f48d2eb0cc55 204 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 205 // Timer für die Zeitsteuerung
rs27 2:f48d2eb0cc55 206 //
rs27 0:e248310dfcdb 207 down_timer.SetCountdownTimer(0,1,50); // Timer für die LED
rs27 6:f53dd76c8806 208 down_timer.SetCountdownTimer(1,1,500); // Timer für die Tropfensteuerung
rs27 0:e248310dfcdb 209 down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten
rs27 0:e248310dfcdb 210
rs27 0:e248310dfcdb 211 r = g = b = 1; // RGB LED ausschalten
rs27 2:f48d2eb0cc55 212
rs27 2:f48d2eb0cc55 213 //--------------------------------------------------------------------
rs27 2:f48d2eb0cc55 214 // Variablen von der SD Karte initialisieren
rs27 2:f48d2eb0cc55 215
rs27 2:f48d2eb0cc55 216 cfg.read("/sd/input.cfg");
rs27 6:f53dd76c8806 217
rs27 6:f53dd76c8806 218 if (cfg.getValue("t_flag", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 219 {
rs27 6:f53dd76c8806 220 if (atoi(value) == 1)
rs27 6:f53dd76c8806 221 {
rs27 6:f53dd76c8806 222 t_flag = true;
rs27 6:f53dd76c8806 223 pc.printf("\nHeizung aktiviert");
rs27 6:f53dd76c8806 224 }
rs27 6:f53dd76c8806 225 else
rs27 6:f53dd76c8806 226 {
rs27 6:f53dd76c8806 227 t_flag = false;
rs27 6:f53dd76c8806 228 pc.printf("\nHeizung deaktiviert");
rs27 6:f53dd76c8806 229 }
rs27 6:f53dd76c8806 230 }
rs27 6:f53dd76c8806 231
rs27 6:f53dd76c8806 232 if (cfg.getValue("f_flag", &value[0], sizeof(value)))
rs27 2:f48d2eb0cc55 233 {
rs27 6:f53dd76c8806 234 if (atoi(value) == 1)
rs27 6:f53dd76c8806 235 {
rs27 6:f53dd76c8806 236 f_flag = true;
rs27 6:f53dd76c8806 237 pc.printf("\nTrofen aktiviert");
rs27 6:f53dd76c8806 238 }
rs27 6:f53dd76c8806 239 else
rs27 6:f53dd76c8806 240 {
rs27 6:f53dd76c8806 241 f_flag = false;
rs27 6:f53dd76c8806 242 pc.printf("\nTropfen deaktiviert");
rs27 6:f53dd76c8806 243 }
rs27 6:f53dd76c8806 244 }
rs27 6:f53dd76c8806 245
rs27 6:f53dd76c8806 246 if (cfg.getValue("drops", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 247 {
rs27 6:f53dd76c8806 248 drops = atoi(value);
rs27 6:f53dd76c8806 249 pc.printf("\nAnzahl Tropfen = %d", drops);
rs27 6:f53dd76c8806 250 }
rs27 6:f53dd76c8806 251
rs27 6:f53dd76c8806 252 if (cfg.getValue("soll", &value[0], sizeof(value)))
rs27 6:f53dd76c8806 253 {
rs27 6:f53dd76c8806 254 soll_wert = atof(value);
rs27 6:f53dd76c8806 255 pc.printf("\nsoll_wert = %f", offset);
rs27 2:f48d2eb0cc55 256 }
rs27 2:f48d2eb0cc55 257
rs27 0:e248310dfcdb 258 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 259 // Anfangswert bestimmen
rs27 0:e248310dfcdb 260
Sven3010 3:72a65324d50d 261 temp_mw = read_mw(0);
rs27 0:e248310dfcdb 262
rs27 2:f48d2eb0cc55 263
rs27 0:e248310dfcdb 264 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 265 // Schleife fuer die Datenerfassung
rs27 0:e248310dfcdb 266
rs27 0:e248310dfcdb 267 while(1)
rs27 0:e248310dfcdb 268 {
rs27 2:f48d2eb0cc55 269 //-------------------------------------------
rs27 2:f48d2eb0cc55 270 // Prüfen ob Zeichen eingegeben wurden
rs27 2:f48d2eb0cc55 271
rs27 2:f48d2eb0cc55 272 get_line();
rs27 6:f53dd76c8806 273
rs27 6:f53dd76c8806 274 //-------------------------------------------
rs27 6:f53dd76c8806 275 // Prüfen ob Tropfenzahl erreicht
rs27 0:e248310dfcdb 276
rs27 6:f53dd76c8806 277 if (tropfen_anz >= drops){
rs27 6:f53dd76c8806 278
rs27 6:f53dd76c8806 279 // mit einer 9 die Tropfen sperren
rs27 6:f53dd76c8806 280 com.putc('9');
rs27 6:f53dd76c8806 281 }
rs27 6:f53dd76c8806 282
rs27 0:e248310dfcdb 283 //-------------------------------------------
rs27 0:e248310dfcdb 284 // timer 0 steuert die LED
rs27 0:e248310dfcdb 285
rs27 0:e248310dfcdb 286 if (down_timer.GetTimerStatus(0) == 0)
rs27 0:e248310dfcdb 287 {
rs27 0:e248310dfcdb 288 down_timer.SetCountdownTimer(0,1,500);
rs27 0:e248310dfcdb 289 LED5 = !LED5;
rs27 0:e248310dfcdb 290 }
rs27 0:e248310dfcdb 291
rs27 0:e248310dfcdb 292 //-------------------------------------------
rs27 6:f53dd76c8806 293 // Tropfensteuerung freigeben
rs27 6:f53dd76c8806 294
rs27 0:e248310dfcdb 295 if (down_timer.GetTimerStatus(1) == 0)
rs27 6:f53dd76c8806 296 {
rs27 6:f53dd76c8806 297 down_timer.SetCountdownTimer(0,1,1000);
rs27 6:f53dd76c8806 298
rs27 6:f53dd76c8806 299 tropfen_anz = 0;
rs27 6:f53dd76c8806 300
rs27 6:f53dd76c8806 301 // mit einer 1 die Tropfen freigeben
rs27 6:f53dd76c8806 302 if (f_flag) com.putc('1');
rs27 6:f53dd76c8806 303 }
rs27 0:e248310dfcdb 304
rs27 0:e248310dfcdb 305 //-------------------------------------------
rs27 6:f53dd76c8806 306 // timer 2 steuert das Messen der Temperaturen und gibt die Leistung für
rs27 6:f53dd76c8806 307 // die Heizung vor
rs27 0:e248310dfcdb 308
rs27 0:e248310dfcdb 309 if (down_timer.GetTimerStatus(2) == 0)
rs27 0:e248310dfcdb 310 {
Sven3010 3:72a65324d50d 311 down_timer.SetCountdownTimer(2,1,500);
rs27 0:e248310dfcdb 312
rs27 0:e248310dfcdb 313 //------------------------------------------------------
rs27 6:f53dd76c8806 314 // PT1000 Kanal 1 ( Fühler in Flüssigkeit) lesen und die Temperatur berechnen
rs27 6:f53dd76c8806 315
rs27 0:e248310dfcdb 316
Sven3010 4:46365f765d30 317 temp_word = read_mw(1);
rs27 6:f53dd76c8806 318 temp_soll = (temp_word - OFFSET);
rs27 6:f53dd76c8806 319 temp_soll /= GAIN;
rs27 6:f53dd76c8806 320
rs27 6:f53dd76c8806 321 //pc.printf("%d;",temp_word); // Rohwert ausgeben
rs27 6:f53dd76c8806 322 pc.printf("Soll %2.2f;",temp_soll); // Temperaturwert soll Flüssigkeit
rs27 6:f53dd76c8806 323
rs27 6:f53dd76c8806 324 //------------------------------------------------------
rs27 6:f53dd76c8806 325 // PT1000 Kanal 0 ( Fühler am Heizwiderstand ) lesen und die Temperatur berechnen
rs27 6:f53dd76c8806 326
rs27 0:e248310dfcdb 327 temp_word = read_mw(0);
rs27 6:f53dd76c8806 328 temp_float = (temp_word - OFFSET);
rs27 6:f53dd76c8806 329 temp_float /= GAIN;
Sven3010 3:72a65324d50d 330
Sven3010 3:72a65324d50d 331
Sven3010 4:46365f765d30 332 pc.printf("Temp-R %0.2f; ",temp_float); // Rohdaten ausgeben
Sven3010 1:82c47e2d81f0 333
rs27 6:f53dd76c8806 334 //------------------------------------------------------
rs27 6:f53dd76c8806 335 // Regelabweichung berechnen
rs27 6:f53dd76c8806 336
rs27 6:f53dd76c8806 337 temp_diff = (soll_wert - temp_soll);
Sven3010 3:72a65324d50d 338
rs27 6:f53dd76c8806 339 //------------------------------------------------------
rs27 6:f53dd76c8806 340 // Begrenzen der Eingangsgröße
rs27 6:f53dd76c8806 341
rs27 6:f53dd76c8806 342 if(temp_diff > soll_wert)temp_diff = soll_wert;
Sven3010 4:46365f765d30 343
Sven3010 4:46365f765d30 344 //temp_neu = ((temp_diff*0.0005) + (temp_alt*0.9));
rs27 6:f53dd76c8806 345
rs27 6:f53dd76c8806 346 //------------------------------------------------------
rs27 6:f53dd76c8806 347 // bei geringen Abweichungen ein I-Anteil berechnen, damit Regelabweichung
rs27 6:f53dd76c8806 348 // auf 0 gefahren werden
Sven3010 4:46365f765d30 349 if(temp_diff < 3){
Sven3010 4:46365f765d30 350 esum += temp_diff * 0.00001;
rs27 6:f53dd76c8806 351 }
rs27 6:f53dd76c8806 352
rs27 6:f53dd76c8806 353 //------------------------------------------------------
rs27 6:f53dd76c8806 354 // berechnen der Steuergröße
Sven3010 4:46365f765d30 355
Sven3010 4:46365f765d30 356 temp_neu = (temp_diff*0.0005) + esum;
Sven3010 3:72a65324d50d 357
rs27 6:f53dd76c8806 358 //------------------------------------------------------
rs27 6:f53dd76c8806 359 // Regler nach oben begrezen
rs27 6:f53dd76c8806 360
Sven3010 3:72a65324d50d 361 if(temp_neu > 0.02){
Sven3010 3:72a65324d50d 362 temp_neu = 0.02;
Sven3010 3:72a65324d50d 363 }
rs27 6:f53dd76c8806 364
rs27 6:f53dd76c8806 365 //------------------------------------------------------
rs27 6:f53dd76c8806 366 // Regler nach unten begrezen
rs27 6:f53dd76c8806 367
rs27 6:f53dd76c8806 368 if(temp_soll > soll_wert){
Sven3010 3:72a65324d50d 369 temp_neu = 0.0;
Sven3010 4:46365f765d30 370 esum = 0.0;
Sven3010 4:46365f765d30 371 }
Sven3010 4:46365f765d30 372
rs27 6:f53dd76c8806 373 //------------------------------------------------------
rs27 6:f53dd76c8806 374 // Zulössige Temperatur für den Heizwiderstand begrezen
rs27 6:f53dd76c8806 375
Sven3010 4:46365f765d30 376 if(temp_float > R_TEMP_MAX){
Sven3010 4:46365f765d30 377 temp_neu = 0.0;
Sven3010 4:46365f765d30 378 esum = 0.0;
Sven3010 4:46365f765d30 379 }
Sven3010 3:72a65324d50d 380
rs27 6:f53dd76c8806 381 //------------------------------------------------------
rs27 6:f53dd76c8806 382 // Heizwiederstand ansteuern >> 0,02 entspricht 100%
rs27 6:f53dd76c8806 383
rs27 6:f53dd76c8806 384 if (t_flag)
rs27 6:f53dd76c8806 385 {
rs27 6:f53dd76c8806 386 heizung.pulsewidth(0.0001 + temp_neu);
rs27 6:f53dd76c8806 387 //pc.printf("%0.4f;",temp_alt);
rs27 6:f53dd76c8806 388 pc.printf("%0.4f \n",temp_neu);
rs27 6:f53dd76c8806 389 }
rs27 6:f53dd76c8806 390 else
rs27 6:f53dd76c8806 391 {
rs27 6:f53dd76c8806 392 heizung.pulsewidth(0.000000);
rs27 6:f53dd76c8806 393 }
Sven3010 4:46365f765d30 394
rs27 0:e248310dfcdb 395 } // end if(down_timer ...
rs27 0:e248310dfcdb 396
rs27 0:e248310dfcdb 397 } // end while
rs27 0:e248310dfcdb 398 }
rs27 0:e248310dfcdb 399