ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

COMSOL仿真SPR传感器:金层与SiO2层建模及灵敏度优化

COMSOL仿真SPR传感器:金层与SiO2层建模及灵敏度优化

做光学传感仿真的人,基本都绕不开SPR。表面等离子体共振传感器这几年在生物检测、液体折射率测量、薄膜吸附监控里特别常见,结构说白了就是一层几十纳米厚的金属膜,加上一个激发光的入射角。但真到自己搭模型的时候就发现,明明是照着文献里那几行公式来的,扫出来的反射率曲线却跟别人完全对不上。这次我拿“COMSOL + 金层 + 二氧化硅层”这个经典SPR传感器构型说开去,把从几何建模到灵敏度估算的完整思路、参数设置和常见坑都过一次,给正在头疼波动光学模块的朋友一个可以直接上手的参考。

这篇内容适合两类人看:一类是刚接触COMSOL波动光学模块、想复现SPR模型的研究生和工程师;另一类是已经有仿真基础,但想在传感器结构里加SiO2层、做厚度优化或者算角灵敏度的人。文章不会堆公式,但会把关键公式的物理含义讲明白,同时给出具体的参数定义方案和操作思路。

1. 先把结构拆开:金层、二氧化硅层到底承担什么角色

1.1 Kretschmann构型盘下来,光是怎么“摸”到金属表面的

SPR传感器最常见的是棱镜耦合结构,也叫Kretschmann构型。光从高折射率棱镜一侧射入,在棱镜与金属膜的界面上发生全内反射。全内反射发生时,光并不是在界面处干脆利落地弹回去,而是会有一部分能量以倏逝波的形式渗透到界面另一侧的介质中,强度随着距离指数衰减。这个倏逝波虽然不能远距离传播,但它携带的动量和界面附近的金属膜相互作用。

金属膜里有大量的自由电子,在特定条件下这些自由电子会沿着金属与介质界面集体振荡,形成表面等离子体激元。当入射光在界面方向上的动量分量和表面等离子体的动量匹配时,能量就会被强烈地转移给等离子体波,反射光强因此大幅度下降。这个“动量匹配”对应一个特定的入射角,也就是SPR共振角。用公式看就是:

$$n_{prism} \sin\theta = \text{Re}(n_{eff})$$

其中(n_{eff})是复合膜层结构中表面等离子体模式的有效折射率。简单类比的话,就像你推秋千,推的频率和秋千固有频率一致,振幅才会越来越大。SPR就是光推动金属表面电子集体振荡的“共振频率匹配”,只不过这里调的不是频率,而是入射角度。

COMSOL仿真的核心任务其实就是把这个共振角、共振深度、共振宽度算出来,再研究不同膜层结构会怎么改变这些指标。

1.2 金层厚度不是拍脑袋定的,50nm这件事背后有原因

金属膜的厚度是SPR仿真里最敏感的参数之一。金层太薄,金属膜内部的自由电子振荡会辐射到棱镜一侧,导致共振谷变宽、变浅,检测分辨力下降。金层太厚,倏逝波在到达金层与待测介质界面之前就已经衰减得差不多了,难以有效激发界面上的表面等离子体,共振效果同样不好。

常用经验值是40到60 nm,这个区间是激发效率与共振峰锐度之间的平衡点。原因在于可见光波段,SPP在金膜内的趋肤深度大约在十几到二十几纳米的量级。如果以50 nm膜厚为例,等于给了倏逝波一个透过金属层接触外部介质的完整通道,同时又不至于让辐射损耗过大。

COMSOL里做厚度扫描很容易。你可以先固定入射角和波长,把金层厚度设为参数,扫30 nm到70 nm,看每个厚度对应的反射率曲线变化趋势。实际操作下来,50 nm附近往往是最稳的起点,后续再根据共振谷深度去微调。

1.3 二氧化硅层的“存在感”:保护、表面修饰和灵敏度损失

很多入门SPR模型里只画“棱镜 + 金 + 待测介质”三层,这也是很多文献里的基础结构。但实测和实际器件里,金层表面往往还要加一层SiO2薄膜。这层二氧化硅有两个主要作用。

第一个作用是提供化学修饰平台。金表面本身不太好直接固定抗体、DNA探针这类生物分子,但SiO2表面有丰富的硅羟基,通过硅烷化反应可以很方便地接上一大堆功能基团。很多生物SPR传感器要检测的目标物质不会直接吸附在金上,必须靠这层中间介质做桥接。

