Update vom 10.05.15
Dependencies: FreescaleIAP MODSERIAL mbed monitor timer0
Fork of 18_PT1000 by
Diff: main.cpp
- Revision:
- 6:f53dd76c8806
- Parent:
- 5:7c6fbe5d62e5
- Child:
- 7:c1602e28a906
--- a/main.cpp Sat Aug 02 19:09:31 2014 +0000 +++ b/main.cpp Sun Aug 03 08:12:55 2014 +0000 @@ -1,5 +1,6 @@ -// Version 12 02.08.2014 +// Version 12 03.08.2014 // die Ausgabe auf das Format #nr val umgestellt +// 03.08.14 Monitorbefehle hinzugefügt #include "mbed.h" #include "ConfigFile.h" @@ -11,19 +12,29 @@ #define CR 13 -#define SOLL_WERT 27.0 -#define R_TEMP_MAX 40.0 +#define SOLL_WERT 27.0 // Sollwert für den Fühler in der Flüssigkeit +#define R_TEMP_MAX 40.0 // Maximaltermperatur für den Widerstand +#define OFFSET 28510 // AD Wert für 0° Abgleich +//#define OFFSET 27100 // AD Wert für 0° Abgleich Steuerung Flosrian +#define GAIN 113 // Digit pro °C >> 112.3 Steuerung Florian +//#define GAIN 112.3 // Digit pro °C >> 112.3 Steuerung Florian -InterruptIn tropfen(PTA5); +//------------------------------------------------------------------------------ +// Anlegen von Klassen SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, "sd"); // The pinout (MOSI, MISO, SCLK, CS) timer0 down_timer; // Zeitsteuerung Serial pc(USBTX, USBRX); // tx, rx +Serial com(PTC4, PTC3); Buffer <char> buf; // Ringbuffer für ankommende Zeichen -PwmOut heizung(PTA13); +// DS2482 ow(PTE0,PTE1,0x30); // sda, scl, adr + -// sda, scl, adr -DS2482 ow(PTE0,PTE1,0x30); +//------------------------------------------------------------------------------ +// Zuordnung von Eingängen und Ausgängen + +InterruptIn tropfen(PTA5); // Eingang für Tropfensensor +PwmOut heizung(PTA13); // Ausgang für den PWM der die Heizung steuert DigitalOut r(LED_RED); DigitalOut g(LED_GREEN); @@ -34,13 +45,13 @@ DigitalOut LED5(PTA4); DigitalOut LED_4(PTA12); -// Schalter 4051 +// Schalter 4051 weden in der Andwendung nicht benötigt DigitalOut DC_A(PTE2); DigitalOut DC_B(PTE3); DigitalOut DC_C(PTE4); DigitalOut DC_EN(PTE5); -// PT1000 Karte 1 +// PT1000 Karte 1 >> Analogeingänge auf der Grundkarte AnalogIn an1(PTC0); AnalogIn an2(PTB1); AnalogIn an3(PTB2); @@ -49,7 +60,7 @@ AnalogIn an6(PTD5); // 0 bis 5V -AnalogIn an13(PTD6); +// AnalogIn an13(PTD6); // Analog pins /* @@ -71,6 +82,10 @@ 16 PTD6, ADC0_SE7b, 0}, k3.1 */ + +//------------------------------------------------------------------------------ +// Globale Variablen + float temp1, temp_mw; uint16_t temp_word; uint8_t n, y, status, ds1820_status; @@ -79,18 +94,27 @@ float temp_float, temp_diff, temp_neu, esum, temp_soll; -ConfigFile cfg; -char value[BUFSIZ]; //------------------------------------------------------------------------------ -// Werte die auch über das config file gesetzt werden können +// Definitionen und Variablen für das Config File +ConfigFile cfg; +char value[BUFSIZ]; // Variablen für das Config file + +bool t_flag = true; // Heizung aus / ein +bool f_flag = true; // Tropfen sperren / freigeben + +int drops = 10; // Anzahl Tropfen pro Zeiteinheit + float offset = 0.0; +float soll_wert = 27.0; // Sollwert für den Temperaturfühler in der Flüssigkeit //------------------------------------------------------------------------------ // Interruptroutine wird bei jedem Tropfen aufgerufen -void tropfen_handler(){ + +void tropfen_handler() +{ tropfen_anz++; - } +} //------------------------------------------------------------------------------ // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen @@ -155,6 +179,7 @@ int main() { + //------------------------------------------------------------------------------ heizung.period(0.020); // requires a 20ms period heizung.pulsewidth(0.005); @@ -170,12 +195,17 @@ pc.printf("\n V08 was compiled on %s %s \n", __DATE__,__TIME__); mon_init(); - + + //------------------------------------------------------------------------------ + // RS232 Schnittstellt zum Ansteuern der Magnetventile + // + com.baud(9600); + //------------------------------------------------------------------------------ // Timer für die Zeitsteuerung // down_timer.SetCountdownTimer(0,1,50); // Timer für die LED - down_timer.SetCountdownTimer(1,1,500); // Timer für den one wire bus + down_timer.SetCountdownTimer(1,1,500); // Timer für die Tropfensteuerung down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten r = g = b = 1; // RGB LED ausschalten @@ -184,59 +214,52 @@ // Variablen von der SD Karte initialisieren cfg.read("/sd/input.cfg"); - - if (cfg.getValue("offset", &value[0], sizeof(value))) + + if (cfg.getValue("t_flag", &value[0], sizeof(value))) + { + if (atoi(value) == 1) + { + t_flag = true; + pc.printf("\nHeizung aktiviert"); + } + else + { + t_flag = false; + pc.printf("\nHeizung deaktiviert"); + } + } + + if (cfg.getValue("f_flag", &value[0], sizeof(value))) { - offset = atof(value); - pc.printf("\noffset = %f", offset); + if (atoi(value) == 1) + { + f_flag = true; + pc.printf("\nTrofen aktiviert"); + } + else + { + f_flag = false; + pc.printf("\nTropfen deaktiviert"); + } + } + + if (cfg.getValue("drops", &value[0], sizeof(value))) + { + drops = atoi(value); + pc.printf("\nAnzahl Tropfen = %d", drops); + } + + if (cfg.getValue("soll", &value[0], sizeof(value))) + { + soll_wert = atof(value); + pc.printf("\nsoll_wert = %f", offset); } //-------------------------------------------------------------------- - // one wire bus - - /* - // pc.printf("\n ++++ on wire search ++++\n"); - wait (0.1); - ow.DS18XX_Read_Address(); - - n = ow.ow.devices; - - // Anzahl der ow Bausteine ermitteln - y = 0; - for (n = 0; n < OW_MAX_DEVICES; n++) - { - if ((ow.ow.device_table[n].status & 0x0f) == 1) y++; - } // end for(... - - // pc.printf("\n %d devices FOUND \n",y); - - // ow 64 bit Adressen ausgeben - for (n = 0; n < OW_MAX_DEVICES; n++) - { - if ((ow.ow.device_table[n].status & 0x0f) == 1) - { - //pc.printf("\n device #%2d ",n); - //pc.printf(": adr: %2d: ",ow.ow.device_table[n].adr ); - for (y = 0; y < 8; y++) - { - // pc.printf(" %02x",ow.ow.device_table[n].rom[y]); - } - } - - } // end for(... - - //pc.printf("\n"); - - //-------------------------------------------------------------------- // Anfangswert bestimmen temp_mw = read_mw(0); - //pc.printf("\nPT1000; DS18B20"); - status = 0; - ds1820_status = 0; - - */ //-------------------------------------------------------------------- // Schleife fuer die Datenerfassung @@ -247,7 +270,16 @@ // Prüfen ob Zeichen eingegeben wurden get_line(); + + //------------------------------------------- + // Prüfen ob Tropfenzahl erreicht + if (tropfen_anz >= drops){ + + // mit einer 9 die Tropfen sperren + com.putc('9'); + } + //------------------------------------------- // timer 0 steuert die LED @@ -258,140 +290,108 @@ } //------------------------------------------- - // timer 1 steuert den one wire bus - /* + // Tropfensteuerung freigeben + if (down_timer.GetTimerStatus(1) == 0) - { - switch (ds1820_status) - { - case 0 : - // Temperaturwandler starten und 0,8 sek. warten - // Start conversion for all DS1820 sensors - // pc.printf("\ntrigger one wire bus"); - - ow.ds1820_start_conversion(0xFF); // alle Bausteine am Bus triggern - - // Delay until conversion is completed - down_timer.SetCountdownTimer(1,1,750); // Timer = 750ms - - // beim nächsten Auruf die Temperatur lesen - ds1820_status = 1; - - break; - - case 1 : // Temperatur von Temperaturfühler 1 lesen und 0,05 sek. warten - case 2 : // Temperatur von Temperaturfühler 2 lesen und 0,05 sek. warten - case 3 : // Temperatur von Temperaturfühler 3 lesen und 0,05 sek. warten - case 4 : // Temperatur von Temperaturfühler 4 lesen und 0,05 sek. warten - case 5 : // Temperatur von Temperaturfühler 5 lesen und 0,05 sek. warten - case 6 : // Temperatur von Temperaturfühler 6 lesen und 0,05 sek. warten - case 7 : // Temperatur von Temperaturfühler 7 lesen und 0,05 sek. warten - case 8 : // Temperatur von Temperaturfühler 8 lesen und 0,05 sek. warten - case 9 : // Temperatur von Temperaturfühler 9 lesen und 0,05 sek. warten - case 10 : // Temperatur von Temperaturfühler 10 lesen und 0,05 sek. warten - case 11 : // Temperatur von Temperaturfühler 11 lesen und 0,05 sek. warten - case 12 : // Temperatur von Temperaturfühler 12 lesen und 0,05 sek. warten - case 13 : // Temperatur von Temperaturfühler 13 lesen und 0,05 sek. warten - case 14 : // Temperatur von Temperaturfühler 14 lesen und 0,05 sek. warten - case 15 : // Temperatur von Temperaturfühler 15 lesen und 0,05 sek. warten - case 16 : // Temperatur von Temperaturfühler 16 lesen und 0,05 sek. warten - - // Write temperature of all registered sensors - uint8_t pos = ds1820_status - 1; - if ((ow.ow.device_table[pos].status & 0x0f) != 0) - { - ow.ow.device_table_index = pos; - ow.ds18B20_read_hrtemp(); - // pc.printf(" %2.2f; ",ow.ow.device_table[pos].value); - } - - ds1820_status++; - if (ds1820_status > OW_MAX_DEVICES) - { - ds1820_status = 0; - down_timer.SetCountdownTimer(1,2,10); // Timer deakivieren - // pc.printf("\nexit one wire bus"); - } - else - down_timer.SetCountdownTimer(1,1,10); // 10 ms Timer - - break; - - } // end switch - } // if (down_timer + { + down_timer.SetCountdownTimer(0,1,1000); + + tropfen_anz = 0; + + // mit einer 1 die Tropfen freigeben + if (f_flag) com.putc('1'); + } - */ //------------------------------------------- - // timer 2 steuert die Datenausgabe + // timer 2 steuert das Messen der Temperaturen und gibt die Leistung für + // die Heizung vor if (down_timer.GetTimerStatus(2) == 0) { down_timer.SetCountdownTimer(2,1,500); //------------------------------------------------------ - // PT1000 lesen und berechnen und ausgeben - // 16 mal den Eingang fuer eine bessere Mittelung lesen - // + // PT1000 Kanal 1 ( Fühler in Flüssigkeit) lesen und die Temperatur berechnen + temp_word = read_mw(1); - temp_soll = (temp_word - 28510); - temp_soll /= 113; - + temp_soll = (temp_word - OFFSET); + temp_soll /= GAIN; + + //pc.printf("%d;",temp_word); // Rohwert ausgeben + pc.printf("Soll %2.2f;",temp_soll); // Temperaturwert soll Flüssigkeit + + //------------------------------------------------------ + // PT1000 Kanal 0 ( Fühler am Heizwiderstand ) lesen und die Temperatur berechnen + temp_word = read_mw(0); - temp_float = (temp_word - 28510); //27100 + temp_float = (temp_word - OFFSET); + temp_float /= GAIN; - //pc.printf("%d;",temp_word); - pc.printf("Soll %2.2f;",temp_soll); - temp_float /= 113; //112.3 pc.printf("Temp-R %0.2f; ",temp_float); // Rohdaten ausgeben - temp_diff = (SOLL_WERT - temp_soll); + //------------------------------------------------------ + // Regelabweichung berechnen + + temp_diff = (soll_wert - temp_soll); - - if(temp_diff > SOLL_WERT)temp_diff = SOLL_WERT; + //------------------------------------------------------ + // Begrenzen der Eingangsgröße + + if(temp_diff > soll_wert)temp_diff = soll_wert; //temp_neu = ((temp_diff*0.0005) + (temp_alt*0.9)); - + + //------------------------------------------------------ + // bei geringen Abweichungen ein I-Anteil berechnen, damit Regelabweichung + // auf 0 gefahren werden if(temp_diff < 3){ esum += temp_diff * 0.00001; - } + } + + //------------------------------------------------------ + // berechnen der Steuergröße temp_neu = (temp_diff*0.0005) + esum; + //------------------------------------------------------ + // Regler nach oben begrezen + if(temp_neu > 0.02){ temp_neu = 0.02; } - - if(temp_soll > SOLL_WERT){ + + //------------------------------------------------------ + // Regler nach unten begrezen + + if(temp_soll > soll_wert){ temp_neu = 0.0; esum = 0.0; } + //------------------------------------------------------ + // Zulössige Temperatur für den Heizwiderstand begrezen + if(temp_float > R_TEMP_MAX){ temp_neu = 0.0; esum = 0.0; } - heizung.pulsewidth(0.0001 + temp_neu); - //pc.printf("%0.4f;",temp_alt); - pc.printf("%0.4f \n",temp_neu); + //------------------------------------------------------ + // Heizwiederstand ansteuern >> 0,02 entspricht 100% + + if (t_flag) + { + heizung.pulsewidth(0.0001 + temp_neu); + //pc.printf("%0.4f;",temp_alt); + pc.printf("%0.4f \n",temp_neu); + } + else + { + heizung.pulsewidth(0.000000); + } - - //------------------------------------------------------ - // one wire Daten lesen und ausgeben - /* - for (n = 0; n < OW_MAX_DEVICES; n++) // Ausgabe der Daten - { - if ((ow.ow.device_table[n].status & 0x0f) == 3) // Daten wurden gelesen - { - pc.printf("#%d %d\n",(n+20), ow.ow.device_table[n].result); - ow.ow.device_table[n].status = 2; - } - } - - down_timer.SetCountdownTimer(1,1,10); // Messung neu starten - */ } // end if(down_timer ... } // end while