070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
Sven3010
Date:
Sun Sep 07 12:10:34 2014 +0000
Revision:
18:939d3df56218
Parent:
17:c307f8c96ab1
Child:
19:8e4e6fe34857
070914;

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