第二个作用是保护金膜。金膜虽然化学性质稳定,但在长期浸泡、清洗或者复杂液体环境中,表面状态还是会发生缓慢变化。一层致密的SiO2膜可以有效隔离外界干扰,让传感器信号更稳定。

但这一切是有代价的。SPP的电场在金膜和待测介质界面最强,加了SiO2层之后,待测介质里的电场强度会被“分走”一部分,传感器对待测介质折射率变化的响应会变弱。换句话说,灵敏度下降。SiO2层越厚,这种损失越明显。实际设计中,SiO2层常用厚度在5到20 nm之间,需要在稳定性和灵敏度之间做权衡。

COMSOL里可以做一个非常直观的对比仿真:固定金层50 nm,SiO2分别取0、5、10、20 nm,看各组反射率曲线共振角的偏移量变化。我见过很多项目的仿真结论都是10 nm左右是一个不错的中间值——既能保证表面修饰的空间,又不会把灵敏度拉垮太多。

2. COMSOL建模全过程:从几何到求解设置的实操

2.1 选对模块和物理场,别在RF和波动光学之间纠结

COMSOL里仿真SPR,最常用的模块是波动光学模块(Wave Optics Module)里的“电磁波,频域”接口。这个物理场接口直接求解频域Maxwell方程,适合处理纳微米尺度的光学结构。在二维模型里,它默认可以同时处理TE和TM偏振,你只需要在边界条件里明确入射波的偏振状态即可。

有朋友问过能不能用RF模块代替。理论上RF模块也求解Maxwell方程,但RF模块的材料库、边界条件和求解器预设在宏观电磁波段更顺手,到了光学波段,波动光学模块对色散材料、PML、端口条件等支持更完善。既然要长期做SPR仿真,直接用波动光学模块是更顺的选择。

模型维度方面,平板式Kretschmann结构用二维模型就完全够用。平面多层膜在法线方向结构一致,SPP沿界面传播,二维模型已经把物理机理完整表达出来了。除非你是做光纤SPR或者颗粒阵列这类三维结构,否则没有必要用三维模型给自己制造内存压力。

2.2 几何与边界条件怎么摆,才能稳定出共振谷

二维几何搭建的核心思路是:把棱镜、金层、SiO2层、待测介质层这四部分按顺序画出来,然后在上下两个端面加PML(完美匹配层),让模拟的半无限空间不影响内部结果。

最常见的建模方案是画一个四层矩形堆叠:底层是棱镜介质区域,往上依次是金膜、SiO2膜、待测介质层,最上方和最下方再给若干微米厚的PML区域。左右两侧,如果横向尺寸足够宽(比如几十微米),也可以直接用PML吸收;如果模型是周期性平面结构,也可以用周期边界配合Floquet条件来处理斜入射。后一种方式更省计算量,但需要引入周期相位,新手初期用“大计算域+PML”的方式更容易理解、不容易出错。

入射设置有两种常用路径:

  • 一是使用“散射边界条件”并在其中勾选“入射波”,在表达式里直接输入TM平面波的电场分量;
  • 二是使用“背景场”(Background Field)功能,对整个棱镜区域设置一个斜入射背景场,让COMSOL只求解散射场。

我倾向于用背景场方案,尤其在计算域被PML包裹的情况下,背景场的写法更干净。注意SPR激发必须使用TM偏振,也就是磁场垂直于入射平面、电场在入射平面内。如果你不小心用了TE波,整个扫描过程里反射率都不会出现像样的共振谷。

2.3 材料参数里最容易被忽略的是折射率虚部

SPR仿真里材料参数的重要性怎么强调都不过分。金膜材料必须使用复折射率,在633 nm波长附近,常用参考值约(n = 0.183 + 3.431i),对应介电常数大约在(-11.7 + 1.34i)左右。不同文献来源的数值会有一点差异,但量级不会变。COMSOL材料库里内置了金的折射率数据,也可以自己手动导入Johnson & Christy或Palik的实验数据表格。

