C/C++によるトリガとイベント計測

Cosmo-Zのトリガには、各チャネルで個別に発生させた「チャネルトリガ信号」と、 チャネルトリガを全体でANDまたはORして生成した「全体トリガ」があります。トリガの仕組みについてはCosmo-Zのトリガについての概要をご覧ください。

トリガ関係の関数

トリガに関する関数は以下のようなものがあります。

チャネルトリガに関するもの

外部トリガに関するもの

全体トリガに関するもの

​​トリガのステータス(発生頻度、パルス高さ)の取得に関するもの

プレトリガ・ポストトリガに関するもの

トリガの設定方法

チャネルトリガ設定

CH1の電圧が-0.1Vを下向きに横切った(FALL)ときにトリガを発生させるには以下のようにします。

csz_trig_set_voltage(1,TRIGTYPE_FALL, -0.1);

 

CH2のADCが9000以上になった(UPPER)ときにトリガを発生させるには以下のようにします。

csz_trig_set(2,TRIGTYPE_UPPER, 9000);

このように、電圧でもADC値でもどちらでも閾値を設定することが可能です。

なお、トリガを発生させたくないチャネルについてはTRIGTYPE_OFFを設定します。

 

トリガ条件として使用可能な条件は以下のとおりです。

TRIGTYPE_OFF トリガは発生しない
TRIGTYPE_UPPER 指定値以上ならトリガ発生
TRIGTYPE_LOWER 指定値以下ならトリガ発生
TRIGTYPE_CROSS 指定値を横切ったらトリガ発生
TRIGTYPE_DISCRI 通常の値より指定値分下回ったらトリガ発生
TRIGTYPE_RISE 指定値を横切って立ち上がったらトリガ発生
TRIGTYPE_FALL 指定値を横切って立ち下がったらトリガ発生
TRIGTYPE_LINKAGE 他のチャネルがヒットしたらトリガ発生
TRIGTYPE_USER ユーザ定義による

 

外部トリガ

外部トリガはCosmo-Zに入力されるディジタル入力のトリガで、csz_exttrig_set関数を通じて設定可能です。FPGAの設計次第で外部入力端子を使うこともできるほか、ロックインアンプの同期出力やDACの同期出力を接続することもできます。

設定の例は以下のようになります。チャネル番号は0~3となります。

csz_exttrig_set(0,EXTTRIGTYPE_RISE)

トリガ条件として使用可能な条件は以下のとおりです。

EXTTRIGTYPE_OFF トリガは発生しない
EXTTRIGTYPE_RISE 立ち上がったらトリガ発生
EXTTRIGTYPE_FALL 立ち下がったらトリガ発生

EXTTRIGTYPEHIGH

Hレベルでトリガ発生

 

全体トリガ

全体トリガ(AND/OR)を設定するにはcsz_trig_ortrig(bool ortrig)関数を使用します。

この関数の引数にtrueを与えると、全体トリガがORトリガとなります。この場合、どれか1つのチャネルトリガが発生した場合に全体トリガが発生します。

関数にfalseを与えると、ANDトリガとなります。この場合はすべてのチャネルのトリガが同時に満たされた場合に全体トリガが発生します。デフォルトはANDトリガです

csz_trig_ortrig(false);

 

例えば、CH1とCH2の電圧が閾値を上回った場合に全体トリガを発生させたいような場合、CH1とCH2にUPPERトリガを設定して全体をANDにします。RISEの条件は1クロック分しか発生しないので、CH1とCH2の信号に時間差があるとANDトリガはほぼ発生しなくなります。

もし、片方のチャネルに発生する信号の時間が長く、もう片方の信号が短い場合、長いほうをUPPER(LOWER)にして、短いほうをRISE(FALL)にすることも可能です。

RISEかUPPERか、FALLかLOWERかの使い分けは測定対象によって異なるので、よく検討してください。

トリガ設定の例

csz_trig_set_voltage(1,TRIGTYPE_FALL, -0.1); // CH1を-0.1を閾値としてFALL条件
for(int ch = 1 ; ch < 8 ; ch++) { // CH2-8はトリガオフ
    csz_trig_set_voltage(ch + 1,TRIGTYPE_OFF, 0);
}
csz_trig_ortrig(false); // 全体をANDトリガにする

 

トリガ発生のステータス

以下の関数を使うとトリガの状況を調べることができます。

  • int csz_trig_rate(int ch)・・・1秒間のトリガ発生回数を返す
  • int csz_trig_pulseheight (int ch)・・・1秒間で発生した最大のパルスの高さを返す
  • int csz_trig_pedestal (int ch)・・・トリガが発生していないときのADC値を返す

 

トリガの設定と、トリガのカウントレートを1秒ごとにモニタするプログラムの例を示します。

for(int ch = 0 ; ch < 8 ; ch++) { // 不要なチャネルはトリガオフ
    csz_trig_set_voltage(ch + 1,TRIGTYPE_OFF, 0);
}
csz_trig_set_voltage(1,TRIGTYPE_FALL, 0); // CH1を0Vを閾値としてFALL条件
csz_trig_set_voltage(2,TRIGTYPE_FALL, 0); // CH2を0Vを閾値としてFALL条件
csz_trig_set_voltage(3,TRIGTYPE_FALL, 0); // CH3を0Vを閾値としてFALL条件
csz_trig_set_voltage(4,TRIGTYPE_FALL, 0); // CH4を0Vを閾値としてFALL条件
csz_trig_ortrig(false); // 全体をANDトリガにする
printf("TRIG RATE\n");
for(int ch=0 ; ch < 4 ; ch++) {
    printf("CH%d\t",ch + 1);
}
printf("\n");
while(1) 
{
    for(int ch=0 ; ch < 4 ; ch++) {
        printf("%d\t",csz_trig_rate(ch + 1));
    }
    printf("\n");
    usleep(1000000);
}

 

実行結果は以下のとおりです。

root@cszmini:/home/share# ./csztest
TRIG RATE
CH1     CH2     CH3     CH4
69      13      96576   96588
72      1       99984   100001
92      0       99983   100002
54      0       99984   100001
65      0       99983   100000
45      0       99983   100001
57      0       99983   100002
60      0       99983   100001

この例では、CH1には放射線検出器のシンチレータを接続し、CH3とCH4には10kHzの正弦波を入力しています。CH3とCH4の正弦波は別々の発振器を使っているため、カウントレートが若干異なります。