如何DIY一台信噪比和分辨率不输于商业仪器的低成本激光Raman光谱仪

Raman光谱是什么我就不多解释了,大家都懂,相信大家也都已经体验过用Raman光谱仪做各种分析的方便之处了,比如说自己新搞来或者合成了什么物质想简单地看一下纯度,再比如说用来快速地鉴定各种塑料材料是什么,或者鉴定一些样品里面有什么东西等等。总之,拉曼光谱最爽的几个点就在于它不需要对样品做过多的处理,晶体、固体粉末、液体、溶液、表面等等都可以直接打谱,可以说是极其的方便。

然而普通的人想要搞一台Raman放在家里用并不是一件容易的事,因为目前来看商业的Raman光谱仪价格都还比较高,便宜的在几十万,贵一点的一套房就没有了。然而,实际上商业的拉曼里面有很多功能我们都是用不上的,我们日常使用的话对拉曼的要求并没有那么高,最重要的参数就是分辨率和信噪比(SNR)。实际来看,分辨率做到10个波数左右,SNR上百就已经非常够用了(作为参考,Wasatch Photonics 的 WP532 系列的分辨率有3种,分别是7、9、15个波数,常温探测器的信噪比在500:1,低温探测器的信噪比在2400:1)。

这篇文章主要是从原理出发,带你走完一个设计到搭建一台基本的拉曼光谱仪的完全流程,包括光学部分,电路部分和软件部分等等。在这台基本的拉曼光谱仪上,可以做各种改动来做更高级的拉曼,比如探测器冷却技术,表面增强技术等等。

先给你们看一个效果,如图是我做的仪器打出来的环己烷拉曼光谱。数据只进行了横向缩放来对准波数。

注意从3000个波数往左的两个峰,两峰的标准谱图间距是 14 个波数,因此此图说明我们的拉曼分辨率可以达到小于14个波数,实际的极限分辨率在10个波数左右,大概属于商用仪器的中等配置水平。

简单用matlab计算一下信噪比,大概在个162:1的样子(22.11 dB),这是由于我们采用的积分时间比较短(否则CCD信号会发生溢出),不过已经基本上够用了。如果想要得到更高的SNR,可以将探测器部分降温,或者换更好的暗电流更低的探测器。

现在我们来正式地考虑怎么做这台仪器

光路的设计和元件的选择

首先,我们要知道的一个基本的事实是,拉曼属于分析化学中光谱学分析的仪器。因此,无论多么炫酷的拉曼,它基本上一定是一个光学仪器。那么,为什么很多光学仪器,比如uv-vis,IR这些早早就已经发展起来了,但拉曼到近代才进入实用呢?因为Raman光谱探测的实际上是物质的非弹性散射,一般来说我们探测的是散射的斯托克斯线(Stokes lines)。相比弹性散射的强度,Stokes线的强度只有Rayleigh线的千分之一乃至万分之一。因此,我们需要一个比较强的光源,才能探测得到Raman信号。另一个问题是,Raman位移实际上并不怎么大,如果我们的光源的单色性不够好,或者单色器的色散率不够高,那不仅谱线会有比较大的展宽,严重的情况下可能会根本分不出谱峰。实际上,我们通常来说需要线谱的光源。

从以上的问题我们可以看出,我们要解决这些问题,最好的办法就是用激光作为光源,用光栅作为单色器。激光一般来说,具有单色性好,强度大的特点。而光栅相比起棱镜,色散率和效率一般要高得多,并且随着近年来光栅的需求量越来越大,光栅的价格也逐年下降,现在已经和棱镜比较接近了。

确定用激光作为光源,那么接下来就是选择激光的波长。从Raman的原理可以看出,对于不同波长的激发光,Raman位移并不会发生变化。因此,波长的选择并不会影响我们的结果。但是,波长的选择显然会影响我们的预算,因为有的激光比其它激光的价格贵得多。。。一般来讲,越靠近高能区(uv),激光器的价格越昂贵(这不一定总是成立,价格实际上和市场需求更有关,某个波长用得多了,价格就会下来)。而不同波长的滤光片的价格也一样不同,并且,探测器的灵敏度通常也和波长有关,对于不同的波长,我们需要选择不同响应区间的探测器。同时,根据瑞利散射定律,散射光的强度与波长的4次方成反比。因此,波长越长,信号越低,蓝光到红光之间的差距能够达到15倍。综合以上的情况来看,我们应该在价格允许的情况下,选择一个比较低波长的激光器,但不能跑到探测器的响应范围外。532 nm 是一个实验室里常用的波长,因此它的价格比较便宜,处在绿光区,情况比较适中。作为刚开始,我们可以简单地暂定就选择 532。