SiO2的折射率在可见光波段大约在1.457附近,这个数据比较稳定,直接用材料库里的“二氧化硅”即可。棱镜材料可以用BK7玻璃,折射率约1.515,也可以用折射率更高的重火石玻璃来获得更高的灵敏度。待测介质区域则用参数变量表示,比如设一个全局参数n_med = 1.330,然后在待测介质域的折射率定义里引用这个变量。

这里有一个实操细节:待测介质通常会加一个很小的虚部,比如(1\times10^{-4})或(1\times10^{-5})。这不是因为真实水溶液一定有那么大吸收,而是为了避免数值求解时出现奇异性。如果虚部严格为零,某些频点上可能出现场发散,后处理曲线看着会又尖又毛糙。

2.4 角度扫描和波长扫描,两个研究方式如何选

SPR特性曲线有两种最常见形式:固定波长扫描入射角,得到“反射率-角度”曲线;固定入射角扫描波长,得到“反射率-波长”曲线。两者物理上对应同一个共振条件,只是从不同维度去看。

在COMSOL里实现方式非常直接:在“研究”节点下添加“参数化扫描”,把入射角theta设为扫描参数,比如从50度到70度,步长0.05度或0.1度。如果做波长扫描,就把lam0设为扫描参数,扫600 nm到700 nm。

步长的选择有讲究。步长太大容易漏掉共振谷的最低点;步长太近不但求解时间长,还会因为网格精度不够导致相邻角度结果互相跳变。我用的时候一般先粗扫一遍找到谷的大致位置,然后在谷底附近加密扫描步长。

2.5 网格:给金层单独加密,别让整片自由网格拖后腿

网格是COMSOL仿真里最直观的“精度-算力”权衡。对于光学仿真,介质区网格尺寸一般在波长的十分之一到二十分之一,633 nm波长对应大约30到60 nm,这个标准在常规区域很好满足。但金膜内部不行。

SPP模式在金属内部沿法线方向衰减极快,趋肤深度只有二十几纳米甚至更小。如果网格太粗,金膜内部场分布完全表达不了,共振谷的位置和深度都会严重失真。我建议对金膜使用映射网格(Mapped Mesh),在法线方向单独控制单元数量,让每个单元厚度控制在1到2 nm。50 nm厚的金膜,法线方向上至少分配20到30个单元。

SiO2层同样用映射网格,法线方向给5到10个单元即可。PML区域用扫掠网格(Swept)拉5层,每层厚度按等比序列分布,这样吸收效果最稳定。

有几次我看到有人直接用默认“物理场控制网格”拉了一套三角形网格就跑,结果反射率谷很浅,还以为是模型有问题。实际上把金属层网格一加密,问题立刻消失。金属薄膜结构里,网格细度对结果的影响比任何求解器设定都大。

2.6 全局参数建议表

为了让你能直接照抄,我把初始模型里最常用的全局参数整理成下面这张表。实际使用时根据你的棱镜材料和波长调整。

参数名表达式/初始值说明
lam0633[nm]入射光波长
n_prism1.515棱镜折射率,BK7
n_sio21.457SiO2折射率
d_au50[nm]金膜厚度
d_sio210[nm]SiO2层厚度
theta60[deg]初始入射角,扫描起始点
n_med1.330待测介质折射率
kx2pi/lam0n_prism*sin(theta)入射波矢x分量
ky-2pi/lam0n_prism*cos(theta)入射波矢y分量,方向朝界面

在背景场或SBC的入射波表达式中,用kx、ky配合TM偏振公式来定义场分量,就可以很方便地扫描角度和折射率。

3. 反射率曲线到传感器灵敏度计算

3.1 怎么把反射率曲线拿出来,并找到共振角

模型求解完,后处理阶段最关键的是提取反射率。最直接的方式是在入射侧设置端口(Port),COMSOL会自动计算出S参数,反射率就是S11的模平方。如果你的模型用的是背景场方案,那就在入射端边界上对法向能流做积分,得到的总能流与入射能流之比就是反射率。

扫完一组角度后,把反射率对角度画成曲线,会看到一个明显的V形或U形低谷,这就是SPR共振谷。这个谷底对应的角度就是共振角。

找谷底位置的时候不要直接从曲线的最低点读取。参数扫描步长有限,最低采样点未必正好落在真实的共振角上。更稳妥的做法是把谷底附近的数据点用二次多项式拟合,抛物线顶点位置就是更准确的共振角。这个小细节在后续计算灵敏度时影响很大,尤其是扫描步长比较粗的时候。

