公司因研發上的需求進了一台Ocean Optics公司USB4000型光譜儀,接著是一連串測試惡夢的開始
原本幾年前有寫好同一家公司的光譜儀擷取程式,用在其他型號的光譜儀都沒有問題,惟獨USB4000型就是無法正常擷取,出來的資料都是0
透過代理商找原廠分公司解決,原廠分公司建議下載OmniDriverSPAM_1.5_Win32_full_release.exe新版的驅動程式,下載安裝後還是一堆問題(驅動程式如何安裝請自己研究,本文章不討論這個問題)
新版的驅動程式函數呼叫使用順序和舊版的完全不同,全部程式要重新改寫
但LabVIEW 7.1版怎麼試就是會有問題,只好改用8.6版來寫程式,但是仍無法擷取光譜。在原廠分公司的建議下找到手冊,經過多日奮鬥才將整個手冊翻譯解讀完畢,才發現手冊參考價值有限
手冊是有提到LabVIEW的範例檔放在哪,但是所提的資料夾和檔案實際存放的資料夾路徑不同,那麼多範例哪個才是正確的?範例內的SubVI有何用途?面對一堆呼叫驅動程式函數的SubVI找沒有全部的詳細說明,照著手冊和範例程式頂多只能做到擷取光譜,進一步的設定完全不知道怎麼做
經過多日測試寫好了各型號光譜儀都可用的測試用程式,確定了用到的SubVI的詳細設定和用途及連接順序,連接的順序很類似資料庫SubVI的作法
以下依連接順序用口語化的方式簡單說明用到的SubVI設定和用途,用到的SubVI全放在驅動程式安裝資料夾的Wrapper.llb這個檔案內,有相同困擾的人可以參考看看
1.Wrapper_Create.vi
用來建立和光譜儀連線的基礎架構平台
2.Wrapper_openAllSpectrometers.vi
打開光譜儀的通訊埠
3.Wrapper_setIntegrationTime.vi
設定光譜儀的積分時間,基本上積分時間越長所擷取到的光譜訊號越強,但積分時間太長光譜訊號是會滿載破錶的,這樣擷取到的光譜當然是錯誤的,所以積分時間要依實際用途去調整設定
Index:設定光譜儀的通道,基本上這家公司光譜儀都有8個通道可設定,但只要設定為0,用主通道即可
Integration Time:設定積分時間,這部分手冊沒寫清楚,一開始原本以為和舊版驅動程式相同使用毫秒(ms)為單位,在幾次擷取不到正確的光譜後才發現居然是使用微秒(μs)為單位,1毫秒(ms)等於是1000微秒(μs)等於是0.001秒(s)
這裡要設定多大呢?依光譜型號不同最小容許積分時間也不一樣,越高階的機種容許積分時間越短。USB4000型的手冊提到最小值是8ms,實測最小可設定到3ms
另外待測物和光譜間的距離也是重點,距離越遠需要的積分時間要越長,才能擷取到足夠強度的光譜資料
我的待測物距離光譜儀約30公分,積分時間太短擷取到的光譜很弱難以分析,所以我設定的比手冊的最小值大很多是100ms,在這裡值是100000
注意:積分時間小於光譜儀能容許的最小值時,擷取到的幾乎都是暗電流(電子雜訊)訊號,也就是無用的光譜資料
4.Wrapper_getWavelengths.vi
讀取光譜儀通道的使用波長,讀出來的是陣列資料,用來設定給顯示圖表的X軸資料。這個SubVI似乎是專門給USB4000型以上機種用的,用在其他低階機種讀到的不是正確波長資料
Index:設定光譜儀的通道,同樣要設定為0,用主通道即可
5.Wrapper_setCorrectForElectricalDark.vi
抑制暗電流(電子雜訊)訊號,高階的光譜儀因為靈敏度高,相對的暗電流(電子雜訊)訊號越強,所以這一項等於是一定要打開。更高階的機種可加裝致冷晶片,暗電流的訊號可抑制到最小
Index:設定光譜儀的通道,要設定為0,用主通道
On/Off:設定為0是關閉,設定為1是打開
6.Wrapper_setBoxcarWidth.vi
Boxcar Width這個單字用哪個翻譯軟體都翻成棚車寬度???,實際上這裡指的是用"移動窗口法"來平均平滑光譜訊號,進一步消除雜訊干擾,但是設定太大訊號多少會失真,所以要依實際用途微調
Index:設定光譜儀的通道,要設定為0,用主通道
Boxcar Width:設定要平均平滑的點數,例如設定為5時,就是以每5筆的資料計算平均後再輸出。以消除雜訊干擾的效果和擷取效率的平衡點,我是設定為9,用每9筆的資料計算平均後再輸出
7.Wrapper_getSpectrum.vi
用來讀取光譜資料,讀出來的是陣列資料,用來設定給顯示圖表的Y軸資料。光譜分析也是以這裡讀出來的資料做分析
Index:設定光譜儀的通道,要設定為0,用主通道
8.Wrapper_closeAllSpectrometers.vi
關閉光譜儀的通訊埠
9.Wrapper_Destroy.vi
用來斷開和光譜儀連線的基礎架構平台
程式的書寫要使用順序結購(Flat Sequence Structure)元件
設定好就不用再變更的SubVI全寫到順序結購(Flat Sequence Structure)元件外面的左邊:
Wrapper_Create.vi
Wrapper_openAllSpectrometers.vi
Wrapper_setIntegrationTime.vi
Wrapper_getWavelengths.vi
順序結購(Flat Sequence Structure)元件第1格內要連續擷取光譜資料,所以放上While Loop迴圈
While Loop迴圈內放上要用的SubVI
Wrapper_setCorrectForElectricalDark.vi
Wrapper_setBoxcarWidth.vi
這2個SubVI若不用在程式執行時變更設定,也可以寫到順序結購(Flat Sequence Structure)元件外面的左邊
Wrapper_getSpectrum.vi
這是讀取光譜資料的主體,一定要放在While Loop迴圈內才能夠連續擷取光譜資料
順序結購(Flat Sequence Structure)元件第2格是關閉光譜儀的通訊埠,要放上Wrapper_closeAllSpectrometers.vi
順序結購(Flat Sequence Structure)元件外面的右邊放上Wrapper_Destroy.vi斷開和光譜儀連線的基礎架構平台,這個SubVI一定要用,這樣才能確保第2次執行程式時光譜儀還可正常動作
全部完成的程式,SubVI一定要按照既定的順序連接
以下看程式執行的結果,主要設定項的設定和光譜資料的關係
首先不抑制雜訊,不平均平滑光譜資料
可以看到暗電流訊號強度在1375 to 1525之間,跳動的很厲害
再來抑制雜訊,不平均平滑光譜資料
可以看到暗電流訊號強度已降低到在-80 to 80之間,但仍跳動的很厲害
接著抑制雜訊,用9點平均平滑光譜資料
可以看到暗電流訊號強度已降低到在-10 to 20之間,跳動已大幅減少
這種設定當然不是沒有缺點,在光譜最前面和最後面的資料因為無法平均平滑計算,結果就是數值會大於中間平均平滑計算後的資料。在做光譜分析時一定要捨棄前後的資料
再來實測一個LED手電筒的光譜
首先不抑制雜訊,不平均平滑光譜資料
再來抑制雜訊,用9點平均平滑光譜資料
可以看出有經過處理的光譜資料雜訊較少
其他讀取設定致冷晶片溫度這一類的SubVI,因為只有高階機種才有那些功能,這裡跳過。等以後有機會用到高階機種在放上研究成果
留言列表