上はエミッターフォロワーから出る典型的な信号ですが、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がそれぞれの計測時間です。
単にFor-loopを1000回やっても10μSもかかりません。つまり単なるForループが回るためには殆ど(0.01µS程度しか)時間を消耗しないことがわかります。、ところが、このループ内にdigitalReadがあるとたった100回で400µS近くかかることがわかります。つまりdigitalRead1発で4μS近くかかるようです。
次に、Arduinoの永遠Loop処理の中でdigitalReadを行い、その前後でdigitalWriteして時間を取り出すと次のようになります。
1周期になんと15μSから20μSもかかるのがわかります。なぜ永遠Loop処理部分の戻り時間が時々長くなるのかはわかりませんが、とにかくそれほど遅いわけです。上のグラフでHighの部分はArduinoのお仕着せLoop処理の戻り時間であって、ユーザーは何もしていません。内部できっと何かをチェックしていることでしょう。
ですから信号検出の為にLoop部分でdigitalReadをすると、それだけで20µS近くを費やすことがあるため検出漏れをおこすことになります。
つまりArduinoだけで組もうとすると、検出する信号の長さを十分長くする必要があるというわけです。
自作例ではPICから固定長80µSの信号を送ってくるので、とりこぼすことがありませんが、ダブルカウントしないように信号検出後80µS以上たってから次の検出をしています(プログラムは後の回で説明します)。
また、GM管の最小dead time(検出信号間の検知不能時間)は小さくとも95µS以上あるのでこれがちょうどよい長さかと思います。
この連載は「arduinoでのガイガーカウンター」なので、他のマイコンなどなしでやりたいところなのですが、GM管の信号の延長なしではできません。せっかくの簡単なArduino環境なので言語をアセンブラーにはしたくないですし。
信号を取り出すカップリング・コンデンサーを10pFより大きくしていけばかなり延長できますが、その場合はGM管の性能を犠牲にすることになるため、避けていることは前に書きました。オペアンプ等で信号を延ばす方法も考えられますが、マイコンでの固定長への延長のほうがずっと単純ですね。
どなたかもしよいアイデアがあれば教えてください。
なお、Arduinoの処理時間のダメ押し確認がしたく、たった今時間が少しできたところで、他の正確な校正済オシロ(Tektronix)で確認してみました。前のオシロでの測定結果と完全に同じでした。
今回は疑問にお答えするため、とりあえず補足の記事を入れた次第です。
次回は、いっきにArduino側のプログラムを解説したいと思います。
前の記事:
後の記事:
この#5にArduinoのプログラムを載せました。
(c)2018 Akira Tominaga, All rights reserved.