确定了光源和单色器,剩下的部分就很简单了,基本上就是光谱仪的老一套。但是一个不同点在于,由于我们只需要位移信号,为了避免之后的干扰或者造成CCD过曝,光路中应该加入一个滤光片,来把弹性散射部分滤除。要实现这一目的,我们使用Edge 滤光片:这是一种长波通的滤光片,通过在光学玻璃表面镀膜的干涉相消效应,来实现阻止低于某个波长的光通过,而允许高于某一波长的光通过。

Figure 1. Edge滤光片参数曲线

对于我们使用的 532 nm 激光,线宽如果是 0.1 nm,则应该选择滤除 533 nm 以下的波长的滤光片,如图1所示。

对于我们的拉曼,成本是一个非常敏感的因素,因此我们在所有元件上的投资,不能过于集中在某一个元件上。滤光片的好坏,取决于它的透过率对波长的变化的突变有多强烈。如果滤光片的突变不够强,则会把低波数的信号也滤掉一些,这是我们所不希望的。不过,稍微好一些的滤光片价格一般都会比较贵,比如 Semrock 的 RazorEdge,从1%~99%的突变仅仅发生在一两个nm之间,价格在几百到几千美元一片。

传说中的高级滤光片,靠后的圆形滤光片是便宜货,靠前的则是价值2万元的滤光片和二向色镜

如果我们想要看到较低波数的峰,则需要用到这一类比较好的滤光片。不过,现在我们暂时先把目标测量区间定为 \(600\~3500 cm^{-1}\) ,大多数拉曼的谱峰都位于这个区间之内,并且我们可以使用相对便宜的滤光片。如果将来对低波数的峰有需要,我们再更换滤光片即可。

接下来,我们考虑怎样将激光引入光路,以及怎样将样品引入光路的问题。如前所述,Raman测量的是物质的散射光。散射光的特点是向所有方向均匀发射,因此,如果将激光直接照射在样品上并用透镜组收集的话,需要比较大口径的透镜组才能收集到充足的信号。这样一方面是比较昂贵,另一方面是衰减浪费比较多,并且无法进行样品的表面微区分析。

事实上,在Raman中,我们一般用一个物镜组来聚焦激光。这样,根据光路的可逆原理,焦点处的散射光将有很大一部分回到物镜,并且从物镜出射,变成近似平行的光,如图所示。

瞎jb乱画的,懂意思就行了

不过显然我们已经发现上图的问题了。如果光线原路返回,显然它会打在激光器上,那我们什么也测不到。因此,我们的激光不能直接这样引入光路。一种聪明的引入激光的方法是用所谓的二向色镜。二向色镜和滤光片差不多,它也是只允许一定波长的光通过,而反射另一波长的光。不过,它与滤光片不同之处在于,滤光片要求垂直放入光路中,而二向色镜是45°放入光路中的。

二向色镜,不是我画的。图里有一个显著的错别字 2333

我们在这里,同样使用反射绿光的二向色镜。

二向色镜波通特性

这样,我们不仅可以将激光引入光路,而且在光线进入滤光片之前,就已经提前滤除了部分绿光。

到现在为止,我们已经考虑了光源、单色器、样品、滤光等等情况。最后,和所有的光学仪器一样,为了成像,我们还需要一个狭缝来作为一个被成像的物。向光路中加入狭缝之后,再加入一些trivial的用于改变光的传播方向的透镜和反射镜,我们的光路就已经设计好了,就像这样:

光路,这次我用 PS 好好画了!

总结一下光路:532 nm 的激光从激光器中出射,在二向色镜上被反射进入物镜,聚焦后与样品接触。散射光从样品上出发,经过物镜聚光后变成近平行光,透过二向色镜,(平面镜只起到改变光路方向的作用,可以减小我们的装置大小),在透光片处,波长短于绿光的光被滤除,斯托克斯线则通过滤光片,进入聚焦透镜。在焦点处穿过狭缝,在凹面镜1上聚集为近平行光并射在光栅上,色散后的光线经凹面镜2聚焦,在CCD上成像。

电路的设计和元件的选择

你也许注意到了我们在上面讨论光路的时候没有介绍 CCD 是什么。在古代的时候,许多光学仪器是用光电池作为探测器的。用光电池的坏处是,色散后每次只能测定一个波长的光强,要得到全光谱需要靠转动光栅或者反射镜来改变照射在探测器上的光的波长。如果你的样品或者光源不怎么稳定的话,那就很难测得准确的光谱了。现在,由于技术的发展,我们有了CCD这种阵列式的探测器,它可以一次测出一整排区域上的光强,并且非常准确。如果你还不知道什么是CCD,那可以赶快找一本现代一点的仪器分析教材或者维基百科页面看一下。

