/* ; Lötstation für Weller LR21 Funktion: der SIGNAL (TIMER1_OVF_vect) Timerinterrupt (jede Sekunde) misst die Thermospannung des Kolben über leseAD() und rechnet diese in °C um. Die Heizung wir eingeschaltet. Je nach Regelabweichung wird die Heizung nach einer bestimmten Anzahl Nulldurchgänge der Netzspannung wieder ausgeschaltet. Der Analogkomperator erkennt den Nulldurchgang und löst Interrupt (ANA_COMP_vect) aus. Dort erfolgt auch ein und ausschalten jeweils im Nulldurchgang. Der Stellwert kann 0 bis 50 Perioden in einer Sekunde betragen. ; Hardware ; ___________ ; __ / | ;+5V O-|__|--|RESET PC5|--O PWM-AUS - GND ; | | ; O--|PD0 PC4|--O LED - GND ; | | ; O--|PD1 PC3|--O Schalter am Ständer - GND ; | | ; LCD O--|PD2 PC2|--O Taster UP - GND ; | | ; LCD O--|PD3 ADC1|--O Taster Down - GND ; | A T | ; LCD O--|PD4 ADC0|--O AD-IN ; | mega | ; +5V O--|VCC GND|--O GND ; | 8 | ; GND O--|GND AREF|--O ; | | ; XTAL1 O--|XTAL1 AVCC|--O ; | | ; XTAL2 O--|XTAL2 PB5SCK|--O ; | | ; O--|PD5 PB4MISO|--O ; | | ; O--|PD6 PB3MOSI|--O LCD ; | | ; O--|PD7 PB2OC1B|--O LCD ; | | ; LCD O--|PB0 PB1OC1A|--O LCD ; |____________| ; */ #include #include #include #include #include #include #include "BinaryNr.h" #include "lcd.h" #define F_CPU 1000000 // Interner Takt 1MHz #define Prescaler 1024; // Timer 1 Vorteiler #define startwert 65537-F_CPU/Prescaler; //Zähler Startwert, Überlauf bei 65536 #define u8 unsigned char #define u16 unsigned int /* Variablen */ char s[4]; // Hilfsvariable u16 adWert; // AD-Wert u16 Tist; // IstTemperatur u16 Tsoll; // Solltemperatur u16 eeFooWord EEMEM = 280; // EEprom Speicher // ############## A C H T U N G ###################### // hier an den Temperaturfühler anpassen // bei Platin- oder PTC-Fühler ausserdem RPTC1 und RPTC2(Brücke) einlöten //***** edit ***** diese beiden Zeilen für Thermoelementfühler //float faktor = 0.5889; // Spannung in Temp. bei Thermoelement //float n = 20; // y = mx + n bei Thermoelement //***** edit ***** diese beiden Zeilen für Platin- oder PTC-Fühler float faktor = 0.73; // Spannung in Temp. bei PTC float n = -289; // y = mx + n bei PTC u8 perioden=0; // zählt die Anzahl der Perioden (20ms) u8 stellwert=0; // Einschaltdauer von 0 bis 50 (50 Perioden) /* INIT */ void port_init(void){ // initialize ports DDRC = B00110000; // PORTC 4 und 5 als Ausgang PORTC = B00001110; // PullUps für Taster einschalten } void ad_init(void){ // initialize ad-wandler ADMUX = 0x00; // Kanal0 ADMUX |= (1<10) // und min-wert noch nicht erreicht { Tsoll=Tsoll-10; // erniedrige Tsoll Schreibe_Startemp(Tsoll); // sichere Tsoll im EEPROM } } if(bit_is_clear (PINC,2)) // wenn Taste UP gedrückt { if(Tsoll<450) // und max-wert noch nicht erreicht { Tsoll=Tsoll+10; // erhöhe Tsoll Schreibe_Startemp(Tsoll); // sichere Tsoll im EEPROM } } zeige_Tsoll(Tsoll); // Solltemp. anzeigen // regelung ******************************************** if (Tsoll<=Tist){ // zu heiss if (Tist-Tsoll < 10){ // weniger als 10 Grad Abweichung stellwert = 20; // Heizleistung 40% } else { // Abweichung größer 20 Grad C stellwert = 0; // erst mal gar nicht Heizen } } if (Tsoll>Tist){ // zu kalt if (Tsoll-Tist < 10){ // weniger als 10 Grad Abweichung stellwert = 20; // Heizleistung 40% } else { // Abweichung größer 20 Grad C stellwert = 50; // 100% Heizleistung } } sei(); // enable interrupts } /*********************/ int main(){ port_init(); // Ports initialisieren lcd_init(LCD_DISP_ON); // initialisiere display, cursor off ad_init(); // AD-Wandler initialisieren ac_init(); // initialisiere analog-Komparator timer_init(); // Timer initialisieren Tsoll=Lese_Starttemp(); // Starttemperatur lesen, Vorgabe vom letzten mal Schreibe_Startemp(Tsoll); // Starttemperatur schreiben lcd_puts("Start... "); // Startmeldung auf LCD sei(); // enable interrupts for(;;){ // tue nix Schleife } }