070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Fri Aug 08 16:02:54 2014 +0000
Revision:
9:28519e850e1c
Parent:
8:3564645d2213
Child:
10:84387eed15b5
08.08.14

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