SMD-Lötstation Teil 3

1

08.03.2017 von plaintron

Im letzten Teil der Projektbeschreibung möchte ich den Arduino-Code für die Steuerung der Lötstation vorstellen.

Standby-Funktion

Vorher gibt es aber noch einen kleinen Exkurs in die Beschaltung des Lötkolbens bzw. des Lötspitzenhalters. Um die Lötspitze zu schonen, ist eine Standby-Funktion sinnvoll, welche die Lötspitzentemperatur reduziert, während der Lötkolben im Halter ruht.

Die einfachste Lösung wäre ein Mikroschalter im Lötkolbenständer. Das hat allerdings den Nachteil, dass ein zusätzliches Kabel zur Lötstation geführt werden muss. Deshalb habe ich eine andere Umsetzung gewählt und einen Magneten in die Lötkolbenablage montiert, der einen Reed-Kontakt in der Griffhülste des Lötkolbens aktiviert. Hier wäre eine zusätzliche Ader in der Zuleitung sinnvoll, um den Schaltzustand des Kontakts an die Lötstation weiterzuleiten. Mein Kabel hat allerdings nur drei Leiter und ein vieradriges Silikonkabel in der gewünschten Stärke war nicht zu beschaffen. Deshalb ist der Schaltkontakt parallel zum Temperatursensor geschaltet. Wenn der Lötkolben im Halter liegt, kommt also keine Spannung mehr über die Sensorleitung.

Mein Atmega-Board prüft mehrmals pro Sekunde die Spannung auf der Sensorleitung. Diese Spannung wird, wie schon beschrieben, auf einen Wert zwischen 0,5 Volt und 3 Volt verstärkt. Je nach Zustand des Lötkolbens kommen nun mehrere Situationen in Betracht:

  • Spannung unter 0,5 Volt: Standby-Modus, Sensor kurzgeschossen
  • Spannung zwischen 0,5 und 3 Volt: Regelbereich Normalbetrieb
  • Spannung über 3 Volt: Fehler, z.B. Lötkolben nicht angeschlossen (in dem Fall zieht mein Pullup-Widerstand die Eingangsspannung hoch).

 

Natürlich kann ich im Standby-Modus die Spitzentemperatur nicht mehr messen. Deshalb habe ich vorher vorsichtig mit Hilfe eines Lötspitzenthermometers getestet, bei welchem PWM-Verhältnis eine Temperatur zwischen 80 und 100 Grad erreicht wird, also meine gewünschte Standby-Temperatur. Das ist bei einem Tastverhältnis von 1:20 der Fall. Je nach PWM-Frequenz kann dieser Wert allerdings variieren. Sobal der Lötkolben aus der Halterung genommen wird, liegt wieder eine Spannung am OP-Eingang an, die sich innerhalb des Regelbereiches befindet. Der Lötkolben heizt nun innerhalb weniger Sekunden auf die Sollspannung.

Temperatursteuerung

Für den fertigen Sketch benötige ich einige Bibliotheken.

Quadratur-Drehgeber: „rotary.h“

Prinzipiell lässt sich der Encoder auch mit wenigen Zeilen Code in der Loop abfragen. Einfacher und zuverlässiger ist allerdings die Verwendung eines oder beider Hardware-Interrupts des Atmega328P. Deshalb ist folgender zusätzlicher Code erforderlich:

ISR(PCINT2_vect) {
  unsigned char result = r.process();
  if (result) {
    rot_dir = result;
    rot = true;    
  }
}

Im Falle eines Interrupt-Ereignisses auf den Pins 2 oder 3 wird die process()-Funktion der rotary-Bibliothek aufgerufen und zwei globale Variablen geändert.

Sobal die boolsche Variable „rot“ auf „true“ gesetzt ist, wird eine Funktion aufgerufen, welche den eingestellten Ist-Wert entsprechend der Drehrichtung ändert.

void set_ratio(){
  rot = false;  
  if(rot_dir == DIR_CW){
    if(ratio < 20) ratio ++; } else { if(ratio > 0) ratio --;
  }
  Setpoint = ratio * 20; 
  EEPROM.update(0, ratio);
  lcd.setCursor(5, 0);
  if(Setpoint < 70) {
    lcd.print(" ");    
  }
  lcd.print(Setpoint);
}

 

Speicherung des zuletzt eingestellten Wertes: „EEPROM.h“

Damit nach jedem Einschalten die zuletzt gewählte Temperatur als Sollwert erscheint, speichere ich jede Änderung des Wertes im EEPROM, und zwar direkt als 8-Bit unsigned integer. Wer mag, kann auch noch ein Wear-Leveling einbauen, um den EEPROM gleichmäßig „abzunutzen“. Anderenfalls kann es nach über 100.000 Schreibvorgängen zu Fehlern im EEPROM kommen.

