070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Sat Aug 30 08:49:43 2014 +0000
Revision:
17:c307f8c96ab1
Parent:
16:3a4350104b68
Child:
18:939d3df56218
300814a

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