/* ************************************************************************************************* ***** * ***** N e b e l m a s c h i n e n - S t e u e r u n g * ***** * ***** 02.2005 - 03.2005 Thilo Mölls * ***** * ***** Messung mit pt100, <250°C Heizung einschalten, >255°C ausschalten. >250°C erfolgt * ***** Freigabe 'NEBELN', diese setzt sich <200°C zurück (kein Nebeln möglich). * ***** Konstantstrom über pt100: 1mA, d.h. 250°C = 194.7mV. * ***** < -30°C (Kurzschluss am Temperaturfühler) und >350°C (Drahtbruch) erzeugt Störung: * ***** Blinken der 'BEREIT'-LED und abschalten von Heizung und Pumpe, Nebeln nicht möglich. * ***** AD-Wandler differentiell (AD0+ / AD1-), Verstärkung x20, ext. REF 5.000V. * ***** Wegen höherer Genauigkeit wird ein Mittelwert aus 32 Messwerten gebildet. * ***** * ***** !!! CKSEL-Fuses Bit 3..0 auf 0100 (8MHz intern) setzen !!! * ***** * ***** _______________________________________________________________________________________ * ***** Quellcode für GNU-C-Compiler (AVR-GCC) * ************************************************************************************************* _________________________________________________________________________________________________ | Belegung der Ein-/ Ausgänge: | | ---------------------------- | | PORT A: Bit 0: Pin 20: (ADC0) Temperaturmessung + (differentiell, Faktor 20) | | ------- Bit 1: Pin 19: (ADC1) Temperaturmessung - (differentiell, Faktor 20) | | Bit 2: Pin 18: (ADC2) - NC - | | Bit 3: Pin 17: (AREF) Uref = 5.000V | | Bit 4: Pin 14: (ADC3) - NC - | | Bit 5: Pin 13: (ADC4) - NC - | | Bit 6: Pin 12: (ADC5/AIN0) - NC - | | Bit 7: Pin 11: (ADC6/AIN1) - NC - | | PORT B: Bit 0: Pin 01: (MOSI/DI/SDA/nOC1A) - NC - | | ------- Bit 1: Pin 02: (MISO/DO/OC1A) - NC - | | Bit 2: Pin 03: (SCK/SCL/nOC1B) - NC - | | Bit 3: Pin 04: (OC1B) Ausgang Pumpe | | Bit 4: Pin 07: (ADC7/XTAL1) Ausgang Heizung | | Bit 5: Pin 08: (ADC8/XTAL2) Ausgang LED 'BEREIT' | | Bit 6: Pin 09: (ADC9/INT0/TO) Eingang Taster Nebeln - pullup | | Bit 7: Pin 10: (ADC10/nRESET) - NC - | |________________________________________________________________________________________________ */ #include #include #include // Globale Variablen im SRAM volatile float ADCresult_average = 0; // Durchschnittswert-Variable volatile float Temperature; // Temperaturberechnung volatile unsigned char Freigabe; // Freigabe Nebeln INTERRUPT(SIG_OVERFLOW1) { PORTB ^= (1<> 5; // Addierte Ergebnisse durch 8 teilen ADCresult_average = ADCresult; // Mittelwert der 8 Messungen der globalen Variable zuweisen return; } /***************************************************************************************/ void Temp_calculation(void) { Temperature = (((.250/1024)*(ADCresult_average))); // Temperaturberechnung in V ADCresult_average = 0; // Durchschnittswert auf '0' return; } /***************************************************************************************/ void Stoerung(void) { PORTB &= (0b11100111); // Pumpe aus, Heizung aus Freigabe = 0; // Nebeln nicht möglich TCCR1B = 0b00001110; // Teiler /8192 starten return; } /***************************************************************************************/ /***************************************************************************************/ // Beginn Programmablauf for (;;) // Endlos - Schleife { ADC_conversion(); // Mittelwert aus 32 Messungen Temp_calculation(); // Spannung in Volt über PT100 berechnen // Auswerten und steuern: if (Temperature<=0.17584 && Temperature>0.08822) //<=175.84Ohm (200°C) => Heizen, Nebeln nicht möglich { //>88.22mV (-30°C) Freigabe =0; PORTB |= (1<0.08822) //<194.07Ohm (250°C) => Heizen, Nebeln möglich { //>88.22mV (-30°C) PORTB |= (1<0.19407 && Temperature<0.22967) //>194.07Ohm (250°C) => Heizen, Nebeln möglich { //229.67Ohm (350°C) Freigabe =1; // Freigabe 'Nebeln' ein PORTB |= (1<=0.19588 && Temperature<0.22967) //>=195.88Ohm (255°C) => Heizen aus, Nebeln möglich { //<229.67Ohm (350°C) PORTB &= (0b11101111); // Heizung aus TCCR1B = 0b01000000; // Teiler /8192 (hier gestoppt) } if (Temperature<=0.08822) //<=88.22Ohm (-30°C) => Störung (Kurzschluss) { Stoerung(); } if (Temperature>=0.22967) //>=229.67Ohm (350°C) => Störung (Drahtbruch) { Stoerung(); } if ((!(PINB & (1<