070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

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