3.2 折射率变化与共振角移动:一组示例数据

SPR传感器的核心能力就是感知待测介质折射率变化。当你把待测介质折射率从1.330调到1.340,每上调0.01,共振角会发生规律性移动。下面是基于常见参数体系的一组示意数据,具体数值会因为你的棱镜折射率、金膜厚度和波长不同而改变,但量级足以参考。

待测介质折射率 n共振角 θ_SPR(度)
1.33061.4
1.34062.4
1.35063.5
1.36064.5

这里每0.01折射率变化对应大约1度共振角移动,换算成角灵敏度约100度/折射率单位。实际操作中,如果换用更高折射率的棱镜,灵敏度会更高;如果加了较厚的SiO2层,灵敏度会有所下降。

这个数据也解释了为什么SPR传感器能做无标记生物检测:当待测液体中目标分子浓度变化,液体折射率发生微小改变,传感器就能感知到共振角的偏移。仿真帮你提前估算这个偏移量,比重做一堆实验要快得多。

3.3 灵敏度之外,还要看谷深和半高宽

真正判断一个SPR传感器好不好用,不能只看灵敏度。还有两个指标非常重要:谷深和半高宽(FWHM)。

谷深决定反射率动态范围。如果共振谷只降低一点,光学探测器在检测光强变化时信噪比就很差。半高宽决定共振定位精度。一个很宽的共振谷意味着共振角不容易被准确识别,即使灵敏度数值很高,实际测量分辨率也上不去。

所以业内经常用品质因数FOM来综合评价,定义是灵敏度除以半高宽:

$$FOM = \frac{S}{FWHM}$$

COMSOL仿真中可以同时输出这两组数据,直接用“一维绘图组”把反射率曲线导出来,然后用脚本或手动量出谷深和FWHM。做传感器设计时,不要只盯着共振角移动快不快,把FOM一起做了对比,选型才有说服力。

还有一个很有用的后处理操作:在共振角对应的频点查看界面附近的电场分布。真正激发SPR时,金层与SiO2层界面上应该有明显的电场增强效果,呈指数衰减状朝两边延伸。如果电场没有增强现象,那很可能是模型设置出了问题,出现了伪谷。

4. 问题排查清单:这些坑我基本都踩过

4.1 扫了很多角度,反射率却纹丝不动

这是新手最常见的问题。如果你扫完整个角度范围,反射率曲线始终保持在一个平台附近,没有像样的共振谷,首先检查入射偏振。SPR激发需要TM偏振,也就是电场在入射平面内、磁场垂直于入射平面。一旦在设置入射波时误用了TE偏振,金属膜的表面电荷振荡就激发不起来。

第二检查入射波的波矢表达式的符号和方向。有些情况下波矢指向弄反,能量根本传不到金属膜内部,共振自然无法发生。可以先随便挑一个角度,查看整个求解域里的电场分布,确认入射波是否真的在沿着预期方向传播。

第三检查金属膜是不是太厚。如果金膜设到200 nm以上,光基本穿不过去,共振条件就很难成立。回到40到60 nm区间再扫一次。

4.2 共振角比文献值偏了一两度,正常吗

太正常了。SPR共振角的精确位置对材料折射率非常敏感。不同文献里金的复折射率数据并不完全一样,棱镜折射率也会因为玻璃批次有微小差异,SiO2的实际厚度和界面粗糙度更是不确定。所有这些因素加起来,共振角偏1到2度根本不用奇怪。

我现在做这类仿真时,反而会利用这个“偏移”来核对材料参数是否合理。比如先用一种结构跑出来一个共振角,再和金膜厚度、棱镜型号对应的参考实验数据比较,如果有系统性偏差,就检查材料的色散曲线来源。

4.3 反射率曲线抖动、不光滑

曲线抖动通常有两个来源。一个是网格太粗,尤其是在金膜法线方向,场变化太快而网格完全表达不了。另一个是PML设置不够好,边界反射干扰了内部场分布。

排查时先细化金膜网格,把法线方向单元厚度压到2 nm以下,再看曲线是否变光滑。如果还在抖,就检查PML的厚度和网格层数,一般PML厚度至少要达到工作波长的2到3倍,扫掠层数建议5层以上。

4.4 内存不足,算到一半卡死

