咱搞機(jī)械設(shè)計的,為了設(shè)備的合理使用和技術(shù)完善,不得不開始熱系統(tǒng)設(shè)計和進(jìn)行拉晶試驗。既然要拉晶,必然需要根據(jù)不同規(guī)格熱場來設(shè)置參數(shù)。跟進(jìn)了一段時間,試驗不同規(guī)格的熱場,老是要驗算堝跟比啦,堝位啦,有點(diǎn)煩。開始考慮借助電腦來自動滴、即時滴完成。感謝Gtofish給了個XLS格式的小表格可以用。仔細(xì)研究了一下,發(fā)現(xiàn)這個原始計算方法有點(diǎn)問題,還得自立更生,在跟進(jìn)拉晶過程的漫漫長夜中完成了這個東東的優(yōu)化。
堝跟比的計算是比較簡單的:假設(shè)晶體每生長了1mm,那么液體硅則減少了這1mm的質(zhì)量。如果晶圓直徑為8",那么1mm 8"的晶圓質(zhì)量應(yīng)該為直徑8"大,高度1mm的圓柱體體積乘以固體硅的密度。而這個時候堝里的液體硅液面會降低多少呢?當(dāng)然是以液體硅的密度除以這個質(zhì)量可以得到減少的液體硅的體積,然后再用體積除以堝的截面積就得到了。 得到的這個數(shù)就是堝跟比了。
但是,堝可不是一個圓柱體,它的截面積到了鍋底圓弧部分就開始不斷變化了,也就是說當(dāng)液體降低到底部圓弧部分的時候,堝跟比就開始變化了,那么這個該咋算呢?
我們把堝可以看做由三部分體積組成:(如圖)
體積一(V1):液體硅的體積小于或等于綠色部分,根據(jù)半圓球體的計算方法:
sinθ = (R2 - H1) / R2
V1= (R2 - W3) ^ 3 * Pi * (1 - sinθ) - (R2 - W3) ^ 3 * Pi * (1 - sinθ ^ 3) / 3
體積二(V2):液體硅的體積大于綠色部分,但小于或等于綠色和藍(lán)色部分的總和
sinθ = (H2 - H1) / R1
A = D1 / 2 - R1
B = R1 - W2
V2 = (A ^ 2 * B * Pi * sinθ + A * B ^ 2 * Pi * Sin(2 * Asin) / 2 + A * B ^ 2 * Pi * Asin + B ^ 3 * Pi * sinθ - B ^ 3 * Pi * sinθ ^ 3 / 3) + V1
體積三(V3):液體硅的體積大于綠色和藍(lán)色部分的總和
V3 = (D1 / 2 - W1) ^ 2 * Pi * (H3 - H2) + V2
用公式分別判斷當(dāng)前液體硅體積屬于那個階段,然后分別用公式計算堝跟就可以了。
最終優(yōu)化完成的表格如下圖:
根據(jù)堝位清零的習(xí)慣,拉晶準(zhǔn)備時都會將石墨坩堝上沿與加熱器上沿平齊后作為零堝位。以這個為依據(jù),我們可以實(shí)時計算晶體長度拉制到多少時當(dāng)前的堝位是多少:
當(dāng)前堝位 = 石墨坩堝的深度 - 石英坩堝底部圓弧壁厚 - 剩余液體硅高度 - 導(dǎo)流筒伸入加熱器尺寸 - 導(dǎo)流筒底面距離硅液表面距離
表格中用到的宏程序如下:
Option Explicit
Function V_1(BR As Double, BT As Double, ST As Double)
Dim M, Pi, A
Pi = Application.Pi()
A = BR - BT
M = A ^ 3 * Pi * (1 - ST) - A ^ 3 * Pi * (1 - ST ^ 3) / 3
V_1 = M
End Function
Function V_2(ID As Double, TR As Double, TT As Double, ST As Double)
Dim M, Pi, Asin, A, B
Pi = Application.Pi()
Asin = Application.Asin(ST)
A = ID / 2 - TR
B = TR - TT
M = A ^ 2 * B * Pi * ST + A * B ^ 2 * Pi * Sin(2 * Asin) / 2 + _
A * B ^ 2 * Pi * Asin + B ^ 3 * Pi * ST - B ^ 3 * Pi * ST ^ 3 / 3
V_2 = M
End Function
Function V_3(ID As Double, WT As Double, H3 As Double, H2 As Double)
Dim M, Pi, A, B
Pi = Application.Pi()
A = ID / 2 - WT
B = H3 - H2
M = A ^ 2 * Pi * B
V_3 = M
End Function
Function Height_Volume_1()
Dim BR As Double
Dim BT As Double
Dim ST As Double
Dim V As Double
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V As Double
Dim Volume_Const As Double
Dim Height As Double
BR = Worksheets("Program").Range("H4")
BT = Worksheets("Program").Range("H10")
LowerLimit = 1#
UpperLimit = (BR - Worksheets("Program").Range("H5")) / BR
Volume_Const = Worksheets("Program").Range("C8") * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
With Application
V = V_1(BR, BT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
End With
Loop Until Abs(Delta_V) < 0.1
Height = (1 - ST) * BR
Height_Volume_1 = Height
End Function
Function Height_Volume_2()
Dim ID As Double
Dim TR As Double
Dim TT As Double
Dim ST As Double
Dim V
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V, Volume_Const
Dim Height
ID = Worksheets("Program").Range("H2")
TR = Worksheets("Program").Range("H3")
TT = Worksheets("Program").Range("H9")
LowerLimit = (Worksheets("Program").Range("H6") - Worksheets("Program").Range("H5")) / TR
UpperLimit = 0#
Volume_Const = Worksheets("Program").Range("C8") * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
With Application
V = Worksheets("Program").Range("K14") - V_2(ID, TR, TT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
End With
Loop Until Abs(Delta_V) < 0.1
Height = Worksheets("program").Range("H6") - TR * ST
Height_Volume_2 = Height
End Function
Function CLR_1()
Dim BR As Double
Dim BT As Double
Dim ST As Double
Dim V As Double
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V As Double
Dim Volume_Const As Double
Dim Radius As Double
Dim Asin As Double
BR = Worksheets("Program").Range("H4")
BT = Worksheets("Program").Range("H10")
LowerLimit = 1#
UpperLimit = (BR - Worksheets("Program").Range("H5")) / BR
Volume_Const = Worksheets("Program").Range("C8") * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
With Application
V = V_1(BR, BT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
End With
Loop Until Abs(Delta_V) < 0.1
Asin = Application.Asin(ST)
Radius = (BR - BT) * Cos(Asin)
CLR_1 = (Worksheets("Program").Range("L20") / 2) ^ 2 / (Radius ^ 2) * (2.3 / 2.51)
End Function
Function CLR_2()
Dim ID As Double
Dim TR As Double
Dim TT As Double
Dim ST As Double
Dim V
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V, Volume_Const
Dim Asin As Double
Dim Radius As Double
ID = Worksheets("Program").Range("H2")
TR = Worksheets("Program").Range("H3")
TT = Worksheets("Program").Range("H9")
LowerLimit = (Worksheets("Program").Range("H6") - Worksheets("Program").Range("H5")) / TR
UpperLimit = 0#
Volume_Const = Worksheets("Program").Range("C8") * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
With Application
V = Worksheets("Program").Range("K14") - V_2(ID, TR, TT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
End With
Loop Until Abs(Delta_V) < 0.1
Asin = Application.Asin(ST)
Radius = (TR - TT) * Cos(Asin) + (ID / 2 - TR)
CLR_2 = (Worksheets("Program").Range("L20") / 2) ^ 2 / (Radius ^ 2) * (2.3 / 2.51)
End Function
Sub SheetPrint()
Dim ChargeWeight As Double
Dim Radius As Double
Dim MaxLength As Double
Dim SeedWeight As Double
Dim CrystalWeight As Double
Dim MeltWeight As Double
Dim MeltVolume As Double
Dim CrystalLength As Double
Dim Volume_1 As Double
Dim Volume_2 As Double
Dim Volume_3 As Double
Dim GraphiteInnerDia As Double
Dim GraphiteHeight_2 As Double
Dim QuartzWallTHickness As Double
Dim MeltHeight As Double
Dim CLR As Double
Dim Pi As Double
Dim LengthStep As Double
Dim Temp As String
Dim i As Integer
Pi = Application.Pi()
i = 2
Temp = InputBox("請輸入堝跟比每段多長?" _
& Chr(13) & Chr(10) & Chr(13) & Chr(10) & "即每拉多少mm單晶就計算一次堝跟比")
If Temp = "" Then
MsgBox "輸入數(shù)據(jù)不匹配"
Exit Sub
End If
LengthStep = CDbl(Temp)
Worksheets("Sheet1").Columns("J:L").ClearContents
With Worksheets("Program")
ChargeWeight = .Range("C3")
SeedWeight = .Range("L21")
Radius = .Range("L20")
CrystalLength = .Range("C4")
Volume_1 = .Range("K13")
Volume_2 = .Range("K14")
GraphiteInnerDia = .Range("H2")
GraphiteHeight_2 = .Range("H6")
QuartzWallTHickness = .Range("H8")
End With
MaxLength = (ChargeWeight - SeedWeight) / (0.00000233 * (Radius / 2) ^ 2 * Pi)
With Worksheets("Sheet1")
.Range("J1") = "Ingot Length"
.Range("K1") = "Melt Height"
.Range("L1") = "CLR"
End With
For CrystalLength = 0 To MaxLength Step LengthStep
CrystalWeight = SeedWeight + (Radius / 2) ^ 2 * Pi * CrystalLength * 0.00000233
MeltWeight = ChargeWeight - CrystalWeight
MeltVolume = MeltWeight / 2.51 * 1000
If MeltVolume * 1000 < Volume_1 Then
MeltHeight = Sub_Height_Volume_1(MeltVolume)
ElseIf MeltVolume * 1000 < Volume_2 Then
MeltHeight = Sub_Height_Volume_2(MeltVolume)
Else
MeltHeight = GraphiteHeight_2 + (MeltVolume * 1000 - Volume_2) _
/ (Pi * (GraphiteInnerDia / 2 - QuartzWallTHickness) ^ 2)
End If
If MeltWeight <= 0 Then
CLR = 0#
ElseIf MeltVolume * 1000 < Volume_1 Then
CLR = Sub_CLR_1(MeltVolume)
ElseIf MeltVolume * 1000 < Volume_2 Then
CLR = Sub_CLR_2(MeltVolume)
Else
CLR = (Radius / 2) ^ 2 / (GraphiteInnerDia / 2 - QuartzWallTHickness) ^ 2 * _
(2.33 / 2.51)
End If
With Worksheets("Sheet1")
.Cells(i, 10) = CrystalLength
.Cells(i, 11) = MeltHeight
.Cells(i, 12) = CLR
End With
i = i + 1
Next CrystalLength
Worksheets("Sheet1").Activate
End Sub
Function Sub_Height_Volume_1(MeltVolume As Double)
Dim BR As Double
Dim BT As Double
Dim ST As Double
Dim V As Double
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V As Double
Dim Volume_Const As Double
Dim Height As Double
With Worksheets("Program")
BR = .Range("H4")
BT = .Range("H10")
LowerLimit = 1#
UpperLimit = (BR - .Range("H5")) / BR
End With
Volume_Const = MeltVolume * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
V = V_1(BR, BT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
Loop Until Abs(Delta_V) < 0.1
Height = (1 - ST) * BR
Sub_Height_Volume_1 = Height
End Function
Function Sub_Height_Volume_2(MeltVolume As Double)
Dim ID As Double
Dim TR As Double
Dim TT As Double
Dim ST As Double
Dim V
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V, Volume_Const
Dim Height
With Worksheets("Program")
ID = .Range("H2")
TR = .Range("H3")
TT = .Range("H9")
LowerLimit = (.Range("H6") - .Range("H5")) / TR
End With
UpperLimit = 0#
Volume_Const = MeltVolume * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
'With Application
V = Worksheets("Program").Range("K14") - V_2(ID, TR, TT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
'End With
Loop Until Abs(Delta_V) < 0.1
Height = Worksheets("Program").Range("H6") - TR * ST
Sub_Height_Volume_2 = Height
End Function
Function Sub_CLR_1(MeltVolume As Double)
Dim BR As Double
Dim BT As Double
Dim ST As Double
Dim V As Double
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V As Double
Dim Volume_Const As Double
Dim Radius As Double
Dim Asin As Double
With Worksheets("Program")
BR = .Range("H4")
BT = .Range("H10")
LowerLimit = 1#
UpperLimit = (BR - .Range("H5")) / BR
End With
Volume_Const = MeltVolume * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
'With Application
V = V_1(BR, BT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
'End With
Loop Until Abs(Delta_V) < 0.1
Asin = Application.Asin(ST)
Radius = (BR - BT) * Cos(Asin)
Sub_CLR_1 = (Worksheets("Program").Range("L20") / 2) ^ 2 / (Radius ^ 2) * (2.3 / 2.51)
End Function
Function Sub_CLR_2(MeltVolume As Double)
Dim ID As Double
Dim TR As Double
Dim TT As Double
Dim ST As Double
Dim V
Dim LowerLimit As Double
Dim UpperLimit As Double
Dim Delta_V, Volume_Const
Dim Asin As Double
Dim Radius As Double
With Worksheets("Program")
ID = .Range("H2")
TR = .Range("H3")
TT = .Range("H9")
LowerLimit = (.Range("H6") - .Range("H5")) / TR
End With
UpperLimit = 0#
Volume_Const = MeltVolume * 1000
Do
ST = (LowerLimit + UpperLimit) / 2#
'With Application
V = Worksheets("Program").Range("K14") - V_2(ID, TR, TT, ST)
Delta_V = Volume_Const - V
If V <= Volume_Const Then
LowerLimit = ST
ST = (LowerLimit + UpperLimit) / 2#
End If
If V > Volume_Const Then
UpperLimit = ST
ST = (UpperLimit + LowerLimit) / 2#
End If
'End With
Loop Until Abs(Delta_V) < 0.1
Asin = Application.Asin(ST)
Radius = (TR - TT) * Cos(Asin) + (ID / 2 - TR)
Sub_CLR_2 = (Worksheets("Program").Range("L20") / 2) ^ 2 / (Radius ^ 2) * (2.3 / 2.51)
End Function