ChOpticsDriver介绍

本篇介绍了关于应用程序控制光谱仪获取光谱的一些基本序列操作。这些功能对于所有辰昶光谱仪都是普遍适用的。本章详细介绍了这些基本序列操作方法,包括涉及的所有参数和数据类型。

C++调用该库的IDE设置

右键->项目属性->配置属性

  1. 高级
    • C++/CLI属性
      公共语言运行时支持:.NET Framework运行时支持(/clr)
    • 高级属性
      MFC的使用:在共享DLL中使用MFC
  2. C/C++ ->常规
    公共语言运行时支持:公共语言运行时支持(/clr)

函数说明

  1. 创建/实例化Wrapper对象:
    在控制光谱仪之前,添加对该库的引用,添加命名空间Choptics,然后创建一个Wrapper对象。这是实现控制谱仪所有功能的一把钥匙。。
C#
	Wrapper wrapper = new Wrapper ();
C++
	Wrapper^ wrapper=gcnew Wrapper();
  1. 打开所有光谱仪:
    其次,查询USB端口识别的所有连接的光谱仪。函数OpenAllSpectrometers()将打开所有识别到的谱仪,调用某台谱仪的时候根据索引值(index)调用。
    OpenAllSpectrometers()方法返回从0到N的一个整数,即为所识别到的光谱仪总数。在打开所有光谱仪后,可通过wrapper.GetNumberOfSpectrometersFound()函数来获得光谱仪的总数。
C#
	int  nuberOfSpectrometers;
	
	//以下两个函数都可以返回检测到的光谱仪数量
	//OpenAllSpectrometers()只能在Wrapper实例化之后和开始控制光谱仪之前调用一次
	numberOfSpectrometers = wrapper. OpenAllSpectrometers();
	
	//需要查看检测到的光谱仪数量,可以调用该函数
	numberOfSpectrometers = wrapper.GetNumberOfSpectrometersFound();
C++
	int  nuberOfSpectrometers;
	numberOfSpectrometers = wrapper->OpenAllSpectrometers();
	numberOfSpectrometers = wrapper->GetNumberOfSpectrometersFound();
  1. 获取光谱仪名称:
    这个操作是可选的。当你想知道你调用的谱仪名称的时候可以根据当前索引值(spectrometerIndex)调用函数wrapper.GetSpectrometerName(int spectrometerIndex)来获取光谱仪的名称。
C#
	string  spectrometerName = wrapper.GetSpectrometerName(0);
C++
	string  spectrometerName = wrapper->GetSpectrometerName(0);
  1. 获取光谱仪光谱:
    光谱仪光谱数据是一个简单的一维数组,存储类型为double类型。不同光谱仪返回的光谱数据大小也不同,根据当前谱仪的索引值(spectrometerIndex)调用函数wrapper.GetNumberOfPixelsOfSpectrometer(int spectrometerIndex)返回的当前谱仪的像素点数来决定数组的大小。通过函数wrapper.GetSpectrumFromSpectrometer (int spectrometerIndex)将返回光谱数据数组,光谱数据数组对应的波长数组通过函数
    wrapper.GetCorrectionWavelengthOfSpectrometer(int spectrometerIndex)返回。
C#
	int  numberOfPixels =w.GetNumberOfPixelsOfSpectrometer(0); 
	double[]  wavelength = new  double[numberOfPixels];
	double[]  counts = new  double[numberOfPixels]; 
	wavelength = wrapper. GetCorrectionWavelengthOfSpectrometer (0);
	counts=wrapper.GetSpectrumFromSpectrometer(0);
c++
    int  numberOfPixels = wrapper->GetNumberOfPixelsOfSpectrometer(0);
    cli::array<double>^ wavelength = gcnew  cli::array<double>(numberOfPixels);
    cli::array<double>^ counts = gcnew  cli::array<double>(numberOfPixels);
    wavelength = wrapper->GetCorrectionWavelengthOfSpectrometer(0);
    counts = wrapper->GetSpectrumFromSpectrometer(0);
  1. 从光谱仪中读取探测器序列号:
    通过GetSerialNumberFromSpectrometer(int spectrometerIndex)函数来读取探测器序列号。
c#
	string SN = wrapper.GetSerialNumberFromSpectrometer(0);
c++
	System::String^ SN = wrapper->GetSerialNumberFromSpectrometer(0);
  1. 设置窗口平滑:
    窗口平滑就是通过一定范围内的所有连续的像素点的值进行平均来平滑光谱的像素点的值。每个光谱中的像素点都平均它左右两边的N个像素点。一个新的光谱就是这些像素点的值平均后的数据。
c#
	wrapper.SetWindowsOfBoxToSpectrometer(0, 5);
