勝手な電子工作・・

勝手なオリジナル電子工作に関する記事を書きます

Arduinoでの自作ガイガーカウンター解説-#4 信号をArduinoで直接扱えるか?

 

f:id:a-tomi:20181211154052j:plain

SBM-20の信号

上はエミッターフォロワーから出る典型的な信号ですが、GM管が検知するガンマ線β線のエネルギー(eV)などによって信号の長さが少し変わります。GM管の種類と個体差やカップリングコンデンサーの値などによっても違いますから、絶対にとりこぼしなく検知するためには多数の信号を確認のうえ、およそ5~6マイクロ秒以内に検知できるようにしたいものです。

そして、できれば他のマイコンなど介在させずに、Arduinoだけで全処理を完結したいところです。では、もし普通にArduinoで信号を取り出そうとするとどうなるのでしょう?

IDEで次のプログラムを作り、Arduino-UNOで確認すると、それがとても難しいことがすぐわかります。


/*
   Timing test
*/
#define dPin 2
#define tPin 3

void setup() {
  pinMode(dPin, INPUT_PULLUP);
  pinMode(tPin, OUTPUT);
  digitalWrite(tPin, HIGH);

  while (1) {
    if (digitalRead(dPin) == LOW) break;
  }
  
  // *** Test #1 simple for-loop 1000 times
  delay(1000);
  // measure simple loop
  digitalWrite(tPin, LOW);
  for (int i = 0; i < 1000; i++) {
  }
  digitalWrite(tPin, HIGH);
  delayMicroseconds(10);
    //*** Test #2 loop 100 times with digitalRead inside
    digitalWrite(tPin, LOW);
  for (int i = 0; i < 100; i++) {
    int k=digitalRead(dPin);
  }
  digitalWrite(tPin, HIGH);
// ***** end of Test #1 to #2 end

  while (1) {
    if (digitalRead(dPin) == LOW) break;
  }
  delay(1000);
}

// *** Test #3 loop with digitalRead inside
void loop() {
  digitalWrite(tPin, LOW);
  int k=digitalRead(dPin);
  digitalWrite(tPin, HIGH);
}

 このプログラムのtPinをオシロで観察すると、Test#1,Test#2の結果は次のようになります。Lowがそれぞれの計測時間です。

f:id:a-tomi:20181211155337j:plain

単なるループ1000回とdigitalReadを含むループ100回

単にFor-loopを1000回やっても10μSもかかりません。つまり単なるForループが回るためには殆ど(0.01µS程度しか)時間を消耗しないことがわかります。、ところが、このループ内にdigitalReadがあるとたった100回で400µS近くかかることがわかります。つまりdigitalRead1発で4μS近くかかるようです。

次に、Arduinoの永遠Loop処理の中でdigitalReadを行い、その前後でdigitalWriteして時間を取り出すと次のようになります。

f:id:a-tomi:20181211160248j:plain

Loopルーチンの中での処理

1周期になんと15μSから20μSもかかるのがわかります。なぜ永遠Loop処理部分の戻り時間が時々長くなるのかはわかりませんが、とにかくそれほど遅いわけです。上のグラフでHighの部分はArduinoのお仕着せLoop処理の戻り時間であって、ユーザーは何もしていません。内部できっと何かをチェックしていることでしょう。

ですから信号検出の為にLoop部分でdigitalReadをすると、それだけで20µS近くを費やすことがあるため検出漏れをおこすことになります。

f:id:a-tomi:20181213130422j:plain

Uno互換機での測定の様子

つまりArduinoだけで組もうとすると、検出する信号の長さを十分長くする必要があるというわけです。

自作例ではPICから固定長80µSの信号を送ってくるので、とりこぼすことがありませんが、ダブルカウントしないように信号検出後80µS以上たってから次の検出をしています(プログラムは後の回で説明します)。

また、GM管の最小dead time(検出信号間の検知不能時間)は小さくとも95µS以上あるのでこれがちょうどよい長さかと思います。

この連載は「arduinoでのガイガーカウンター」なので、他のマイコンなどなしでやりたいところなのですが、GM管の信号の延長なしではできません。せっかくの簡単なArduino環境なので言語をアセンブラーにはしたくないですし。

信号を取り出すカップリング・コンデンサーを10pFより大きくしていけばかなり延長できますが、その場合はGM管の性能を犠牲にすることになるため、避けていることは前に書きました。オペアンプ等で信号を延ばす方法も考えられますが、マイコンでの固定長への延長のほうがずっと単純ですね。

どなたかもしよいアイデアがあれば教えてください。

 

なお、Arduinoの処理時間のダメ押し確認がしたく、たった今時間が少しできたところで、他の正確な校正済オシロ(Tektronix)で確認してみました。前のオシロでの測定結果と完全に同じでした。

f:id:a-tomi:20181213110428j:plain

f:id:a-tomi:20181213110442j:plain

 

今回は疑問にお答えするため、とりあえず補足の記事を入れた次第です。

次回は、いっきにArduino側のプログラムを解説したいと思います。

 

前の記事:

a-tomi.hatenablog.com

a-tomi.hatenablog.com

a-tomi.hatenablog.com

後の記事:

この#5にArduinoのプログラムを載せました。

a-tomi.hatenablog.com

a-tomi.hatenablog.com

 

(c)2018 Akira Tominaga, All rights reserved.