Update vom 10.05.15

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 18_PT1000 by Temp27

Committer:
Sven3010
Date:
Fri Aug 08 09:35:38 2014 +0000
Revision:
8:3564645d2213
Parent:
7:c1602e28a906
Child:
9:28519e850e1c
080814

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