070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
Sven3010
Date:
Sun Aug 03 18:25:06 2014 +0000
Revision:
7:c1602e28a906
Parent:
6:f53dd76c8806
Child:
8:3564645d2213
030814;

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