Arduino Geigerzähler

Begonnen von stoppi, 09. Januar 2020, 14:04

⏪ vorheriges - nächstes ⏩

stoppi

Hallo!

Meinen Arduino-Geigerzähler (ich habe eine Abneigung gegen kommerzielle Produkte bzw. sehe es als Herausforderung, meine Geräte selbst zu bauen) habe ich zuerst mit einem SBM-20 betrieben. Nun bin ich auf den ebay-kleinanzeigen auf das Endfensterzählrohr ZP1401 gestoßen. Dieses habe ich mir über die Feiertage gekauft und sogleich verbaut. Damit ich beim Messen flexibler bin, schließe ich das Zählrohr über ein BNC-Kabel an.

Dabei stellte ich leider fest, dass der Geigerzähler auf Berührung des Zählrohrs mit Störungen reagiert und zudem die Zählrate bei Verwendung von Am-241 (alpha-Strahler) bei maximaler Annäherung einbricht. Am Oszilloskop sah man dies auch, indem die vielen Pulse verschwanden.

Nun habe ich meine Schaltung ein wenig abgeändert (HV liefert nach wie vor ein CCFL-Inverter), sodass nun obige zwei Probleme behoben werden konnten.

Habe den Geigerzähler dann mittels Americium und Strontium auf seine Tauglichkeit hin überprüft und erhalte maximale Zählraten von mehr als 40000 cpm  :o

Gekostet hat mich der Spaß (von der Arbeitszeit einmal abgesehen) rund 50 Euro (also der komplette Geigerzähler inkl. Arduino und Zählrohr)


#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!

// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5

const int buttonPin = 10;
const byte interruptPin = 2;
volatile long pulse = 0;
volatile long pulse_min = 0;
long time_sec = 0;
long time_min = 0;
long time_min_old = 0;
long time_hour = 0;
long Anzeige_second = 0;
long Anzeige_minute = 0;
long Anzeige_hour = 0;
long millis_reset = 0;
int buttonState = 0;


// ===========================
// =======   SETUP   =========
// ===========================

void setup()
   {
    Serial.begin(9600);
   
    pinMode(interruptPin, INPUT_PULLUP);
    pinMode(buttonPin, INPUT);
   
    //pinMode(interruptPin, INPUT);
   
    attachInterrupt(digitalPinToInterrupt(interruptPin), Puls, RISING);
   
    lcd.init();        // initialize the lcd
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("Geigerzaehler");
    lcd.setCursor(0,1);
    lcd.print("Version 1.0");
   
    delay(3000);
   
    lcd.setCursor(0,0);
    lcd.print("             ");
    lcd.setCursor(0,1);
    lcd.print("            ");
       
   }


// ===========================
// =======    LOOP   =========
// ===========================

void loop()
   {
    time_sec = (millis() - millis_reset) / 1000;
    time_min = ((millis() - millis_reset) / 60000);
    time_hour = ((millis() - millis_reset) / 3600000);
   

    Anzeige_second = time_sec - time_min * 60;
    Anzeige_minute = time_min - time_hour * 60;
    Anzeige_hour = time_hour;
   
    delay(100);
   
    Serial.print(Anzeige_hour);
    Serial.print("   ");
    Serial.print(Anzeige_minute);
    Serial.print("   ");
    Serial.print(Anzeige_second);
    Serial.print("   ");
    Serial.println(pulse);
   
    if (time_min > time_min_old)     // "Minutensprung"
       {
        Serial.println();
        Serial.print(pulse_min);
        Serial.println();
       
        lcd.setCursor(8,1);
        lcd.print(pulse_min);
        lcd.print(" CPM    ");
   
        pulse_min = 0;
       }
   
   
    lcd.setCursor(0,0);
    lcd.print(Anzeige_hour);
    lcd.print(" h ");
    lcd.print(Anzeige_minute);
    lcd.print(" min ");
    lcd.print(Anzeige_second);
    lcd.print(" sec  ");   
   
    lcd.setCursor(0,1);
    lcd.print(pulse);
   
   
    buttonState = digitalRead(buttonPin);

    if (buttonState == HIGH)    // Reset-Knopf gedrückt
       {
        millis_reset = millis();
       
        pulse = 0;
        pulse_min = 0;
               
        lcd.setCursor(0,1);
        lcd.print(pulse);
        lcd.print("       ");
               
        lcd.setCursor(8,1);
        lcd.print("-");
        lcd.print(" CPM    ");
       }
   
    time_min_old = time_min;    // Werteübergabe
   }


