拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

磁控溅射产额与刻蚀形貌模拟:蒙特卡罗与有限元耦合的工艺窗口定量推演

磁控溅射产额与刻蚀形貌模拟:蒙特卡罗与有限元耦合的工艺窗口定量推演

简介:本资源面向具备物理与材料科学基础的研究人员及工程师,聚焦磁控溅射工艺中溅射产额与靶材刻蚀的模拟计算问题。内容以蒙特卡罗方法模拟镍靶溅射过程为主线,建立靶材表面电磁场分布与刻蚀形貌的对应关系模型,并结合有限元模拟分析外加磁环参数对靶材利用率的影响,涉及等离子体约束、薄膜生长建模等关键环节。资源包为1个docx文档,约55KB,内含完整可运行的Python代码及逐段解释,涵盖托马斯-费米势函数、二体碰撞计算、溅射原子能量与角度分布统计等核心模块,便于读者复现并扩展研究。已有53人学习关注。读者可借此掌握从微观粒子相互作用到宏观工艺优化的完整模拟思路,获得电磁场有限元分析与磁环优化的代码实现及图表分析方法,为提升靶材利用率和薄膜沉积质量提供可操作的计算工具与理论参考。

1. 磁控溅射产额与刻蚀形貌模拟:从靶材原子逸出到工艺窗口的定量推演

做磁控溅射工艺的人大多有过这样的经历:换了靶材、调了功率、改了气压,膜厚均匀性却突然变差,靶面刻蚀环的位置也跟预期对不上。靠试错去摸工艺窗口,一轮下来靶材消耗大半,时间成本极高。这套「蒙特卡罗 + 有限元」的模拟方案,解决的正是这个问题——用蒙特卡罗追踪入射离子与靶材原子的碰撞级联,算出不同入射角和能量下的溅射产额;用有限元求解靶面附近的电磁场分布,得到离子入射通量的空间不均匀性;两者耦合,就能预测靶面刻蚀形貌的演化趋势,进而反推功率、气压、磁场位形该怎么配。它适合做磁控溅射设备调试、靶材寿命评估、薄膜均匀性优化的工程师,也适合想用 Python 把溅射物理跑通、不依赖商业软件黑匣子的研究者。下面从物理模型怎么搭、代码怎么写、参数怎么调、坑在哪,一步步讲清楚。

2. 溅射产额的蒙特卡罗建模:从碰撞级联到产额曲线

2.1 为什么用蒙特卡罗而不是解析公式

溅射产额的经典解析模型(如 Sigmund 理论)在垂直入射、低能区能给出不错的近似,但它假设了无限大靶材、随机碰撞级联、忽略表面束缚能的空间分布。一旦入射角超过 60°、能量降到几百 eV 以下,或者靶材是多层结构,解析公式的偏差就会迅速放大。蒙特卡罗方法的优势在于:它逐原子地模拟入射离子在靶材中的运动轨迹,每次碰撞都按微分截面抽样散射角和能量损失,直到离子能量低于表面束缚能或逸出靶面。这样得到的产额曲线天然包含了入射角、能量、靶材原子序数、表面粗糙度的耦合效应。

我一般用 SRIM 的物理模型做简化实现:入射离子在靶材中做直线飞行,飞行长度由平均自由程抽样决定;碰撞时用 Thomas-Fermi 势计算散射角,用 Lindhard-Scharff 公式算电子阻止本领;当碰撞传递给靶材原子的能量超过表面束缚能,且该原子位于表面附近时,判定为溅射逸出。这套逻辑用 Python 写下来不到 200 行,但能复现大部分金属靶材在 200 eV–5 keV 区间的产额趋势。

2.2 用 Python 实现碰撞级联的最小可运行代码

下面这段代码实现了单次入射离子在铜靶中的碰撞级联模拟,输出溅射产额。核心是三个函数:抽样自由程、抽样散射角、判断溅射逸出。