在低频电路设计中,影响最终电路质量的一个关键因素就是元件选型。考虑到这篇文章的受众里有一些同学可能不太熟悉电路设计,我简单进行一下选型分析,如果你熟悉的话,这一段可以跳过了。电子元件的选型要把握住两个要点,一个是够用即可,一个是容易开发。

因为我们的光谱是一维信息,我们在这里需要的是所谓的线阵 CCD。一个比较经典的型号是东芝的 tcd1304ap 或者 tcd1304dg。简单的计算可以大概得出,在我们的光路下,TCD1304系列的一个像素大约对应0.8个波数,远远小于我们的分辨率了,因此这一系列的 CCD 基本上已经够用了。

当然,单有一个 Linear CCD 是不够的,我们还需要 CCD 的驱动和数据采样控制电路。

一般来讲,由于数据的带宽比较高,我们通常选择 FPGA (Field Programmable Gateway Array)来作为 DSP (Digital Signal Processing) 芯片。FPGA 常见的选择有 Altera 的 Cyclone 系列,Xillinx 的 Spartan、Virtex 等。当然,因为这个数据的带宽也没有那么高,实际上 Cyclone 就已经很够用了。

对于穷人或者教育目的来说,FPGA开发可能要花去不少钱(如果你没有相关的开发经验,光电路板也许就要废掉许多块。。此外,还要配置价格不菲的高速示波器和信号分析仪用来 debug),因此,如果牺牲一些性能的话,那么采用ST Microelectronics的 STM32 系列 MCU 作为 DSP 芯片也是不错的选择,因为这一系列的芯片价钱非常低,并且有很多成熟的开发板可供实验,成本也就在几十元到几百元之间。此外,由于STM32在工业界用得已经比较成熟,各种 C++ library 直接使用起来也比Verilog等语言对新手友好得多。对于我们的应用来说,stm32f10x 系列虽然非常便宜(几块钱到几十块钱),但它的配置也许有一些过低,如果你是这方面的高手的话,也许能把程序塞进去。但是前面也说了,经费应该尽量均摊,因此在这方面也没必要太抠门,弄一个stm32f40x是不错的选择(几十到几百块)。

此外,你还有大量的芯片可选,比如TI的专门用来做低功耗 MCU 的 MSP430 等等,总之此处只要是一个速度达标的,可以处理数字信号的东西就 ok,但你需要衡量它的芯片成本和开发难度。

和上位机通信的通信也有很多种方式。既可以走以太网,也可以走FIFO,然后采用 FTDI 等公司的 USB 芯片(比方说FT245RL)来连接上位机。注意:你简单计算一下带宽就知道,许多DIY爱好者常用的CH341等串口芯片在这种情况下是绝对不够用的。一般的COM口速率最多也仅仅 115200 bps,传递指令也许可以,回传数据是完全不够的。不过,我们在软件开发的部分会讲到,对于这一部分底层协议,封装成所谓的 VCP (Virtual COM Port) 是相当有用的 (VCP的通信速度并不受COM限制,它只是个软件封装,并不影响带宽)。

CCD 通过 FPGA 或者 MCU 驱动之后,输出的模拟信号需要进行处理。为了得到这个信号的数值,我们首先对其进行放大。这里用到的元件,被称作运算放大器。运算放大器的选择极其多,实际上现在地球上相关元件的型号可能已经多到一般人记不住的地步了,所以对于一般的应用场合,选择最普通的LM324, LM358 等型号即可。这两款芯片是世界上最普通的运放,出货量极大,性能比较一般但是稳定,能胜任很多工作。运算放大器一般可以比较无脑地升级,如果以后证明这两款芯片不行,我们还可以损失不太大地再改变设计。当然,事实证明LM324就已经完全足够了。

得到放大之后的模拟信号,需要通过ADC (Analog-to-Digital Convertor)芯片进行转换。这也是一个选择极其多的芯片,实际上在低速领域它们的性能也差不太多,甚至国产的芯片也有一些不错的。由于也不是在搞高保真那些玄学,先选一个普通的 Analog Devices 的 LTC1864/LTC1865 就可以。

这些关键的元件选定之后,我们就可以画电路图了。这方面对于有一定经验的数字电路工程师来说不是什么困难的事情,按照选择的元件 datasheet 中要求的外部电路进行拼接就可以了。

