070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

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