// ==============================
// =======   INTERRUPT  =========
// ==============================

void Puls()
   {
    pulse = pulse + 1;
    pulse_min = pulse_min + 1;
   }

DG0MG

Die Schaltung ist "problematisch": Der Strom durch das Zählrohr ist viel zu hoch, das ist der Lebensdauer des Zählrohrs stark abträglich.

Schau Dir den letzten 10nF-Kondensator gegen Masse nach dem 5-MOhm-Widerstand an. Wenn das Zählrohr zündet, entlädt der sich über das 10k-Poti oder/und die B-E-Strecke des Transistors, ohne dass irgendeine weitere wirksame Strombegrenzung vorhanden wäre.

Der fließende Strom könnte I = U / R , 500V / 1k = 0,5 A (sic!)  :o sein, der zulässige Strom für Zählrohre liegt irgendwo im µA-Bereich.
An die Anode des ZR gehört ein weiterer 5-MOhm-Widerstand oder der 10nF muss weg.

Zu beachten weiterhin: Wenn man ein Zählrohr mit Koaxkabel abgesetzt anschließt, bildet das Kabel eine Kapazität. Bei RG58 liegt diese bei ca. 1pF pro Zentimeter. Hat man also einen Meter Kabel dran, sind das 100 pF, die auf 500 V aufgeladen werden, und sich durch das Zählrohr entladen, wenn es zündet. Der o.a. 5-MOhm-Widerstand gehört also DIREKT ANS ZÄHLROHR, damit er den Strom durchs Zählrohr, verursacht durch die Kabelkapazität, begrenzt.

"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

stoppi

Hallo!

Vielen Dank für den wertvollen Hinweis, du hast natürlich völlig recht.  :good: So entlädt sich der an der Anode direkt hängende und im schlimmsten Fall auch auf 500V geladene Kondensator direkt übers Zählrohr und den dann viel zu geringen Basiswiderstand bzw. den 10kOhm-Poti.

Habe das gleich geändert und die Schaltung nochmals (nun ohne besagten Kondensator) getestet. Und siehe da, sie funktioniert auch so und reagiert weiterhin nicht auf Berührungen der Kathode des Zählrohrs.

Diese Empfindlichkeit habe ich mir vermutlich deshalb früher eingefangen, da sich in der ursprünglichen Schaltung an der Stelle des 10kOhm-Potis ein sehr viel höherer Widerstand befand, was Einstreuungen natürlich begünstigt...

sh4711

BNC-Kabel... Wie lang ist das denn und wo ist der Anodenwiderstand? Wenn
er an der Anode ist, ists ja gut; aber wenn Du ihn im Geraet hast, erhoest
Du die nominell 1,1 pF des ZRs um Groessenordnungen. Bei BG kann Dir das
wurscht sein (das ZR wir dann trotzdem aelter als Du) aber unter Last
verkuerzt sich die Lebenserwartung des ZR dementsprechend...

Lordcyber

Wo hast du den den ZP1401 her?
Ich finde die nur für 130 150€
Danke

stoppi

Hallo!
Steht eigentlich alles im Text bzw. Ist sogar abgebildet. War ein privates Angebot auf ebay Kleinanzeigen...

sh4711

Das ZP1401 bekommt man mit viel Glueck bei Centronic selber. "Viel Glueck", weil
sie nicht sehr geschaeftfreudig sind (entweder geistig schon ge-brexited oder
wegen Reichtum geschlossen).

Vor 2 Jahren haben 30 Stueck knapp 1700 GBP gekostet. Ein einzelnes lag bei 70 GBP.

Hinweis: Lass Dir bloss nicht das schrottige N205 (war 2011 der heisse ZP1401-Nach-
folger) andrehen (ausser geschenkt). Das taugt nur um es der Katze zum Spielen zu
geben (die sich dann erschreckt wenn das Fenster knallt ;-)).