c++
	wrapper->SetWindowsOfBoxToSpectrometer(0, 5);
  1. 设置平均次数:
    平均次数是另一种用来减少获得的光谱的噪音的方法。这种技术是通过连续的多组光谱数据进行平均从而产生的一个平均后的光谱数据。这种算法是对应的像素点在不同光谱数据中对应的值求平均后为该点像素点对应的值。例如:平均次数为5,将五个连续的光谱数据pixel[0] 像素点对应的值相加,再除以5。这个数据将作为pixel[0] 像素点对应的值返回给用户。其他像素点对应值的求法跟此方法一致。
c#
	wrapper. SetAverageToSpectrometer (0, 5)
c++
	wrapper->SetAverageToSpectrometer (0, 5)
  1. 设置积分时间:
    积分时间是允许光通过光谱仪探测器一段长度的时间。在光弱的情况下,可以通过增加积分时间来获得一个有意义的光谱;在光强的情况下,也可以通过减小积分时间来调控。当该一个或多个的CCD像素点或井已被完全地排出(或在某些检测器完全填充)时就是出现了饱和。当饱和出现时,多余的光子进入井之后没有影响,光谱也变得失真。在绘制饱和了的光谱时,会出现峰被修剪的现象。
    积分时间的参数单位是微秒。通过光谱仪的文件可以了解到该款光谱仪所支持的最大和最小积分时间。部分型号光谱仪最小积分时间是1ms,则参数需要设置1000;
c#
	//积分时间单位为微秒
	wrapper.SetIntegrationTimeToSpectrometer (0, 1000);
c++
	//积分时间单位为微秒
	wrapper->SetIntegrationTimeToSpectrometer (0, 1000);
  1. 设置外触发模式:
    用户可以通过设置外触发模式来控制光谱仪的采谱方式。外触发模式TriggerMode一共有4种方式:
  • TriggerMode.normal:正常模式,也是软件中的默认模式,软件每调用一次GetSpectrumFromSpectrometer()函数,则软件会采集一次并返回数据;
  • TriggerMode.level :电平触发模式,通过外部给光谱仪电平信号,则光谱仪会采集一次并返回光谱数据;
  • TriggerMode.synchronous:同步触发模式,通过外部给光谱仪同步信号,则光谱仪会采集一次并返回光谱数据;
  • TriggerMode.edge:沿触发模式,通过外部给光谱仪沿信号,则光谱仪会采集一次并返回光谱数据;
c#
	wrapper.SetTriggerOfMode(0, TriggerMode.normal);
c++
	 wrapper->SetTriggerOfMode(0, TriggerMode::level);
  1. 制冷控制
    如果是制冷型光谱仪,,可以通过设置光谱仪的制冷函数来给光谱仪设置温度,如果是非制冷型光谱仪,则调用光谱仪制冷相关函数后,不会有任何相应反馈
C#
	//通过SetFanOn(int spectrometerIndex, bool FanEnabled)开启光谱仪的散热风扇,
	//必须在开启制冷前先开启风扇,
	//否则可能导致光谱仪CCD过热而性能不稳定,true开启风扇,false为关闭风扇
	wrapper.SetFanOn(0, true);
	
	///通过SetTecOn(int spectrometerIndex, bool TecEnabled)开启光谱仪的热电制冷,
	//true为开启制冷,false为关闭制冷
	 wrapper.SetTecOn(0, true);
	
	//通过SetTemperature(int spectrometerIndex, double temperature)设置制冷温度,
	//可以设置的温度区间可以通过获取最大或者最小温度来了解。	
	//设置的温度越小,光谱仪的噪声越小 ,但是如果温度过小,光谱仪无法稳定在该温度,
	//则可能导致光谱仪采集光谱数据不稳定
	 wrapper.SetTemperature(0, -20);
	
	// 通过GetTemperature(int spectrometerIndex)获取光谱仪的CCD温度,
	//可以根据获取的温度来判断设置的温度是否合理
	double celsius = w.GetTemperature();
	
c++
	//通过SetFanOn(int spectrometerIndex, bool FanEnabled)开启光谱仪的散热风扇,
	//必须在开启制冷前先开启风扇,
	//否则可能导致光谱仪CCD过热而性能不稳定,true开启风扇,false为关闭风扇
	wrapper->SetFanOn(0, true);
	
	///通过SetTecOn(int spectrometerIndex, bool TecEnabled)开启光谱仪的热电制冷,
	//true为开启制冷,false为关闭制冷
	 wrapper->SetTecOn(0, true);
	
	//通过SetTemperature(int spectrometerIndex, double temperature)设置制冷温度,
	//可以设置的温度区间可以通过获取最大或者最小温度来了解。	
	//设置的温度越小,光谱仪的噪声越小 ,但是如果温度过小,光谱仪无法稳定在该温度,
	//则可能导致光谱仪采集光谱数据不稳定
	 wrapper->SetTemperature(0, -20);
	
	// 通过GetTemperature(int spectrometerIndex)获取光谱仪的CCD温度,
	//可以根据获取的温度来判断设置的温度是否合理
	double celsius = w->GetTemperature();
04-09 19:22