NI-9234 Actual Sample Rate 問題

大家好!這幾天在用NI-9234搭配加速規來量測訊號,過程中有遇到些問題,想向大家請教。
程式部份我用labview範例檔中的"IEPE-Continuous Input.vi"來改寫。“程式附在下面”
範例程式中都會用 DAQmx-Timing 來抓取Actual Sample Rate,以對照設定的取樣頻率是否和實際的相同。
但是我在執行程式時,不管是我用改寫完的程式,還是範例程式,我的Actual Sample Rate 都不會是我設定的數值,“如附圖”。
取樣頻率1000時,actual=1651.613 ; 2000時,actual=2048 ;意即設定不同的取樣頻率,actual所顯示的值會不同。
此外,用我改寫的程式去執行時,雖然actual的數值(1651.613)與所設定的數值(1000)不同,取樣點2000,但是輸出所顯示的卻是有2000筆數值。
想請問大大這方面的問題要怎麼去處理?謝謝

ACCELE.vi

先回答你採樣點數的問題,小助手設定的 1000是用於替你的VI設定一個「內部初始值」。「一但外部沒有連線給入samples這個Control,則採用此初始值」。
現在的程式有提供給VI一個外部給入的Control,他的數值是2000,因此Waveform Graph出來就是2000。
一但你砍掉這個外部給入的Control,他就會用小助手的值。

這是NI的小助手與Express VI的遺毒。我當年因為這類問題,讓自己覺得困惑,又覺得自己是不是學錯了。

Note: 盡量不要把負責傳數值給VI的Control,弄得像是接受VI數值的Indicator。否則不容易除錯。

MingYen43030.9538657407
*** 1 ***
請參考NI-9234的Manual,下面這一段代表這張擷取卡內部的internal master timebase是13.1072 MHz
所有的採樣速率會以這個數值去進行除頻(frequency dividing)。依照下圖中的除法關係,組合出所有可以用的採樣頻率。

這個關係式,原因是卡片內部要以Counter記數次數後,才送出一個除頻後的Clock。可以理解成是硬體的極限。

*** 2 ***
一般來說不確定的時候,可以假設試試看板卡是不是使用內部的Counter進行除頻。當然,這邊手冊上已經說明,就是除頻沒錯了。
嘗試計算如下:
Fs = [(FM)13,107,200 Hz / 256] / n = 1651.613
n = 31.000054492283287216715810633261 => n = 31


*** 3 ***
手冊裡面提到n是1~31的整數,代表已經沒有辦法除以更大的整數,使得Fs更低了。因此反算精準一點計算
Fs = [(FM)13,107,200 Hz / 256] / 31 = 1651.6129032258064516129032258065
就已經是最小能達到的Fs。沒有辦法再更低了。這個設備可能是較便宜的設備,一般中階的版卡會配備40MHz or 80MHz的Clock,並且搭配一個U32進行計數,使之最高可除頻計數達2^32,而不是配置一個像是U8的東西,然後又限制讓你只能記數0~31 (2^5)。

如果是連續採樣的情況,每次採樣回送資料時距是Sample Count/Sample Rate,分母Sample Rate受限的情況下,其實不容易選擇同樣也會有一些特殊限制的Sample Count(例如偶數),完美控制每次採樣的回送資料時距。

The frequency of a master timebase (fM) controls the data rate (fs) of the NI 9234. The NI 9234
includes an internal master timebase with a frequency of 13.1072 MHz



374238a_02.pdfMingYen43031.4666203704

感謝MingYen大大的回覆,再用了datasheet上的算是,總算能配出能用的 擷取頻率了!!
只是在取樣點部分的回覆,看過後我還是有點不明白,因此有些事情想確認與詢問:

1.條件: “以取樣頻率設定1000,實際的取樣頻率1651,設定取樣點2000”
雖然理想情況是擷取兩秒的數據,但實際上卻是只有運作卻只有1.2秒,
所以我想問waveform上X軸所呈現的2000,是否代表我已取樣頻率1651在1.2秒內擷取了2000筆數據?
(這應該和大大提到的 “盡量不要把負責傳數值給VI的Control,弄得像是接受VI數值的Indicator。否則不容易除錯。” 應該是互相呼應的吧?
如果是的話,那要如何設定waveform的X軸所呈現的是實際運作時間?
這樣感覺比較不會被自己誤導
謝謝~

沒有時間回答得很仔細。基本上這牽涉到兩種能送給Waveform Graph的資料型態:[1]橘線的1-D Array of Double 與 [2]棕線的Waveform(DBL)

[1]
請看下圖,你目前的訊號就像是輸出給1-D Array of Double的橘線。
這種類型的資料只有一維的Y陣列資料,只能用Array本身的element index編號,來做為橫軸。因此2000筆資料點,橫軸就是1~2000 (counts)。

[2]
你所希望附帶有時間資訊的資料,就是LabVIEW試著要推廣的棕線Waveform(DBL)。
要組成棕線的Waveform(DBL)有三個主要元素,Y,dt,t0。
dt就是每筆counts之間預期的時間差,通常就是Sample Rate的倒數。Y就是原先沒有橫軸資訊的1-D Array資料點。t0通常我們直接送一個無關緊要的Time Stamp Constant即可 (也可以從Gate Date/Time In Seconds取得當下系統時間,但後續的一些修正,只會變得橫軸更複雜)。

我製造了一個棕線的Waveform(DBL),拆開了他又重新組合,這是為了製造範例。





a-1.viMingYen43031.717650463

我懂了~感謝大大每次的耐心回覆

“盡量不要把負責傳數值給VI的Control,弄得像是接受VI數值的Indicator。否則不容易除錯。”


指的是程式風格的issue。程式區負責輸出的Control,盡量讓線走在他右邊出去,而不是左邊。