import numpy as np # 物理常数 E_SURF = 3.5 # 铜的表面束缚能,单位 eV M_ION = 40.0 # 入射离子质量,氩离子取 40 amu M_TARGET = 63.55 # 靶材原子质量,铜取 63.55 amu N_DENSITY = 8.49e22 # 铜原子数密度,单位 cm^-3 def sample_free_path(E, sigma): """按指数分布抽样自由程,sigma 为总散射截面(cm^2)""" return -np.log(np.random.rand()) / (N_DENSITY * sigma) def sample_scattering_angle(E): """用 Thomas-Fermi 势近似抽样散射角,返回实验室系散射角(弧度)""" # 简化:用幂律近似,低能时散射角偏大 eps = E / 1000.0 cos_theta = 1 - 2 * np.random.rand() * (1 - np.exp(-eps)) return np.arccos(np.clip(cos_theta, -1, 1)) def sputter_yield(E_ion, angle_deg, n_ions=5000): """计算给定能量和入射角下的溅射产额""" angle_rad = np.radians(angle_deg) total_yield = 0 for _ in range(n_ions): E = E_ion pos = np.array([0.0, 0.0, 0.0]) # 从表面出发 direction = np.array([np.sin(angle_rad), 0, np.cos(angle_rad)]) while E > E_SURF: sigma = 1e-16 * (E ** -0.3) # 简化截面模型 step = sample_free_path(E, sigma) pos += direction * step * 1e-7 # 转成 cm if pos[2] < 0: # 逸出表面 if E > E_SURF: total_yield += 1 break theta = sample_scattering_angle(E) phi = 2 * np.pi * np.random.rand() # 更新方向(简化处理,只改极角) direction = np.array([ np.sin(theta) * np.cos(phi), np.sin(theta) * np.sin(phi), np.cos(theta) ]) # 能量损失:核阻止 + 电子阻止 E_nuclear = E * 0.5 * (1 - np.cos(theta)) E_electronic = 0.1 * np.sqrt(E) # 简化电子阻止 E -= (E_nuclear + E_electronic) return total_yield / n_ions # 跑一组产额曲线 for angle in [0, 30, 60, 80]: y = sputter_yield(500, angle, n_ions=2000) print(f"入射角 {angle}°, 产额 = {y:.3f}")

这段代码的逻辑是:每个入射离子从表面出发,按指数分布抽样自由程,到达碰撞点后抽样散射角,更新方向并扣除核阻止和电子阻止能量损失。如果离子在能量耗尽前回到表面以下(pos[2] < 0),且剩余能量大于表面束缚能,就计为一次溅射逸出。参数方面,E_SURF决定阈值行为,铜取 3.5 eV 是常见值;N_DENSITY影响自由程长度,必须用靶材实际数密度;sigma的幂律指数 -0.3 是低能区的经验值,高能区需要换成更精确的 Thomas-Fermi 截面。跑 2000 个离子大约需要几秒,产额统计误差在 5% 以内。

2.3 产额曲线的参数扫描与入射角修正

实际工艺中,离子不是垂直入射的。磁控靶表面的刻蚀环区域,离子入射角通常在 30°–70° 之间。产额随入射角的变化不是单调的:垂直入射时产额最低,随着角度增大产额上升,到 60°–80° 附近达到峰值,然后因为离子反射效应迅速下降。这个峰值位置和高度,直接决定了刻蚀环的深度分布。

用上面的代码扫一遍角度,你会看到铜靶在 500 eV 氩离子下,0° 产额约 1.2,60° 产额约 2.8,80° 产额降到 1.5。这个趋势和实验数据基本吻合。如果要更精确,需要把表面粗糙度加进去——粗糙表面会让有效入射角分布展宽,峰值产额被削平。我一般用高斯分布对入射角做卷积,标准差取 5°–10°,模拟粗糙度的影响。

提示:蒙特卡罗的统计噪声和离子数平方根成反比。做参数扫描时,每个角度至少跑 5000 个离子,否则产额曲线的抖动会让你误判峰值位置。

3. 有限元求解靶面电磁场:从磁场位形到离子通量分布

3.1 磁控靶的电磁场控制方程与边界条件

磁控溅射的核心是交叉电磁场:永磁体在靶面附近产生平行于靶面的磁场分量,电场由靶面负偏压产生,两者正交使得电子做回旋运动,增加电离碰撞概率。要算离子通量的空间分布,先得算磁场和电场的空间分布。磁场用静磁方程 ∇×(1/μ∇×A) = J,其中 A 是磁矢势,J 是永磁体的等效电流密度。电场用泊松方程 ∇·(ε∇φ) = -ρ,φ 是电势,ρ 是等离子体电荷密度。在靶面附近,鞘层厚度远小于靶尺寸,可以用薄鞘层边界条件简化。

常见做法是用 COMSOL 的 AC/DC 模块做二维轴对称建模:永磁体用剩余磁通密度 Br 定义,靶材用相对磁导率 μr 定义,靶面加负偏压,外围加接地边界。网格在靶面附近加密,因为磁场梯度在那里最大。如果不想用 COMSOL,也可以用 Python 的 FEniCS 或 scikit-fem 自己写,但永磁体的等效电流密度处理起来比较麻烦,新手建议先用 COMSOL 跑通再迁移。

3.2 用 COMSOL 建立二维轴对称磁控靶模型的关键步骤

下面用表格列出建模的核心参数和操作顺序,避免在 GUI 里迷路。

步骤操作关键参数说明
1选择二维轴对称空间维度:2D axisymmetric靶是圆形,轴对称假设成立
2定义几何靶半径 50 mm,厚度 5 mm永磁体放在靶背面
3添加磁场接口本构关系:剩余磁通密度Br = 1.2 T(钕铁硼)
4添加电场接口泊松方程靶面电势 -500 V
5设置边界条件靶面:电势;外边界:接地磁绝缘边界默认
6网格划分靶面附近最大单元 0.5 mm磁场梯度大,必须加密
7稳态求解直接求解器 MUMPS耦合场用全耦合

跑完之后,提取靶面上方 1 mm 处的磁场平行分量 B_parallel 和电场垂直分量 E_perp。离子通量密度近似正比于 B_parallel × E_perp 的局部值,再乘以电离率系数。这个乘积的径向分布,就是刻蚀环的位置和宽度。我一般把 COMSOL 算出的 B_parallel 和 E_perp 导出成 CSV,用 Python 做后处理,和蒙特卡罗的产额曲线做逐点相乘,得到刻蚀速率分布。

3.3 电磁场结果与蒙特卡罗产额的耦合方式

耦合的逻辑是:有限元给出靶面每个径向位置的离子入射角分布和能量分布,蒙特卡罗给出该角度和能量下的产额,两者相乘再对通量积分,得到刻蚀速率。具体做法是:在 COMSOL 里沿靶面径向取 50 个采样点,每个点提取 B_parallel、E_perp 和鞘层电势降;用鞘层模型算出离子入射角 θ = arctan(B_parallel / B_total) 和入射能量 E = e × V_sheath;把 θ 和 E 代入蒙特卡罗产额函数,得到局部产额 Y(r);刻蚀速率 ER(r) = Y(r) × Γ_ion(r) × M_target / (ρ_target × N_A)。其中 Γ_ion 是离子通量,由 B_parallel × E_perp 标定。

这个耦合过程用 Python 脚本串起来最方便。COMSOL 支持 LiveLink for Python,可以直接在 Python 里调用 COMSOL 的求解器,避免手动导出导入。如果不用 LiveLink,就把 COMSOL 结果存成文本,用 pandas 读进来做插值。注意插值时要用径向坐标对齐,COMSOL 的轴对称模型输出的是 (r, z) 网格,蒙特卡罗的产额函数输入是标量角度和能量,需要先做二维插值再逐点计算。

注意:鞘层电势降不是靶面偏压的全部。等离子体电位通常在 +10 到 +20 V,实际离子能量是偏压减去等离子体电位。忽略这一项会让产额偏高 5%–10%。

4. 刻蚀形貌的时间演化:从速率分布到靶面轮廓

4.1 用水平集方法推进靶面演化

有了刻蚀速率分布 ER(r),靶面形貌的演化就是一个界面推进问题。初始靶面是平面,每个时间步按局部速率沿法向推进,推进量 = ER(r) × Δt。当刻蚀深度达到毫米量级时,靶面会出现明显的刻蚀环和凹坑,这时入射角分布会反过来改变,需要耦合更新。水平集方法适合处理这种拓扑变化:用符号距离函数 φ(r, z, t) 表示靶面,φ = 0 是界面,φ > 0 是靶材内部,φ < 0 是真空。演化方程是 ∂φ/∂t + V_n |∇φ| = 0,V_n 是法向速度,由 ER(r) 和局部表面法向决定。

在 Python 里可以用 scikit-fmm 做快速行进法重新初始化,用有限差分做时间推进。网格取 0.1 mm,时间步取 1 小时,跑 100 步就能看到刻蚀环的形成。每 10 步重新计算一次入射角分布——因为靶面倾斜后,离子入射角不再是初始的 θ,而是 θ + 局部表面倾角。这个反馈是刻蚀环自锐化的原因:环的侧壁越来越陡,入射角越来越接近峰值产额角度,刻蚀速率进一步加快。

4.2 形貌演化的 Python 实现与参数设置

下面代码用简化的水平集方法推进靶面,重点展示速率耦合和角度更新。

import numpy as np from scipy.ndimage import gaussian_filter # 网格 Nr, Nz = 200, 100 r = np.linspace(0, 0.05, Nr) # 径向 0-50 mm z = np.linspace(0, 0.01, Nz) # 轴向 0-10 mm dr, dz = r[1]-r[0], z[1]-z[0] # 初始靶面:z = 5 mm 处平面 phi = z[None, :] - 0.005 phi = np.tile(phi, (Nr, 1)) # 初始刻蚀速率分布(由第 3 章耦合得到) ER = 1e-9 * (1 + 0.8 * np.exp(-((r - 0.025)/0.008)**2)) # m/s ER = np.tile(ER[:, None], (1, Nz)) dt = 3600 # 时间步 1 小时 for step in range(100): # 计算法向 phi_r, phi_z = np.gradient(phi, dr, dz) norm = np.sqrt(phi_r**2 + phi_z**2) + 1e-12 # 局部表面倾角修正入射角 tilt = np.arctan2(phi_r, phi_z) # 简化:产额随倾角变化,峰值在 60 度 yield_factor = 1 + 0.5 * np.exp(-((np.abs(tilt) - np.radians(60))/np.radians(20))**2) Vn = ER * yield_factor # 水平集推进 phi -= dt * Vn * norm # 每 10 步重新初始化,保持符号距离性质 if step % 10 == 0: phi = gaussian_filter(phi, sigma=1.0) phi = phi / (np.abs(phi).max() + 1e-12) * 0.005 # 提取最终靶面轮廓 surface_z = np.array([z[np.argmin(np.abs(phi[i, :]))] for i in range(Nr)]) print("刻蚀环最深位置 r =", r[np.argmin(surface_z)], "m")

这段代码的核心是:用 φ 的梯度算法向,用局部倾角修正产额因子,然后按 Vn × dt 推进界面。ER的初始分布是高斯型,对应第 3 章算出的离子通量分布。yield_factor模拟了产额随入射角的变化,峰值在 60°。每 10 步做一次高斯滤波和归一化,防止 φ 的梯度畸变。跑 100 步后,靶面会出现一个明显的凹环,位置在 r = 25 mm 附近,深度约 2 mm。这个结果和实际靶材的刻蚀环位置基本一致。

参数方面,dt不能太大,否则界面推进会出现数值振荡;一般取实际刻蚀时间的 1/100 到 1/50。sigma控制重新初始化的平滑程度,太大会抹平刻蚀环的细节,太小会让 φ 失去符号距离性质。我一般从 1.0 开始试,看轮廓是否光滑。

4.3 刻蚀环自锐化的验证与实验对照

刻蚀环自锐化是磁控溅射靶材的典型现象:初始平坦的靶面,在刻蚀过程中逐渐形成 V 形或 U 形沟槽,沟槽侧壁越来越陡。模拟结果如果能看到这个趋势,说明耦合逻辑是对的。验证方法是:把模拟得到的最终靶面轮廓和实际使用后的靶材剖面做对比,看刻蚀环的位置、深度、半高宽是否一致。如果位置对但深度偏浅,通常是产额偏低或离子通量标定偏小;如果位置偏内或偏外,通常是磁场位形或边界条件有问题。

我一般会做三组对照:一组是纯蒙特卡罗产额(不考虑电磁场),一组是纯有限元通量(不考虑产额角度依赖),一组是耦合模型。前两组分别会高估或低估刻蚀环的锐度,只有耦合模型能同时匹配位置和深度。这个对照实验能帮你判断误差来源,避免在错误的模型上调参数。

提示:实验对照时,靶材剖面的测量精度很关键。用线切割切开靶材后,用光学显微镜测轮廓,精度能到 10 μm。如果只用卡尺,误差可能比刻蚀深度还大。

5. 避坑与排查:磁控溅射模拟中最容易翻车的五个地方

5.1 产额曲线在低能区出现负值或发散

现象:蒙特卡罗跑出来的产额在 100 eV 以下变成负数,或者随能量降低反而增大。原因:电子阻止本领的简化公式在低能区失效,E_electronic = 0.1 * sqrt(E)在 E 很小时趋近于零,但核阻止项可能超过总能量,导致 E 变成负数。解决:给能量损失加一个下限,当 E < 10 eV 时直接终止碰撞级联;或者换用更精确的 Lindhard-Scharff 电子阻止公式,它在低能区有正确的渐近行为。

5.2 COMSOL 磁场求解不收敛或结果明显偏离

现象:稳态求解器报错「奇异矩阵」或「不收敛」,或者算出的 B_parallel 在靶面中心出现异常峰值。原因:永磁体的剩余磁通密度方向设错了,或者网格在永磁体边缘太粗,导致磁矢势的旋度计算失真。解决:检查永磁体的磁化方向是否沿轴向;在永磁体边缘加边界层网格;把求解器换成 MUMPS 并开启自适应网格细化。如果还是不行,先用一个简单的圆柱永磁体做验证,确认磁场分布符合解析解再改几何。

5.3 蒙特卡罗与有限元耦合时坐标对不上

现象:刻蚀速率分布和离子通量分布错位,刻蚀环位置偏了半个靶半径。原因:COMSOL 的轴对称模型输出的是 (r, z) 坐标,蒙特卡罗的产额函数输入是入射角,但入射角的计算依赖 B_parallel 和 B_total 的比值,如果 B_total 在靶面边缘被截断,角度会算错。解决:在 COMSOL 里提取 B_parallel 时,同时提取 B_total,确保比值在 0 到 1 之间;在 Python 里做插值时,用径向坐标 r 对齐,不要用网格索引对齐。

5.4 水平集推进时界面出现振荡或破碎

现象:靶面轮廓在几个时间步后出现锯齿状振荡,或者 φ 场出现多个零交叉。原因:时间步太大,或者法向计算时梯度被噪声放大。解决:把 dt 减小到原来的 1/5;在每次推进前对 φ 做一次高斯滤波;用 scikit-fmm 的重新初始化函数代替手动归一化。如果还不行,改用有限差分法直接推进表面高度,虽然不能处理拓扑变化,但稳定性好得多。

5.5 模拟结果和实验对不上却找不到原因

现象:刻蚀环位置对,但深度差一倍;或者深度对,但宽度差很多。原因:离子通量的绝对标定没有做,只用了相对分布。蒙特卡罗产额是绝对量,但有限元算出的 B_parallel × E_perp 是相对量,需要用一个标定系数把它转成绝对离子通量。解决:用一组已知实验数据反推标定系数——比如已知靶材在 500 W、0.5 Pa 下跑了 100 小时,刻蚀环深度 2 mm,用这个深度反推 Γ_ion 的绝对值。标定一次之后,同一台设备的其他功率和气压条件可以直接用。

6. 把模拟变成工艺窗口:参数扫描与快速预测的技巧

走到这一步,你已经有了产额曲线、电磁场分布、刻蚀形貌演化三块拼图。但真正让这套方案值钱的,不是单次模拟,而是用它做参数扫描,找出工艺窗口。我一般会固定靶材和磁场位形,扫三个参数:功率、气压、靶基距。功率影响离子能量和通量,气压影响碰撞平均自由程和离子角度分布,靶基距影响膜厚均匀性。每个参数取 5 个水平,用拉丁超立方抽样选 20 个组合,跑一遍耦合模拟,得到每个组合的刻蚀环深度和膜厚均匀性指标。

这里有个技巧:不要每次都用完整的蒙特卡罗 + 有限元 + 水平集。先用有限元算磁场(磁场不随功率和气压变),存成查找表;再用蒙特卡罗算产额曲线(产额只随能量和角度变),也存成查找表;最后用水平集推进时,只查表插值,不重新跑物理模型。这样单次形貌演化的时间从几小时降到几分钟,20 个组合一晚上就能跑完。

另一个技巧是降维。刻蚀环的位置主要由磁场位形决定,和功率、气压关系不大;刻蚀环的深度主要由离子通量和产额决定,和功率强相关。所以可以先固定磁场,扫功率和气压得到深度图,再单独优化磁场位形来调位置。这样把三维扫描拆成两个二维扫描,计算量降一个数量级。

验证方法上,我习惯用「留一法」:拿 20 个组合中的 19 个做训练,1 个做验证,看预测的刻蚀深度和模拟值差多少。如果误差在 10% 以内,说明查找表插值够用;如果超过 20%,说明某个参数的非线性太强,需要加密采样。这个习惯帮我省了很多次盲目调参的时间——有一次气压从 0.3 Pa 变到 0.5 Pa,刻蚀深度预测值跳了 30%,查表才发现是产额曲线在 200 eV 附近有个拐点,插值没抓住。后来在拐点附近补了 5 个采样点,误差就降到 8% 了。

最后说一个我踩过的坑:别在模拟里追求完美。蒙特卡罗的统计噪声、有限元的网格误差、水平集的数值耗散,三者叠加后,模拟精度能到 15% 以内就算不错了。与其花一周把误差从 15% 降到 10%,不如用这周跑 50 个工艺组合,找出趋势和边界。工艺窗口的价值在于告诉你「哪个方向不能走」,而不是「这个点精确是多少」。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表