咱搞机械设计的,为了设备的合理使用和技术完善,不得不开始热系统设计和进行拉晶试验。既然要拉晶,必然需要根据不同规格热场来设置参数。跟进了一段时间,试验不同规格的热场,老是要验算埚跟比啦,埚位啦,有点烦。开始考虑借助电脑来自动滴、即时滴完成。感谢Gtofish给了个XLS格式的小表格可以用。仔细研究了一下,发现这个原始计算方法有点问题,还得自立更生,在跟进拉晶过程的漫漫长夜中完成了这个东东的优化。
埚跟比的计算是比较简单的:假设晶体每生长了1mm,那么液体硅则减少了这1mm的质量。如果晶圆直径为8",那么1mm 8"的晶圆质量应该为直径8"大,高度1mm的圆柱体体积乘以固体硅的密度。而这个时候埚里的液体硅液面会降低多少呢?当然是以液体硅的密度除以这个质量可以得到减少的液体硅的体积,然后再用体积除以埚的截面积就得到了。 得到的这个数就是埚跟比了。
但是,埚可不是一个圆柱体,它的截面积到了锅底圆弧部分就开始不断变化了,也就是说当液体降低到底部圆弧部分的时候,埚跟比就开始变化了,那么这个该咋算呢?
我们把埚可以看做由三部分体积组成:(如图)
体积一(V1):液体硅的体积小于或等于绿色部分,根据半圆球体的计算方法:
sinθ = (R2 - H1) / R2
V1= (R2 - W3) ^ 3 * Pi * (1 - sinθ) - (R2 - W3) ^ 3 * Pi * (1 - sinθ ^ 3) / 3
体积二(V2):液体硅的体积大于绿色部分,但小于或等于绿色和蓝色部分的总和
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):液体硅的体积大于绿色和蓝色部分的总和
V3 = (D1 / 2 - W1) ^ 2 * Pi * (H3 - H2) + V2
用公式分别判断当前液体硅体积属于那个阶段,然后分别用公式计算埚跟就可以了。
最终优化完成的表格如下图:
根据埚位清零的习惯,拉晶准备时都会将石墨坩埚上沿与加热器上沿平齐后作为零埚位。以这个为依据,我们可以实时计算晶体长度拉制到多少时当前的埚位是多少:
当前埚位 = 石墨坩埚的深度 - 石英坩埚底部圆弧壁厚 - 剩余液体硅高度 - 导流筒伸入加热器尺寸 - 导流筒底面距离硅液表面距离
表格中用到的宏程序如下:
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 "输入数据不匹配"
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