Hallo alle zusammen.
EDIT:
Aktuell AB diesem Beitrag lesen
EDIT ENDE
Ich habe nach einiger Zeit endlich mal mit meinem Reflow Ofen angefangen, nach Inspiration von Thomas Pfeifer und dem BASIC Code und Triac Schaltung von flipp86, welcher er mir zur Verfügung gestellt hat.
Er soll im Prinzip laut flipp86 folgendes machen:
Im Beispiel wird ein Atmega 8 verwendet:
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 8000000 ' 8 MHz
$baud = 9600
Config Single = Scientific , Digits = 2
Config Adc = Single , Prescaler = Auto , Reference = Aref 'ADC Konfigurieren
Start Adc
'Timer1 zählt im Sekundentakt (nur interessnt um die Daten später zB in Excel auszuwerten
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 34285 'Timer1 soll schon von 34285 wegzählen
'ADC Wert
Dim Messergebnis As Word 'Errechnete Temperatur
Dim Temp As Single
Dim M As Single 'Steigung m
Dim M1 As Single 'Hilfsvariable zur Berechnugn der Steigung
Dim M2 As Single 'Hilfsvariable zur Berechnugn der Steigung
Dim N As Single ' y-Achsenabschnitt
Dim X1 As Single , X2 As Single , Y1 As Single , Y2 As Single 'X und Y Koordinate für Punkt1 und Punkt2
Config Portb.1 = Output ' Pin B1 ausgabe Pin für den Optokoppler (MOC3041)
Heizung Alias Portb.1 ' Pin PB4 auf dem Pollin Erweiterungsboard
Declare Sub Print_sub 'Unterfunktion für die Ausgabe der Daten
Declare Sub Temp_sub 'Unterfunktion wo die Temperatur berechnet wird
Heizung = 0 'Heizung aus
Dim Phase As Byte
Dim Timer_preheat As Byte , Timer_solder As Byte , Timer_temp_pause As Byte
Phase = 1
Timer_preheat = 1
Timer_solder = 1
' Grundlagen Lineare Interpolation
' Funktion berechnen
' f(x) = m*x + n
' m = Steigung
' n = y-Achsenabschnitt
'
' Gegeben: P1(x1 / y1) P1 ist der Punkt, der weiteraußen auf der x-Achse liegt, also hier die höhere Temperatur!!!
' P2(x2 / y2)
'
' Steigung berechnen:
' m = (y1 - y2) / (x1 / x2) -->
' y-Achsenabschnitt berechnen
' Einen der beiden Punkte in die Gleichung einsetzen und nach n Auflösen
'
' y = m*x + n --> n = y - (m*x)
' --> f(x) = m*x + n
'--------------------------------------------
'wichtig!! P1 ist der höhere Temperaturwert,
' da die x-Achse die Temperaturachse ist!!!
X1 = 187 'Temperatur 1
Y1 = 80 'Messwert 1
X2 = 25.4 'Temperatur 2
Y2 = 0 'Messwert 2
'_____________________________________________
'Steigung m
M1 = Y1 - Y2
M2 = X1 - X2
M = M1 / M2
' y-Achsenabschnitt n
N = M * X1
N = Y1 - N
Dim Sekunden As Word
Print : Print : Print
Print "Startup..."
Print : Print : Print
Print "Steigung m = " ; M ; " y-Achsenabschnitt n = " ; N
Print "f(x) = " ; M ; "*x + " ; N
Do
' Temperaturberechnung in Unterfunktion ausgegliedert
Temp_sub ' ADC wir dauch dort gemessen
' Daten ausgeben
Print_sub
If Messergebnis < 80 Then Heizung = 1 'Diese Beiden Zeilen muss du rausnehmen, wenn du den ADC Wert bei Raumtemperatur messen willst.
If Messergebnis >= 80 Then Heizung = 0
Wait 1
Loop
End
Sub Temp_sub
Messergebnis = Getadc(5) 'Messergenbnis entspricht dem y-Wert der Funktion
Temp = Messergebnis - N ' Temp entspricht dem x-Wert der Funktion x = (y-n) / m
Temp = Temp / M
End Sub
Sub Print_sub
Print "Messergebnis: " ; Messergebnis ; " Temperatur: " ; Temp ; " Heizung: " ; Heizung ; " Phase: " ; Phase
End Sub
Isr_von_timer1: 'ISR von Timer1
Timer1 = 34285 'Timer1 soll wieder von 34285 wegzählen
Incr Sekunden 'Variable Sekunden wird einmal pro Sekunde hochgezählt
Return
Alles anzeigen
Er soll (Schritt für Schritt);
- PinB.1 einschaltet, da Messergebnis noch nicht bei 80 liegt!
- Jede Sekunde wird an ADC5 ausgewertet, wo eine 4148 Diode gegen GND geschaltet ist.
- Wenn das Messergebnis auf 80 angekommen ist, schaltet PinB.1 aus, solange bis es wieder unter 80 ist.
- Parallel dazu wird mittels Linear Funktion, vorher ermittelte Messergebnisse miteinander verglichen.
- Nach bestimmter Zeit, schaltet das Programm in die 5 verschiedenen Löt Phasen, damit die Bauteile verlötet werden.
- Nachdem alle Phasen durchlaufen sind, schaltet das Programm aus, bis der AVR Resetet wird.
Soweit die Theorie!
Bei mir hapert es schon beim Kalibrieren der Diode!!
Laut Flipp sollte ich mit der Diode, vorher die Raumtemperatur ausmessen und danach die Temperatur bei Messwert 80 im Ofen!
Lege ich nun die Diode wie im Schaltplan gegen GND, bekomme ich Messwert 0!
Lege ich die aber (gedreht) gegen VCC an, bekomme ich logischerweise 1023 - 1204!
Ich habe insgesamt 19!! Verschiedene 1n4148 Dioden im Glasröhrchen getestet, sogar zwei verschiedene NTC!!
Nach dieser Schaltung immer Messwert 0!
Am ADC5 PIN habe ich mal das Multimeter angelegt und gegen GND gemessen.
0,02V!
(Ich habe schon argumentiert, das eigentlich am ADC5 PIN Spannung REIN muss, also eigentlich gegen VCC oder??!)
Dann habe ich von Flipp einen anderen Code bekommen, womit ich nur das Messergebnis am PC auslesen sollte um zu testen, ob der ADC5 "Teil" funktioniert:
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 8000000 ' 8MHz
$baud = 9600
Config Adc = Single , Prescaler = Auto , Reference = Aref
Start Adc
Dim Messergebnis As Word 'Wert vom ADC
Print : Print : Print
Print "Startup..."
Print : Print : Print
Do
Messergebnis = Getadc(0)
Print "Messergebnis: " ; Messergebnis ;
Print
Wait 1
Loop
End
Alles anzeigen