070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Mon Aug 18 08:27:08 2014 +0000
Revision:
10:84387eed15b5
Parent:
9:28519e850e1c
Child:
11:7bc691148135
Stand 180814

Who changed what in which revision?

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