CCD 驱动电路图

如图所示,这里我们 TCD1304 给出的模拟信号用 LM324 进行放大之后,传到 LTC1865 转换为数字信号输出到 FPGA。在 FPGA 进行处理后将信息传递到 FT245,由 FT245 转化为 USB 协议后传递给上位机。此外,模拟信号也直接传递给 Analog Out 端口,方便调试阶段直接用示波器看信号。

软件的设计和组件的选择

上位机软件设计方面,相信对于多数人来说就没什么难度了。我就简单讲下软件的结构。

首先,我们要确定我们的程序里究竟需要什么。显然,从下位机传来的信号需要进行读取,进一步数学处理,从而变成实际可用的真正的光谱数据。接下来,数据有两条可走的路:一是直接把数据输出到文件,然后用其它软件继续处理。二是继续把数据传递到用户的GUI,直接将图谱在线地显示出来,并且提供一些简单的工具让用户进行处理。

从以上角度来看,我们的程序自然地分为两个部分:一个后端,负责仪器的工作和逻辑的处理;一个前端,负责管理GUI和用户的操作。

为了实现以上的功能,我们首先需要选择一种编程语言。对于和下位机的沟通,C++是一个自然的选择。不过,C++在写用户应用方面不是非常方便,我们可以简单地就用Python来写更上级的程序。这样,后端我们就用C++和Python来写。这样的好处是,我们的程序甚至也能很轻松地支持嵌入式设备。

现代的一个有趣的事情是,由于互联网的普及,几乎任何用户终端设备上都必定有浏览器,因此,浏览器支持的 JavaScript 从一门十分随意的语言一跃成为真正的全平台运行的语言,而用 JavaScript 写的应用反倒成了真正的全平台应用。因此,我们take this advantage,前端就用 JavaScript 和 HTML5 来写。

不过,JavaScript 的设计实在是太难用了,并且不同浏览器支持的 JavaScript 实际上也略有不同,因此我们实际上并不打算真的写 JavaScript,而是只在十分必要的时候写一点点相关的代码,其它时候,我们尽量把逻辑交给 Python。

现在我们已经确定了所有需要的东西。我们可以梳理一下我们需要些什么模块:

1. 硬件虚拟化模块:

硬件虚拟化模块

1) VCP module: 将任意下位机协议转化为更简单的 VCP,隔离数据链路和应用层,从而实现应用层协议处理程序与下位机通信协议无关。该模块意味着更上层的程序对于任何 CCD 信号采集芯片或者各种其它仪器都是通用的。

2) Protocol Parser module: 处理用户定义的应用层协议与 python object 间的转化,起到程序逻辑与实际 IO 之间的翻译桥梁和隔离作用。该模块意味着当 CCD 固件中定义的协议发生改变时,只需更新此模块即可兼容。

 

2. 服务端逻辑模块:

1) Tornado: 由 Facebook 公司开发的高效异步框架。我们引入Tornado的 IOLoop, coroutine 等用于非阻塞地处理多用户操作。

2) Raw Data Processor module: 主要用 Numpy / Scipy / Pandas 实现,实现原始数据的数学处理,包括自动寻峰、平滑、校准等功能。允许用户自定义数据处理模型。

3) Bokeh: 由DARPA XDATA program 资助开发的 python 大规模数据可视化库,用于在GUI端高速渲染谱图。

3. 客户端控制及GUI模块:

1) Web App: 从浏览器界面直接进行操作,并能实现多用户操作下用户数据隔离。

2) API module: 提供方便的 API,允许用户自己编程定义一系列对仪器、数据和图谱的操作。

3) Native App: 对于习惯传统操作界面和模式的用户,提供封装好的操作界面。

4) Independent Renderer: 对于需要更个性化的图谱的用户,提供各种标准格式 (json/xml/csv/excel) 的原始数据和处理后数据导出方式,并可根据需要选择其它渲染器。

4. 开发用模块:

1) Software Simulator: 用于在离线情况下快速测试上层软件开发结果的CCD模拟器。

2) Hardware Simulator: 基于 Arduino 或者 STM32 的硬件级 CCD 模拟器,用于在离线情况下测试硬件虚拟化模块。

3) Theme Configuration Toolkit: 快速定义基于YAML的主题文件,可以让用户快速设置操作界面语言、元素、设计风格以及自己喜欢的前面板布局等。

以上就是我们的软件需要实现或者引入的功能,看上去十分的简单,是一个通用型的轻量级光谱程序,并且十分容易扩展。

 

