Introduction
Build a 400V high-voltage power supply for a Geiger-Müller tube radiation detector with pulse counting and dose rate display. This comprehensive guide covers everything from design through implementation, testing, and deployment.
Build a 400V high-voltage power supply for a Geiger-Müller tube radiation detector with pulse counting and dose rate display.
Build a 400V high-voltage power supply for a Geiger-Müller tube radiation detector with pulse counting and dose rate display. This comprehensive guide covers everything from design through implementation, testing, and deployment.
Geiger tube: sealed gas-filled cylinder (typically Neon + Halogen at low pressure). Central anode wire (+) surrounded by cathode cylinder. Bias voltage: 400–500V applied. Radiation passes through thin window, ionizes gas → ion avalanche (Townsend discharge) → current pulse detectable externally. Pulse duration: 100µs (recovery time). Quench gas (halogen) prevents continuous discharge (self-quenching). Output pulse: negative-going (~400V) pulse on anode — requires quench resistor (10MΩ) to limit current and voltage divider + coupling capacitor to create MCU-compatible 5V logic pulse.
10 components required for this project.
| # | Component | Purpose | Qty |
|---|---|---|---|
| 1 | SBM-20 or J305 Geiger-Müller Tube | Radiation sensing element (beta/gamma) | x1 |
| 2 | MC34063 boost converter IC | 5V → 400V HV generation | x1 |
| 3 | High-voltage capacitor (0.1µF, 630V) | HV filter capacitor | x2 |
| 4 | Fast-recovery diode (1N4007 × 4) | Voltage multiplier rectifier | x4 |
| 5 | Voltage divider (1MΩ + 10kΩ) for HV sense | Safe HV measurement (÷100) | x1 |
| 6 | Arduino Nano | Pulse counting and display | x1 |
| 7 | OLED 0.96" display (I2C) | CPM, µSv/h display | x1 |
| 8 | Piezo buzzer | Radiation click sound | x1 |
| 9 | Interrupt input (100kΩ pull-up + 4.7kΩ quench) | Tube pulse detection | x1 |
| 10 | HV probe cable (for oscilloscope testing) | HV measurement safety | x1 |
Follow these 3 steps carefully.
Geiger tube: sealed gas-filled cylinder (typically Neon + Halogen at low pressure). Central anode wire (+) surrounded by cathode cylinder. Bias voltage: 400–500V applied. Radiation passes through thin window, ionizes gas → ion avalanche (Townsend discharge) → current pulse detectable externally. Pulse duration: 100µs (recovery time). Quench gas (halogen) prevents continuous discharge (self-quenching). Output pulse: negative-going (~400V) pulse on anode — requires quench resistor (10MΩ) to limit current and voltage divider + coupling capacitor to create MCU-compatible 5V logic pulse.
MC34063 boost converter driven at 50kHz. L1: custom wound on toroidal core (100µH). Switch: N-channel MOSFET (IRFZ44N). Diode: UF4007 (ultrafast, 1A, 1kV). Output: 400–500V adjusted by voltage divider feedback to MC34063 feedback pin. Voltage multiplier (Cockcroft-Walton): cascade of diodes and capacitors multiplies AC to higher DC. Alternative to single-stage boost — fewer inductor turns. Output ripple: typically 5–10V (measure with HV probe before connecting to GM tube). Safety: 400V at any current is lethal — treat all HV nodes with extreme respect.
CPM (Counts Per Minute): raw count rate — depends on tube size and sensitivity. µSv/h (microsieverts per hour): radiation dose rate — biological hazard unit. Conversion: manufacturer-specific. SBM-20: 1 µSv/h ≈ 175 CPM (for Cs-137 gamma). Background radiation: 0.1–0.3 µSv/h (10–50 CPM). Radiation sources: potassium in bananas (~0.01 µSv/h contact), smoke detector (Americium-241, low activity, ~0.01 µSv extra at contact), granite countertop, dental X-ray (50–100 µSv per image but brief). Alert levels: 1 µSv/h = elevated (investigate), 100 µSv/h = evacuate area immediately.
Core code for geiger_counter.ino:
#include <Wire.h> #include <Adafruit_SSD1306.h> #define GEIGER_PIN 2 // Interrupt pin for GM tube pulses #define BUZZER_PIN 8 #define HV_SENSE_PIN A0 // Voltage divider output (HV/100) // SBM-20 tube conversion factor #define COUNTS_TO_USPH 0.00571f // 1 CPM = 0.00571 µSv/h volatile unsigned long pulse_count = 0; unsigned long last_count_time = 0; float dose_rate_usph = 0; float cpm = 0; // Interrupt: called on each Geiger pulse void IRAM_ATTR geiger_pulse() { pulse_count++; // Generate click sound on each radiation event static bool buzzer_state = false; digitalWrite(BUZZER_PIN, buzzer_state = !buzzer_state); } Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { pinMode(GEIGER_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(GEIGER_PIN), geiger_pulse, FALLING); pinMode(BUZZER_PIN, OUTPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); Serial.begin(9600); } void loop() { // Update every 10 seconds for stable reading if(millis() - last_count_time >= 10000) { unsigned long counts_10s = pulse_count; pulse_count = 0; last_count_time = millis(); cpm = counts_10s * 6.0f; // Scale to per-minute dose_rate_usph = cpm * COUNTS_TO_USPH; // Check HV level (should be ~400V, sense = 4.0V with /100 divider) float hv = analogRead(HV_SENSE_PIN) * 5.0f / 1023.0f * 100.0f; // ×100 for actual HV display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0, 0); display.print(dose_rate_usph, 3); display.print(" uSv"); display.setTextSize(1); display.setCursor(0, 20); display.print("CPM: "); display.print(cpm); display.setCursor(0, 35); display.print("HV: "); display.print(hv, 0); display.print("V"); display.setCursor(0, 50); if(dose_rate_usph < 0.5) display.print("Status: NORMAL"); else if(dose_rate_usph < 10) display.print("Status: ELEVATED"); else display.print("ALERT: HIGH RADIATION"); display.display(); Serial.print("CPM:"); Serial.print(cpm); Serial.print(" uSv/h:"); Serial.println(dose_rate_usph); } }
Test High Voltage Power Supply (Geiger Counter) by verifying each subsystem individually before full integration.
Verify power voltages, check ground connections, use serial monitor for debug.
An interactive simulator will be available here — simulate circuits and run code in-browser without hardware.