LCD-Ansteuerung: „LiquidCrystal.h“

Mit der LiquidCrystal-Bibliothek lässt sich das Display ähnlich wie die UART-Schnittstelle Stream-basiert verwenden, etwa mit den Funktionen „write()“ oder „print()“. Damit das funktioniert, wird die Bibliothek mit den verwendeten LCD-Pins initialisiert. Für serielle Displays (SPI, I2C, UART) gibt es ebenfalls passende Bibliotheken. Noch eleganter ist natürlich die Verwendung eines TFT- oder OLED-Displays, das auch eine grafische Gestaltung zulässt. In meiner Lötstation kommt ein einfaches 2×8-Display zum Einsatz.

Beim Systemstart wird das Display eingeschaltet und initialisiert:

void init_display(){
  lcd.begin(8, 2);
  lcd.print("Temp:"); 
  int s = (int)(Setpoint);
  if (s < 100){
    lcd.print(" ");    
  }
  lcd.print(s);
  lcd.setCursor(0, 1);
  lcd.print("Sens:"); 
  lcd.print("  0"); 
}

 

PID-Temperaturregelung: PID_v1.h

Die PID-Regelung ist der spannendste Teil des Programms. Grundsätzlich ließe sich eine Temperaturregelung realisieren, indem man einen Minimal- und einen Maximal-Wert festlegt. Wird der Minimalwert unterschritten, schaltet die Heizung ein. Wird der Maximal-Wert überschritten, schaltet die Heizung aus. Wer das mal ausprobiert hat, wird festgestellt haben, dass es eine Weile braucht, bis die Ist-Temperatur sich auf den korrekten Wert eingependelt hat. Mit jeder Wärmeabfuhr beim Lötvorgang wiederholt sich dieses Pendeln. Mit der PID-Regelung lässt sich dieses Problem lösen, indem nicht nur der aktuelle Wert ausgewertet wird, sondern eine Reihe vorheriger Werte ebenfalls Auswirkungen auf das Regelergebnis haben. Die Regelfunktion lernt sozusagen, wie sich der Regelkreis über einen längeren Zeitraum verhält. Über drei Parameter lässt sich einstellen, wie schnell, wie stark und über welche Zeitspanne die Regelung arbeitet.

Diese PID-Bibliothek habe ich bereits in meinem Reflow-Ofen verwendet und sie als zuverlässige Regelhilfe schätzen gelernt. Wer mehr über die Verwendung der PID-Regelung erfahren möchte, findet eine praktische Anleitung im Blog von Brett Beauregard. Eine eher wissenschaftliche Betrachtung dieser Regelungstechnik findet sich in dieser PDF-Datei der California State University.

Die PID-Bibliothek benötigt drei globale Variablen:

double Setpoint, Input, Output;

Um einen definierten Anfangszustand zu erhalten, werden Setpoint und Input beim Systemstart initialisiert. Außerdem werden noch einige PID-Werte gesetzt. Falls im EEPROM bereits ein Sollwert gespeichert ist, übernehme ich ihn vor der ersten Temperaturmessung.

Setpoint = 0;
Input = 1;
//turn the PID on
myPID.SetOutputLimits(0, 200);
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(200);

Die Input-Variable wird nach jedem Messvorgang an das PID-Objekt gesetzt (bei mir alle 200ms) und die Berechnung durchgeführt:

Input = analogRead(A0)+1;
myPID.Compute();

Ebenfalls in dieser 200ms-Schleife wird das PID-Ergebnis ausgelesen und der PWM-Wert entsprechend eingestellt:

if(Input > 70){
      pwm = (uint8_t)(Output/10);
      interval = 10;
    } else {
      pwm = 1;  
      interval = 100;          
    }

Die If-Abfrage prüft, ob der Messwert im Regelbereich liegt. Anderenfalls wird die Standby-Routine eingeleitet und das Messintervall verlangsamt.

Das waren im Prinzip alle relevanten Teile des Programms und viel mehr ist auch nicht notwendig. Wer möchte, kann natürlich noch diverse Komfortfunktionen implementieren (z.B. Temperatur-Presets, Display-Spielereien, Vernetzung etc.). Einen vollständigen Sketch möchte ich hier nicht veröffentlichen, weil er im aktuellen Zustand noch nicht wirklich zum Nachbau empfohlen ist und auch weil ohnehin die meisten Entwickler ihre Lieblingsbibliotheken haben oder eine andere Schaltung verwenden, die mit meinem Sketch überhaupt nicht harmoniert.

Ein Tipp noch zum Schluss: Die RT-Lötspitzen von Weller gibt es bei Weidinger für 19,85 plus Versandkosten und Mehrwertsteuer.

Advertisements

Ein Kommentar zu “SMD-Lötstation Teil 3

Kommentieren

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Blogverzeichnis - Bloggerei.de
%d Bloggern gefällt das: