第三章:仪器宽化——标准样品(Si、LaB6)测量仪器宽化函数
好,咱们进入第三章。前两章我们聊了衍射峰宽化的物理本质,也讲了怎么从峰形里把晶粒尺寸和微观应变的贡献拆开。但有个关键问题我一直没细说——你测到的峰宽,其实不全是样品本身的贡献。
说白了,你的衍射仪不是完美的。X射线光源有几何展宽、狭缝系统有影响、探测器也有响应函数。这些因素叠加在一起,就形成了所谓的“仪器宽化”。如果不把它扣掉,你算出来的晶粒尺寸会偏小,微观应变会偏大。我在项目里见过不少新手,拿着没扣仪器宽化的数据直接算,结果晶粒尺寸只有几纳米,一看就是错的。
3.1 为什么必须扣仪器宽化?
你想想看,一个完美的单晶硅样品,理论上它的衍射峰应该是一个δ函数——无限窄。但实际测出来呢?峰还是有一定宽度。这个宽度就是仪器本身的贡献。
所以,我们测到的总峰宽 FWHMobs 可以写成:
FWHMobs² = FWHMsample² + FWHMinst² (高斯型叠加)
或者 FWHMobs = FWHMsample + FWHMinst (洛伦兹型叠加)
实际中,我们常用Voigt函数或Pseudo-Voigt函数来拟合,把高斯和洛伦兹分量分开处理。嗯,这里要注意:仪器宽化函数本身也是随2θ角变化的,不是个常数。
核心要点:仪器宽化函数 I(2θ) 必须用标准样品来标定。标准样品要求:无晶粒尺寸宽化(晶粒>1μm)、无微观应变、无堆垛层错。说白了,它的峰宽完全来自仪器。
3.2 常用标准样品:Si 和 LaB₆
我个人的习惯是,实验室常备两种标准样品:
| 标准样品 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单晶硅(Si) | 价格便宜、容易获得、峰位准确 | 峰强较弱、高角区峰形不对称 | 常规实验室、日常校准 |
| 六硼化镧(LaB₆) | 峰强高、峰形对称、无择优取向 | 价格较贵、需要特殊保存 | 高精度测量、同步辐射 |
LaB₆ 是我比较推荐的。它的衍射峰在很宽的2θ范围内都保持很好的对称性,而且没有Kα₂的分离问题。我在做纳米材料表征时,只要条件允许,都会用LaB₆做仪器宽化标定。
小技巧:标准样品要研磨成细粉,但不要过度研磨。过度研磨会引入晶粒细化,那就不是“标准”了。我一般用玛瑙研钵轻轻研磨1-2分钟,过325目筛即可。
3.3 仪器宽化函数的测量步骤
好,咱们一步步来。测量仪器宽化函数,其实就三步:
- 测量标准样品:在相同的实验条件下(管压、管流、狭缝、扫描速度),测量Si或LaB₆的衍射图谱。
- 拟合每个衍射峰:用Pseudo-Voigt或Pearson VII函数拟合每个峰的峰位、峰宽、峰形参数。
- 建立仪器宽化函数:将FWHMinst对2θ作图,用多项式或Caglioti公式拟合。
Caglioti公式长这样:
FWHMinst² = U tan²θ + V tanθ + W
其中U、V、W是仪器参数。U主要与光源的发散度有关,V与样品位移有关,W与狭缝宽度有关。我一般在Origin或Python里做这个拟合,R²能达到0.999以上才算合格。
3.4 代码示例:用Python拟合仪器宽化函数
下面是我常用的一个脚本片段。它读取标准样品的峰位和FWHM数据,然后用Caglioti公式拟合:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 标准样品数据(LaB₆,Cu Kα)
two_theta = np.array([21.4, 30.4, 37.4, 43.4, 48.8, 53.6, 58.0, 62.0, 65.8, 69.4])
fwhm_inst = np.array([0.089, 0.092, 0.096, 0.101, 0.107, 0.114, 0.122, 0.131, 0.141, 0.152])
# Caglioti公式
def caglioti(theta, U, V, W):
return np.sqrt(U * np.tan(theta)**2 + V * np.tan(theta) + W)
# 转换为弧度
theta_rad = np.deg2rad(two_theta / 2)
# 拟合
popt, pcov = curve_fit(caglioti, theta_rad, fwhm_inst, p0=[0.01, 0.001, 0.08])
U, V, W = popt
print(f"U = {U:.5f}, V = {V:.5f}, W = {W:.5f}")
# 绘图验证
theta_fit = np.linspace(10, 40, 100)
fwhm_fit = caglioti(np.deg2rad(theta_fit), U, V, W)
plt.plot(two_theta, fwhm_inst, 'o', label='实验数据')
plt.plot(theta_fit*2, fwhm_fit, '-', label='Caglioti拟合')
plt.xlabel('2θ (°)')
plt.ylabel('FWHM (°)')
plt.legend()
plt.show()
注意:拟合时一定要检查残差。如果残差呈现系统性的偏差(比如低角区拟合偏大、高角区偏小),说明你的标准样品可能有问题,或者仪器状态发生了变化。我曾经遇到过这种情况,后来发现是X射线管老化导致的——换了个新管子就好了。
3.5 仪器宽化函数的应用
有了仪器宽化函数,你就可以对未知样品的峰宽进行校正了。具体做法是:
- 测量未知样品,得到每个峰的FWHMobs和峰位2θ。
- 用仪器宽化函数计算该2θ位置对应的FWHMinst。
- 根据峰形类型(高斯/洛伦兹),用对应公式扣除仪器宽化,得到FWHMsample。
- 用FWHMsample代入Scherrer公式或Williamson-Hall方法,计算晶粒尺寸和微观应变。
这里有个容易踩的坑:仪器宽化函数不是一成不变的。每次更换X射线管、调整狭缝、或者移动了探测器,都需要重新标定。我建议至少每三个月标定一次,或者在每次重要实验前标定。
3.6 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张流程图:
这张图把整个流程串起来了。从标准样品测量,到峰形拟合,再到Caglioti公式拟合,最后应用到未知样品的校正。你照着这个流程走,基本不会出错。
我的经验:如果你用的是实验室常规衍射仪(不是同步辐射),仪器宽化函数在低角区(2θ < 30°)变化比较平缓,在高角区(2θ > 100°)会急剧增大。所以,如果你只关心低角区的峰,可以用一个简单的多项式拟合;但如果要分析高角区,Caglioti公式是必须的。
好了,这一章就到这里。仪器宽化是XRD数据分析中最容易被忽视、但又最关键的一步。扣好了,你的数据才可信;扣不好,后面算出来的晶粒尺寸和微观应变都是空中楼阁。
公众号:蓝海资料掘金营,微信deep3321