03082014

Dependencies:   Buffer ConfigFile SDFileSystem mbed mon timer0

Fork of 15_PT1000 by Temp27

Files at this revision

API Documentation at this revision

Comitter:
rs27
Date:
Sun Aug 03 08:12:55 2014 +0000
Parent:
5:7c6fbe5d62e5
Child:
7:c1602e28a906
Commit message:
update

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
monitor.lib Show annotated file Show diff for this revision Revisions of this file
--- 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
--- a/monitor.lib	Sat Aug 02 19:09:31 2014 +0000
+++ b/monitor.lib	Sun Aug 03 08:12:55 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/rs27/code/monitor/#19313470f629
+http://mbed.org/teams/Temp/code/monitor/#e330478fb0b6