三个字:降三维。SPR平板结构用二维模型完全可以表达。很多朋友一开始就建了三维模型,结果网格数量轻松破百万,普通电脑直接卡死。二维模型计算量小一个数量级,参数扫描速度和三维完全不是一个概念。

另外,计算域也不宜铺得无限大。用大计算域加PML确实省心,但计算域太大会浪费大量网格。模型区域只要能完整容纳倏逝波衰减长度和PML吸收效果即可,不需要把周围环境全部画进去。

4.5 如何确认模型里跑出来的是SPP而不是别的光学现象

反射率出现低谷不必然代表SPR激发。为了确认,可以在共振角对应的频点查看磁场或电场分布。SPP模式的特征是:电磁场在金属与介质界面上最强,向两侧呈指数快速衰减,并且在界面方向上是表面波模式。

把你计算得到的共振角代入背景场,查看界面电场模值,如果看到明显的局域增强,基本上可以认定SPP被成功激发。如果电场分布看起来更像普通的镜面反射干涉效应,那大概率是边界条件设置出了问题。

现象可能原因检查和解决方向
反射率没有共振谷偏振设成了TE;金属膜太厚;入射波动量不匹配改为TM偏振,检查波矢方向,金膜改回40~60 nm
共振谷位置偏移材料折射率数据不同;膜厚有偏差;网格太粗核对文献数据,加密金膜网格,确认PML吸收
曲线抖动不光滑网格太粗;PML反射金属层法向网格细化,PML厚度增加
内存不足三维模型;计算域过大改用二维模型,缩小计算域
共振谷很浅待测介质虚部过大;金膜厚度太薄虚部设为1e-4量级,优化金膜厚度

5. 一个更实用的扩展:把厚度优化做成双层参数扫描

5.1 同时扫金层厚度与SiO2厚度,画一张性能热点图

做完基础模型以后,你大概率会想知道:金层厚度和SiO2层厚度到底取多少。与其一个参数一个参数地扫描,不如直接在COMSOL里做双层参数扫描。在“参数化扫描”节点里可以把两个扫描参数列出,比如金层厚度扫40到70 nm,SiO2层厚度扫0到20 nm,COMSOL会自动完成所有组合求解。

求解完成后,在后处理里把每个组合的共振角、谷深和FWHM提取出来,用二维方式绘制成性能热点图。这样你可以一眼看出“灵敏度足够高且谷深足够大”的参数区域在哪里。这个方法在做真实传感器设计选型时非常有用,省下来的是大量重复仿真的时间。

5.2 从二维平板到光栅耦合SPR

Kretschmann棱镜结构不是SPR传感器唯一实现方式。还有一种是光栅耦合,在金属表面刻出周期性微纳光栅,光从上方直接照射光栅结构即可激发SPP,不需要棱镜。光栅周期决定了额外的动量匹配条件。

COMSOL里仿真光栅SPR需要用到周期性端口和Floquet周期条件。求解后得到的S参数谱中,透射反射谱里的共振谷就是SPR响应。这类模型的建模思路和介质光栅很类似,只是把光栅材料换成金或含金复合层。你如果已经掌握了平板SPR模型,往光栅SPR扩展其实是个很平滑的过渡。

5.3 与实验对标时的几条建议

仿真结果和实验结果永远不可能百分百一致,这是必须接受的现实。做对标实验时,我习惯遵循三个原则:先用没有SiO2层的“棱镜+金+水”基础构型校准材料参数;再依次加SiO2层和待测分子层;每一步只改一个变量。这样当某个环节出现偏差时,你能立刻定位问题在模厚还是材料参数上。

从个人实践角度,COMSOL仿真在SPR传感器设计中的价值更多是“趋势预测”和“参数优化”,而不是精确复现某一次实验曲线。材料折射率差一点,共振角就可能差好几度。只要仿真和实验的总体变化趋势一致,模型就可以作为后续结构优化的可靠依据。

最后再分享一个我自己的操作习惯:每次跑参数扫描之前,一定要先把材料参数和波长固定下来,再去看角度或厚度扫描。因为SPR模型中各个参数强耦合,一次性改太多变量,出了问题根本分不清是哪个设置引起的。先跑通一个最简单的基准结构,再逐步增加复杂度,排查效率会高很多。做仿真这件事,慢就是快,一次只动一个变量,比急着凑结果更重要。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进