update300714

Dependencies:   Buffer ConfigFile DS2482 mbed monitor timer0

Fork of 11_PT1000 by Sven Schäfer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // Version 10 27.07.2014
00002 // die Ausgabe auf das Format #nr val umgestellt
00003 
00004 #include "mbed.h"
00005 #include "ConfigFile.h"
00006 #include "SDFileSystem.h"
00007 #include "DS2482.h"
00008 #include "timer0.h"
00009 #include "Buffer.h"
00010 #include "monitor.h"
00011 
00012 #define CR 13
00013 
00014 SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, "sd");  // The pinout (MOSI, MISO, SCLK, CS)
00015 timer0 down_timer;                              // Zeitsteuerung
00016 Serial pc(USBTX, USBRX);                        // tx, rx
00017 Buffer <char> buf;                              // Ringbuffer für ankommende Zeichen
00018 PwmOut heizung(PTA13);
00019 
00020 //        sda, scl, adr
00021 DS2482 ow(PTE0,PTE1,0x30);
00022 
00023 DigitalOut r(LED_RED);
00024 DigitalOut g(LED_GREEN);
00025 DigitalOut b(LED_BLUE);
00026 
00027 DigitalOut led1(LED1);
00028 //DigitalOut LED2(PTA2);
00029 DigitalOut LED5(PTA5);
00030 DigitalOut LED_4(PTA12);
00031 
00032 // Schalter 4051
00033 DigitalOut DC_A(PTE2);
00034 DigitalOut DC_B(PTE3);
00035 DigitalOut DC_C(PTE4);
00036 DigitalOut DC_EN(PTE5);
00037 
00038 // PT1000 Karte 1
00039 AnalogIn an1(PTC0);
00040 AnalogIn an2(PTB1);
00041 AnalogIn an3(PTB2);
00042 AnalogIn an4(PTB3);
00043 AnalogIn an5(PTC2);
00044 AnalogIn an6(PTD5);
00045 
00046 // 0 bis 5V 
00047 AnalogIn an13(PTD6);
00048 
00049 // Analog pins
00050 /*
00051 1   PTE20, ADC0_SE0,  0}, k2.2
00052 2   PTE22, ADC0_SE3,  0}, k2.3
00053 3   PTE21, ADC0_SE4a, 0},
00054 4   PTE29, ADC0_SE4b, 0}, k2,4
00055 5   PTE30, ADC0_SE23, 0}, k2.5
00056 6   PTE23, ADC0_SE7a, 0},
00057 7   PTB0,  ADC0_SE8,  0}, k2.1
00058 8   PTB1,  ADC0_SE9,  0}, k1.2
00059 9   PTB2,  ADC0_SE12, 0}, k1.3
00060 10  PTB3,  ADC0_SE13, 0}, k1.4
00061 11  PTC0,  ADC0_SE14, 0}, k1.1
00062 12  PTC1,  ADC0_SE15, 0}, k2.6
00063 13  PTC2,  ADC0_SE11, 0}, k1.5
00064 14  PTD1,  ADC0_SE5b, 0},
00065 15  PTD5,  ADC0_SE6b, 0}, k1.6
00066 16  PTD6,  ADC0_SE7b, 0}, k3.1
00067 */
00068 
00069 float temp1, temp_mw;
00070 uint16_t temp_word;
00071 uint8_t n, y, status, ds1820_status;
00072 
00073 
00074 
00075 float temp_float, temp_diff, temp_alt, temp_neu;
00076 
00077 ConfigFile cfg;
00078 char value[BUFSIZ];
00079 
00080 //------------------------------------------------------------------------------
00081 // Werte die auch über das config file gesetzt werden können
00082 float offset = 0.0;
00083 
00084 //------------------------------------------------------------------------------
00085 // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen
00086 void rx_handler(void)
00087 {
00088     // Note: you need to actually read from the serial to clear the RX interrupt
00089     
00090     char ch;
00091     
00092     while (pc.readable()) 
00093     {   
00094       ch = pc.getc();
00095       buf.put(ch);
00096     }
00097 }
00098 
00099 //------------------------------------------------------------------------------
00100 // lesen der PT1000 AD-Werte
00101 //
00102 // Um Störungen zu reduzieren werden 16 Werte gelesen und daraus wird der
00103 // Mittelwert berechnet. Eine Messung dauert ca. 30µs. Somit wird für eine Messung
00104 // ca. eine Zeit von 0,5ms benötigt.
00105 //
00106 int read_mw(uint8_t pos)
00107 {
00108     uint8_t n;
00109     
00110     int val = 0;
00111     int mw = 0;
00112     
00113     LED_4 = 0;
00114     
00115     // 16 Messungen für eine bessere Mittelung durchführen
00116     
00117     for (n = 0; n < 16; n++)
00118     {
00119          switch (pos)
00120          {      
00121             // PT1000 Karte 1
00122             case 0:  val = an1.read_u16(); break;
00123             case 1:  val = an2.read_u16(); break;
00124             case 2:  val = an3.read_u16(); break;
00125             case 3:  val = an4.read_u16(); break;
00126             case 4:  val = an5.read_u16(); break;
00127             case 5:  val = an6.read_u16(); break;         
00128          }
00129          mw += val;
00130     } // end for
00131     
00132     // Temperatur berechnen
00133     // Wert durch 16 teilen
00134     
00135     mw = mw >> 4;
00136     
00137     LED_4 = 1;
00138     
00139     return mw;
00140 }
00141 
00142 //------------------------------------------------------------------------------
00143 //
00144 
00145 int main() 
00146 {
00147     
00148     heizung.period(0.020);          //  requires a 20ms period
00149     heizung.pulsewidth(0.005);
00150     temp_alt = 0.0;
00151     
00152     
00153     //------------------------------------------------------------------------------
00154     // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
00155     //
00156     pc.baud(115200);
00157     pc.attach(&rx_handler, Serial::RxIrq);
00158     pc.printf("\n V08 was compiled on %s  %s \n", __DATE__,__TIME__);
00159 
00160     mon_init();
00161     
00162     //------------------------------------------------------------------------------
00163     // Timer für die Zeitsteuerung
00164     //
00165     down_timer.SetCountdownTimer(0,1,50);  // Timer für die LED
00166     down_timer.SetCountdownTimer(1,1,500); // Timer für den one wire bus
00167     down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten
00168     
00169     r = g = b = 1;                          // RGB LED ausschalten
00170     
00171     //--------------------------------------------------------------------
00172     // Variablen von der SD Karte initialisieren
00173     
00174     cfg.read("/sd/input.cfg");
00175               
00176     if (cfg.getValue("offset", &value[0], sizeof(value))) 
00177     {
00178         offset = atof(value);
00179         pc.printf("\noffset = %f", offset); 
00180     }
00181     
00182     //--------------------------------------------------------------------
00183     // one wire bus 
00184 
00185     /*
00186     // pc.printf("\n ++++ on wire search ++++\n");
00187     wait (0.1);
00188     ow.DS18XX_Read_Address();
00189     
00190     n = ow.ow.devices;
00191     
00192     // Anzahl der ow Bausteine ermitteln
00193     y = 0;
00194     for (n = 0; n < OW_MAX_DEVICES; n++)
00195     {           
00196        if ((ow.ow.device_table[n].status & 0x0f) == 1) y++;
00197     } // end for(...
00198     
00199     // pc.printf("\n   %d devices FOUND  \n",y);
00200 
00201     // ow 64 bit Adressen ausgeben
00202     for (n = 0; n < OW_MAX_DEVICES; n++)
00203     {           
00204         if ((ow.ow.device_table[n].status & 0x0f) == 1)
00205         {   
00206             //pc.printf("\n   device #%2d  ",n); 
00207             //pc.printf(": adr: %2d:  ",ow.ow.device_table[n].adr );
00208             for (y = 0; y < 8; y++)
00209             {
00210             //    pc.printf(" %02x",ow.ow.device_table[n].rom[y]);
00211             }
00212         }
00213 
00214     } // end for(...
00215 
00216     //pc.printf("\n");
00217 
00218     //--------------------------------------------------------------------
00219     // Anfangswert bestimmen
00220     
00221     temp_mw = read_mw(0);
00222     
00223     //pc.printf("\nPT1000; DS18B20");
00224     status = 0;
00225     ds1820_status = 0;
00226     
00227     */
00228     
00229     //--------------------------------------------------------------------
00230     // Schleife fuer die Datenerfassung
00231     
00232     while(1) 
00233     {
00234        //-------------------------------------------
00235        // Prüfen ob Zeichen eingegeben wurden
00236        
00237        get_line();
00238        
00239        //-------------------------------------------
00240        // timer 0 steuert die LED
00241        
00242        if (down_timer.GetTimerStatus(0) == 0)
00243        {
00244           down_timer.SetCountdownTimer(0,1,500);
00245           LED5 = !LED5;
00246        }
00247        
00248        //-------------------------------------------
00249        // timer 1 steuert den one wire bus       
00250        /*
00251        if (down_timer.GetTimerStatus(1) == 0)
00252        {       
00253             switch (ds1820_status)
00254             {
00255                 case 0 :
00256                         // Temperaturwandler starten und 0,8 sek. warten
00257                         // Start conversion for all DS1820 sensors
00258                         // pc.printf("\ntrigger one wire bus");
00259                         
00260                         ow.ds1820_start_conversion(0xFF);   // alle Bausteine am Bus triggern
00261                         
00262                         // Delay until conversion is completed
00263                         down_timer.SetCountdownTimer(1,1,750); // Timer = 750ms
00264                                     
00265                         // beim nächsten Auruf die Temperatur lesen
00266                         ds1820_status = 1;
00267                                     
00268                         break;
00269 
00270                 case 1  :   // Temperatur von Temperaturfühler 1  lesen und 0,05 sek. warten
00271                 case 2  :   // Temperatur von Temperaturfühler 2  lesen und 0,05 sek. warten            
00272                 case 3  :   // Temperatur von Temperaturfühler 3  lesen und 0,05 sek. warten
00273                 case 4  :   // Temperatur von Temperaturfühler 4  lesen und 0,05 sek. warten
00274                 case 5  :   // Temperatur von Temperaturfühler 5  lesen und 0,05 sek. warten
00275                 case 6  :   // Temperatur von Temperaturfühler 6  lesen und 0,05 sek. warten
00276                 case 7  :   // Temperatur von Temperaturfühler 7  lesen und 0,05 sek. warten
00277                 case 8  :   // Temperatur von Temperaturfühler 8  lesen und 0,05 sek. warten
00278                 case 9  :   // Temperatur von Temperaturfühler 9  lesen und 0,05 sek. warten
00279                 case 10 :   // Temperatur von Temperaturfühler 10 lesen und 0,05 sek. warten
00280                 case 11 :   // Temperatur von Temperaturfühler 11 lesen und 0,05 sek. warten
00281                 case 12 :   // Temperatur von Temperaturfühler 12 lesen und 0,05 sek. warten
00282                 case 13 :   // Temperatur von Temperaturfühler 13 lesen und 0,05 sek. warten
00283                 case 14 :   // Temperatur von Temperaturfühler 14 lesen und 0,05 sek. warten
00284                 case 15 :   // Temperatur von Temperaturfühler 15 lesen und 0,05 sek. warten
00285                 case 16 :   // Temperatur von Temperaturfühler 16 lesen und 0,05 sek. warten
00286                                     
00287                             // Write temperature of all registered sensors
00288                             uint8_t pos = ds1820_status - 1;
00289                             if ((ow.ow.device_table[pos].status & 0x0f) != 0)
00290                             {
00291                               ow.ow.device_table_index = pos;
00292                               ow.ds18B20_read_hrtemp();
00293                               // pc.printf(" %2.2f; ",ow.ow.device_table[pos].value);
00294                             }
00295 
00296                             ds1820_status++;
00297                             if (ds1820_status > OW_MAX_DEVICES) 
00298                             {
00299                               ds1820_status = 0;
00300                               down_timer.SetCountdownTimer(1,2,10); // Timer deakivieren
00301                               // pc.printf("\nexit one wire bus");   
00302                             }
00303                             else
00304                               down_timer.SetCountdownTimer(1,1,10); // 10 ms Timer
00305                             
00306                             break;
00307                                                                                                                                                                                 
00308             } // end switch
00309        }  // if (down_timer
00310        
00311        */
00312        //-------------------------------------------
00313        // timer 2 steuert die Datenausgabe
00314        
00315        if (down_timer.GetTimerStatus(2) == 0)
00316        {
00317             down_timer.SetCountdownTimer(2,1,500);
00318             
00319             //------------------------------------------------------
00320             // PT1000 lesen und berechnen und ausgeben
00321             // 16 mal den Eingang fuer eine bessere Mittelung lesen
00322             //
00323            
00324             temp_word = read_mw(0);
00325             temp_float = (temp_word - 28500);
00326             
00327             //pc.printf("%d;",temp_word);
00328             
00329             temp_float /= 116;
00330             pc.printf("%0.2f; ",temp_float);                     // Rohdaten ausgeben
00331 
00332             temp_diff = 40 - temp_float;
00333             
00334             
00335   
00336             temp_neu = ((temp_diff*0.0005) + (temp_alt*0.9));
00337             
00338             if(temp_neu > 0.02){
00339                 temp_neu = 0.02;
00340             }            
00341             //if(temp_neu < -0.001){
00342             //    temp_neu = -0.001;
00343             //}
00344             if(temp_float > 40){
00345                 temp_neu = 0.0;
00346                 }
00347             
00348             heizung.pulsewidth(0.0001 + temp_neu);
00349             pc.printf("%0.4f;",temp_alt);
00350             pc.printf("%0.4f \n",temp_neu);
00351             
00352             temp_alt = temp_neu;
00353 
00354             temp_word = read_mw(1);
00355             temp_float = (temp_word - 17210);
00356             temp_float /= 70;
00357             // pc.printf("%0.2f\n",temp_float);                      // Rohdaten ausgeben
00358 
00359             
00360              
00361        
00362             //------------------------------------------------------
00363             // one wire Daten lesen und ausgeben
00364             /*
00365             for (n = 0; n < OW_MAX_DEVICES; n++)                // Ausgabe der Daten
00366             {  
00367                if ((ow.ow.device_table[n].status & 0x0f) == 3)  // Daten wurden gelesen
00368                {
00369                  pc.printf("#%d %d\n",(n+20), ow.ow.device_table[n].result);
00370                  ow.ow.device_table[n].status = 2;
00371                }
00372             }
00373             
00374             down_timer.SetCountdownTimer(1,1,10);                // Messung neu starten
00375             */
00376        } // end if(down_timer ...
00377                             
00378     } // end while
00379 }
00380