070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
aglorenz
Date:
Wed Aug 20 11:48:57 2014 +0000
Revision:
13:a44b80b168b2
Parent:
12:d5a745de5380
Child:
16:3a4350104b68
123

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