トリガー(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.csvとout2.csvができました。それぞれグラフ書くと、

これはout1.csv

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


コメント