update300714
Dependencies: Buffer ConfigFile DS2482 mbed monitor timer0
Fork of 11_PT1000 by
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
Generated on Thu Jul 14 2022 23:39:48 by 1.7.2