到这里,我们的光谱仪设计就都已经完成了。接下来,就是按照设计依次完成各个部件以及进行装配。由于这部分比较弱智,我就尽量挑重点讲,关键是说明技术中的要点。

光路的组装

这一部分实际上应该在最后各个部分都准备好了再来做,但是既然我上面写文章的顺序是这样的,那我就不管逻辑了 2333

光路的组装相信大家在小学科学和自然课应该就非常熟悉了(现在还有这课吗),按照我们之前设计的光路图进行安装。首先,要注意防护光学元件,工作环境要尽量避免灰尘,处理光路时注意戴口罩和手套,绝对不能对着光学元件说话以防口水乱溅。

首先取出平面镜,平凹镜,二向色镜,光栅,将其安装在 XZ 精密调节架上,将各个整体通过接杆牢固地固定在底座上。

取出滤光片和凸透镜,由于这两个镜片不需要精调,只要对准光心并且垂直即可,因此固定在圆形底座上来节省几个精密调节架。

物镜、样品池、CCD和狭缝只需要高度合适即可,直接安装在底座上。

激光器一般出场后底部会有对应的螺丝孔,用数控加工中心或者铣床做一个铝的基板,在铝基板上合适位置打孔并攻丝,用螺丝上好固定在光学元件同款底座上即可。

在这台Raman里,我们用的激光器功率不算很大,但是足以对人造成永久性的伤害,因此,调节激光的时候,除了光路,房间内要杜绝任何容易反光的东西,比如金属手表带、首饰、戒指等。并且,在激光打开的时候,任何人都不能把头放到基准水平面以下,比如说捡地上的东西的时候,必须要先确保激光电源断开。

按光路图先粗略地摆放各个元件,先拿开滤光片或者将滤光片偏转一个角度,在样品池上贴一片小镜子或者光滑硅片,打开激光器,将功率调到一个较小的值,用准直法和成像法,从激光器出发,用 532 nm 绿光依次准直各个元件并且调焦。在光经过光栅之后,会形成多级衍射斑,这时候可以用白光从入射光方向照射光栅,确定最强的有色散的衍射斑。由于我们使用闪耀光栅,光栅有最佳的使用角度。其理论计算比较繁琐,并且安装时会有误差,因此一个比较简单的确定角度的办法是用硅光电池接到示波器上,在roll或者XY模式下慢慢转动光栅,确定光强最强角度。

最终,光路调节完毕,应该在CCD的感光线阵上成一个竖直的锐利的狭缝小像。

随便找一些纸板或者黑布之类的东西,把光路的外面罩住以防环境光进入,读取依次CCD数据,应该得到一张锐线光谱和一些乱七八糟的小峰,并且会有相当大的噪声。谱中,锐线就是激光的 532 nm 线,其它的小峰并不是真实的谱峰,而是 532 nm 在仪器内四处反射形成的杂斑。

为了去除这些噪声,随便找些吸光的材料对光路中容易引起噪声的部分进行一些遮蔽,直到测谱出来只剩下532 nm线为止。

接下来,向光路中放回滤光片(或者重新拧正),再测谱,532 nm 线应该完全消失。

把样品池上的镜子拆下,换上玻璃池,内部装乙醇或者环己烷,再测谱,应该就能得到对应的拉曼谱图了。不过,此时拉曼谱图可能分辨率非常差,各个峰都有可能变成巨大的鼓包无法辨别。这时候要反复在焦面附近调节CCD,直到CCD的线阵和焦面重合为止,此时分辨率就能达到最高。

最后,为了方便测试固体粉末和表面样品,在样品池的下方安装XY精密滑台。

至此,光路组装完成。

如图所示。为了缩短工时,内部就不用做得太整洁了。。随便弄点纸和泡沫意思一下就行。又不是不能用

下位机程序

Protocol 设计

开始的信号,终止的信号,积分时间设置,触发模式设置,数据回传格式

TCD1304 信号处理 (Datasheet: http://www.spectralproducts.com/pdf/TCD1304.pdf),网上教程实在是太多了。。

FT245RL 用法 ( 这也太sb了,我写不动了你们自己去看吧…

Datasheet: http://www.ftdichip.com/Documents/DataSheets/ICs/DS_FT245R.pdf

Programmer Guide: http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer’s_Guide(FT_000071).pdf

)

[TODO] Cyclone FPGA 教程 [/TODO]

[TODO] STM32 教程 [/TODO]

上位机程序

唉我实在写不动教程了,这个太简单了。。。我等会开源出来你们自己看吧

raman-spectroscopy-software

One thought on “如何DIY一台信噪比和分辨率不输于商业仪器的低成本激光Raman光谱仪”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.