C/C++によるトリガとイベント計測
Cosmo-Zのトリガには、各チャネルで個別に発生させた「チャネルトリガ信号」と、 チャネルトリガを全体でANDまたはORして生成した「全体トリガ」があります。トリガの仕組みについてはCosmo-Zのトリガについての概要をご覧ください。
トリガ関係の関数
トリガに関する関数は以下のようなものがあります。
チャネルトリガに関するもの
- BOOL csz_trig_set(int ch,TRIGTYPE type, int val);
- BOOL csz_trig_set_voltage(int ch, TRIGTYPE type, double voltage);
- TRIGTYPE csz_trig_gettype(int ch);
- int csz_trig_getadcval(int ch);
- double csz_trig_getvoltage(int ch);
- void csz_trig_set_gcap(int ch, BOOL enable);
- BOOL csz_trig_get_gcap(int ch);
- const char * csz_trig_tostr(TRIGTYPE type);
外部トリガに関するもの
- BOOL csz_exttrig_set(int extch, EXTTRIGTYPE type);
- const char * csz_exttrig_tostr(EXTTRIGTYPE type);
- EXTTRIGTYPE csz_exttrig_get(int extch);
全体トリガに関するもの
- void csz_trig_ortrig(BOOL ortrig);
- BOOL csz_trig_is_ortrig();
トリガのステータス(発生頻度、パルス高さ)の取得に関するもの
- int csz_trig_rate(int ch);
- int csz_trig_pulseheight(int ch);
- int csz_trig_pedestal(int ch);
プレトリガ・ポストトリガに関するもの
- BOOL csz_pretrig_set(int pre);
- void csz_pretrig_type(BOOL extend);
- int csz_pretrig_get();
- int csz_pretrig_max();
- BOOL csz_posttrig_set(int pre);
- int csz_posttrig_get();
- void csz_posttrig_fixed(BOOL fixed);
- BOOL csz_posttrig_is_fixed();
トリガの設定方法
チャネルトリガ設定
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の正弦波は別々の発振器を使っているため、カウントレートが若干異なります。