WaveForms SDK

トリガー(Trigger)の扱い

普通に、WaveGen1の出力をScope1につないでWaveFormsで波形を観察すると、

このように“止まって”見えます。下図のTriggerが“Auto”になっているからです。CRT使った古い”オシロスコープ”でもAutoモードはありましたね。

Auto->Noneとかしてみますかね。途端に、

となって止まりません。Triggerをnormalにすれば設定条件で止められます。止めるというよりスイープ(オシロスコープ的観点)というよりADCなのでむしろ変換スタートというべき。Triggerはその条件ですね。ということで、WaveForms SDKでのTriggerを簡単に見ておきましょう。

一歩突っ込んだ設定パネルは、トリガーの右端の▼をクリックするとでてきます。

さてSDK的には、細かい設定が可能ですが、既出のanalogoutin.cppに数行組み込んでみましょうかね?

#include "sample.h"


int main(int carg, char **szarg){
    HDWF hdwf;
    char szError[512] = {0};
    DwfState sts;
    const int nSamples = 1000;
    double* rgdSamples = new double[nSamples];

    printf("Open automatically the first available device\n");
    if(!FDwfDeviceOpen(-1, &hdwf)) {
        FDwfGetLastErrorMsg(szError);
        printf("Device open failed\n\t%s", szError);
        return 0;
    }

    printf("Configure and start first analog out channel\n");
    FDwfAnalogOutEnableSet(hdwf, 0, true);
    // 1 = Sine wave
    FDwfAnalogOutFunctionSet(hdwf, 0, 1);
    FDwfAnalogOutFrequencySet(hdwf, 0, 3000);
    FDwfAnalogOutConfigure(hdwf, 0, 1);

    printf("Configure analog in\n");
    FDwfAnalogInFrequencySet(hdwf, 1000000);
    // set range for all channels
    FDwfAnalogInChannelRangeSet(hdwf, -1, 4);
    FDwfAnalogInBufferSizeSet(hdwf, nSamples);

    // set up trigger
    // disable auto trigger
    FDwfAnalogInTriggerAutoTimeoutSet(hdwf, 0);
    // one of the analog in channels
    FDwfAnalogInTriggerSourceSet(hdwf, trigsrcDetectorAnalogIn);
    FDwfAnalogInTriggerTypeSet(hdwf, trigtypeEdge);
    // first channel
    FDwfAnalogInTriggerChannelSet(hdwf, 0);
    FDwfAnalogInTriggerLevelSet(hdwf, 0.5);
    FDwfAnalogInTriggerConditionSet(hdwf, trigcondRisingPositive);

    printf("Wait after first device opening the analog in offset to stabilize\n");
    Wait(2);

    printf("Starting acquisition\n");
    FDwfAnalogInConfigure(hdwf, true, true);

    printf("Waiting to finish... ");
    while(true){
        FDwfAnalogInStatus(hdwf, true, &sts);
        if(sts == DwfStateDone){
            break;
        }
        Wait(0.1);
    }
    printf("done\n");

    printf("Reading acquisition data\n");
    FDwfAnalogInStatusData(hdwf, 0, rgdSamples, nSamples);
    // do something with the data in rgdSample
    
	for( int i = 0 ; i < nSamples ; i++ )
		printf("%d,%g\n",i,rgdSamples[i]);

    FDwfDeviceCloseAll();
}

ここでTrigger関係を抜き出すと、

 // set up trigger
    // disable auto trigger autoを止める
    FDwfAnalogInTriggerAutoTimeoutSet(hdwf, 0);
    // one of the analog in channels
    FDwfAnalogInTriggerSourceSet(hdwf, trigsrcDetectorAnalogIn); // トリガーソースは信号自体internal
    FDwfAnalogInTriggerTypeSet(hdwf, trigtypeEdge); // トリガータイプはEdge
    // first channel
    FDwfAnalogInTriggerChannelSet(hdwf, 0);
    FDwfAnalogInTriggerLevelSet(hdwf, 0.5); // トリガーレベルは0.5V
    FDwfAnalogInTriggerConditionSet(hdwf, trigcondRisingPositive);// +方向上向き

これでBuild and Run して出力をリダイレクトして、csvへ書き出してExcelから開いて、グラフ書かせると(書くだけでもめんどい)、

out1.csvout2.csvができました。それぞれグラフ書くと、

これはout1.csv

こちらはout2.csvです。スタートが同じで、-0.5Vで下がっていますから一緒ですね。

一般論として周期信号を適切なトリガー条件で止めるのは比較的です。問題は、パルス信号しかも周期もない、ランダムな信号をADCするのが一番困難ですが、事後に何かのイベント(信号)が得られれば、メモリーリフレッシュを止めて、バッファサイズ分遡って観察できます。というかそれしか方法がありません。アナログでやるのはかなり大変ですね。昔の人(筆者も半分くらいはそうです)はそれでもやっていました。高速度現象を高速度カメラ(今はビデオですね)で捉えるのも、対象現象の発生がランダムだと難渋しますけど、事後のイベントが分かれば、ビデオ方式だと捉えられるかもしれません。

コメント