Как стать автором
Обновить

Алгоритмы программы для дозиметра на счетчике Гейгера

Уровень сложностиПростой
Время на прочтение17 мин
Количество просмотров7.3K

Счетчик Гейгера довольно простой датчик с точки зрения его устройства и с точки зрения обработки сигналов с него. Кроме того, энергопотребление счетчиков Гейгера ничтожно. Поэтому они широко используются в бытовых дозиметрах.

Самый распространенный советский счетчик Гейгера СБМ-20
Самый распространенный советский счетчик Гейгера СБМ-20

Счетчики Гейгера предназначены для регистрации Бета и Гамма частиц. Иногда говорят, что можно зарегистрировать и Альфа частицы. Это так, но практическое использование этой опции достаточно ограничено.

Немного о механизме регистрации частиц счетчиком Гейгера (в спойлере)

Hidden text

Наиболее распространены в природе и при радиоактивном распаде альфа, бета и гамма лучи. Это их историческое название. Как потом выяснилось это ядра гелия, электроны и фотоны. Но, давайте, отдавая дань первооткрывателям, сохраним эти названия для названия самих частиц (хоть это немного и некорректно).

Эту картинку про проникающее излучение видели наверное все :)
Эту картинку про проникающее излучение видели наверное все :)

Гамма частицы (фотоны) выбивают из стенок счетчика заряженные электроны, которые, пролетая в газе счетчика, создают ионизационный трек из заряженных частиц газа и вторичных электронов.

Гамма частицы легкие (масса покоя у них вообще нулевая), они не заряжены, поэтому большинство из них пролетают через счетчик не среагировав со стенками и не выбив электрон. В среднем только несколько процентов (1 — 4%) гамма частиц регистрируется счетчиком и дает импульс. Процент зависит от энергии Гамма частиц.

Бета частицы — это и есть электроны. Они без предварительных трансформаций, только потеряв часть энергии на преодоление стенок счетчика, попадают внутрь и, в результате там происходит тот же процесс ионизации внутреннего газа, как и от вторичных электронов от Гамма‑частиц.

Бета частицы заряжены. Из‑за этого их проникающая способность хуже, чем у Гамма частиц. Им требуется достаточно энергии, что бы проникнуть через стенки счетчика, но, попав внутрь, они с почти 99% вероятностью будут зарегистрированы.

Металлическую стенку счетчика преодолевают только Бета частицы с достаточно большой энергией, так называемое жесткое Бета излучение. Для регистрации же низкоэнергетичных Бета частиц (мягкого Бета излучения) используются модели счетчиков Гейгера с тонким слюдяным окном, в котором электрон теряет значительно меньше энергии, чем в металле.

Альфа частицы — кучка из 2х протонов и 2х нейтронов, они положительно заряжены и, кроме того, в 7344 раза тяжелее электрона. Если бы они попали внутрь счетчика, то тоже создали там ионизацию в газе и были бы зарегистрированы.

Но из‑за своей «огромной» массы и заряженности Альфа частицы в веществе ведут себя, как слон в посудной лавке — сталкиваются с молекулами вещества и быстро теряют энергию. В воздухе, например, альфа частицы застревают уже примерно через 2–10 см в зависимости от энергии. А в металле пробегают всего около 40 микрон. Поэтому проникнуть внутрь счетчика через металлическую или стеклянную стенку шанса у Альфа частиц нет. Что бы хоть как‑то зарегистрировать Альфа частицу счетчиком Гейгера можно использовать модели с окном из тонкой слюды. Потеряв часть энергии на преодоление воздуха от источника до слюды, Альфа частице потребуется еще много энергии, что бы пробиться через саму слюду внутрь. Следовательно, для обнаружения радиоактивного источника Альфа частиц необходимо подносить счетчик Гейгера слюдяным окном максимально близко к подозрительному месту. И потом еще какое‑то время ждать набора статистики. Эффективность такого процесса для поиска Альфа источников бытовым дозиметром со счетчиками Гейгера со слюдяным окном очень низкая. Иногда дозиметры с такими счетчиками используют для проверки наличия или отсутствия загрязненности поверхности подозрительного объекта радиоактивными изотопами, излучающими Альфа‑частицы.

Вернемся к Бета и Гамма лучам.

Итак, вторичные электроны от 1–4% гамма частиц и 99% бета частиц (они же электроны) попали внутрь счетчика Гейгера, где находится инертный газ (обычно Аргон+Неон). При пролете через него электроны производят вокруг своего трека ионизацию молекул газа, т. е. разрывают эти молекулы на заряженные частицы. Один влетевший быстрый электрон создает внутри еще кучу медленных электронов и ионов.

Эти вторичные заряженные частицы начинают притягиваться: отрицательные электроны к положительно заряженной проволочке в центре счетчика, а положительные ионы — к отрицательной наружной стенке. По дороге они ускоряются, снова сталкиваются с газом и создают вторичную ионизацию и так по нарастающей возникает «лавина» заряженных частиц, которая фактически есть искровой пробой внутри счетчика Гейгера. И в результате проседание (уменьшение) напряжения на электродах счетчика. Что бы пробой от влетевшей частицы не стал постоянным свечением (как у неоновых лампочек), он гасится высокомолекулярными добавками в газе счетчика (спирт, бром и т. д.).
Эти высокомолекулярные добавки тормозят и поглощают свободные электроны, пробой прерывается, просевшее напряжения восстанавливается и в результате на входных цепях регистрирующей схемы получается отрицательный импульс амплитудой около 50 вольт и длительностью несколько микросекунд.

Счетчик Гейгера имеет очень простую конструкцию
Счетчик Гейгера имеет очень простую конструкцию

Более подробное описание процессов происходящих в счетчиках Гейгера можно легко найти в интернете.

Итак Счетчик Гейгера дает импульс 50 вольт от одного электрона! Вот оно преимущество! Простота конструкции и хороший импульс, который легко регистрировать.

Однако есть и недостатки. Основным из которых является то, что счетчик выдает одинаковый импульс независимо от энергии и типа влетевшей частицы. Схема регистрации видит только щелчок и понять, что это была за частица и с какой энергией невозможно.

Разные частицы различаются по разрушающей способности на организм человека. И чем больше энергия частицы, тем естественно больше эти разрушения. Считается, что Гамма и Бета излучения примерно одинаковы по воздействию на ткани человека при одинаковой энергии. В то время как Альфа частицы травмируют ткани в 20 раз сильнее.

Именно степень травматичности для человека и измеряется большинством бытовых дозиметров. Она называется мощность амбиентной дозы поглощенного излучения. Означает дозу разрушений, которую получил бы «идеальный сферический человек», находясь в месте нахождения дозиметра в течение часа. Обычно измеряется в микро Зивертах в час или раньше в микро Ренгтенах в час. Второй вариант примерно в 100 раз больше. Т.е. 100 мкР/ч = 1 мкЗв/ч.

Как же часто прилетают частицы в счетчик Гейгера?

Если рядом нет радиоактивного источника, то при обычном фоне наиболее распространенный счетчик СБМ-20 регистрирует в среднем 1 частицу в 3 секунды.

Преобразовываем импульсы в микрозиветы в час

Если мы хотим измерить яркость света например для фотоаппарата или для датчика движения — мы ставим фотосенсор, реагирующий на свет. На него в долю секунды падают «Триллиарды» световых фотонов и через механизм фотоэффекта на выводах этого датчика создается какое‑то напряжение, пропорциональное световому потоку. Это напряжение в привычной временной реальности постоянно при постоянной освещенности и мгновенно реагирует на изменение освещенности. Его легко регистрировать и пересчитать‑перевести в мощность светового потока.

Счетчик Гейгера же дает не какой‑то постоянный сигнал, а всего лишь импульс от каждой пролетевшей частицы. На фоне это примерно 1 раз в 3 секунды, но далеко не равномерно. Может 3 импульса в секунду и потом 10 секунд тишины.

И из этих случайных импульсов схема регистрации должна как‑то вычислить показания в мкЗв/час или в мкР/час. Как?

Самое тривиальное решение, которое нередко использовалось в доисторических дозиметрах на счетчиках Гейгера СБМ-20 — это просто посчитать количество импульсов за 45 секунд и отобразить это число, приписав к нему мкР/ч.

Потом запустить счет снова. И через 45 секунд отобразить новое значение.

Этот дозиметр на микросхемах жесткой логики работал как раз по такому алгоритму
Этот дозиметр на микросхемах жесткой логики работал как раз по такому алгоритму

Почему 45 секунд? Этот период удачного совпадения количества зарегистрированных счетчиком импульсов и микроРенгенов/час. Вычислить его довольно просто. Справочная чувствительность СБМ-20: 22 импульса в секунду при нахождении счетчика в потоке радиоактивных частиц мощностью 1000 микро Ренген в час. Сколько секунд нужно подождать, что бы счетчик насчитал 1000 импульсов, т. е. что бы число импульсов совпало с 1000 микрорентгенами в час?

Т = 1000/22 = 45 секунд.

Для дозиметров с другими счетчиками Гейгера других размеров и чувствительностей период времени, когда количество зарегистрированных частиц примерно совпадает с мощностью дозы в микорентгенах в час, будет естественно другое.

Например, для более мелкого счетчика СБМ-21 справочная чувствительность 420 импульсов в секунду при 40 микрорентгенах в секунду. Переведем сначала секунды в часы:

40 мкР / сек – это 40*3600 = 144000 мкР / час.

И период совпадения Т = 144 000 / 420 = 340 сек. За это время количество зарегистрированных импульсов примерно совпадет с мощностью дозы в мкР/час. И можно просто подсчитать количество импульсов за 340 секунд и отобразить его на дисплее, приписав единицу измерения мкР/ч (или поделить число импульсов на 100 и приписать мкЗв/час).

Однако ждать 340 секунд и даже 45 до первого показания – это несовременно.

Такой алгоритм использовался потому, что элементная база прошлого века была недостаточно развитой, процессоры в дозиметры тогда не ставили, и поэтому на простых логических микросхемах реализовывалась эта стратегия подсчета импульсов до того момента, когда это количество просто совпадало с микроРентегами в час.

Сейчас в дозиметрах во всю используются микроконтроллеры. И можно написать программу, реализующую более удобные для потребителя стратегии.

Фрейм программы для дозиметра будет выглядеть вот так:

//Стартовые установки микроконтроллера, переменных,
//настройки портов ввода-вывода, таймеров и т.д.

main 
{
if (Radiation != RadiationOld) {Вывод Radiation на дисплей; RadiationOld=Radiation;}
sleep;
}


// ===============  прерывания =================== // 

INT_pin ()   // Прерывание по приходу импульса со счетчика Гейгера
  {Count++;}


INT_timer ()   //Ежесекундные прерывание Таймера, работающего исключительно для подсчета импульсов
  {
  Time++;
  if (условие перехода в подпрограмму вычисления показаний, например: Time>4) 
    { вызов подпрограммы вычисления Radiation; и потом обнулить: Time=Count=0; }
  }

Здесь нет обработки кнопок, вывода на дисплей вспомогательной информации и пр. Это вне темы и строится обычно примерно по той же схеме.

Не хочу 45 секунд

Во‑первых, целесообразно уйти от жесткой привязки к периоду 45 секунд (или любому другому фиксированному периоду подсчета статистики). Счетчики даже одного типа могут иметь разброс чувствительности и, соответственно, разброс этого периода. Можно выпускать модели дозиметров с разными типами счетчиков, у которых этот период другой.

Для реализации этой задачи нужно нормировать подсчитанное количество импульсов до CPS (counts per second, количество импульсов в секунду).

И ввести в программу константу чувствительности счетчика SENS такую, что

// подпрограмма вычисления Radiation:
Radiation = CPS * SENS;
где CPS = Count / Time;

Константу SENS можно зашивать в программу или ПЗУ при программировании микроконтроллера исходя из реальной чувствительности используемого счетчика.

А можно даже предусмотреть в программе режим калибровки дозиметра для определения SENS уже в сборе.

Для калибровки дозиметра помещаем его в равномерное радиоактивное поле известной мощности и позволяем посчитать количество импульсов за какой‑то период, достаточно длительный для уменьшения погрешности. Например 10 — кратный период совпадения микрорентгенов и импульсов (450 сек). При мощности поля например 5 мкЗв/ч дозиметр на СБМ-20 насчитает около 5000 импульсов и погрешность раcсчитанной SENS получится всего около 1,5%.

// Формула для расчета SENS:
SENS = FixedRadiation / CPS; 
// и потом записываем SENS в ПЗУ (EEPROM) и считываем при каждом запуске дозиметра.
// В приведенном выше примере: SENS = 5 мкЗв/ч / (5000/450)  = 0.45; 

С пересчетом импульсов в микрозиверты разобрались.

Скользящее среднее

Но осталась проблема ожидания показаний. Для более-менее приемлемого набора статистики время ожидания на фоне все равно остается несколько десятков секунд. Можно сократить срок ожидания первых показаний и смены показаний используя принцип скользящего среднего. Разбиваем период накопления статистики на несколько равномерных интервалов, например 10 интервалов по 5 секунд и для каждого интервала держим одну ячейку массива количества импульсов за это время Counts[i].

Скользящее среднее по линейному массиву данных
Скользящее среднее по линейному массиву данных

При первом включении последовательно каждые 5 сек записываем в ячейки этого массива насчитанное количество импульсов за этот интервал времени, а после заполнения всех 10 ячеек продолжаем по кругу – стираем самое старое показание и заменяем его на последнее.

И каждые 5 секунд считаем новое среднеарифметическое от всех чисел в массиве. Ну или просто постоянно держим переменную с этой суммой и вычитаем из нее самое старое значение и прибавляем самое последнее. В результате имеем смену показаний каждые 5 секунд, что добавляет динамику измерениям:

// подпрограмма вычисления Radiation вызывается каждые 5 сек по таймеру:
{
i++;  Если i>9, то i=0;  // по кругу
SUMofCounts = SUMofCounts - Counts[i];    // удаляем из суммы самое старое значение
Counts[i] = Count; // записываем в ячейку насчитанное кол-во импульсов за последние 5 сек;
SUMofCounts = SUMofCounts + Counts[i];    // добавляем в сумму это последнее значение


// В первые 9 периодов после включения дозиметра 
// для вычисления среднеарифметического CPS делим
// сумму импульсов на прошедшее с момента включения время:
CPS = SUMofCounts / (i*5sec);

// А начиная с 10-го – на весь период:
CPS = SUMofCounts / (10*5sec);


// И, соответственно, результат:
Radiation = CPS * SENS;
}

Однако следует понимать, что результат показаний всегда отстает от реальности на половину максимального периода (5*5 сек). т. е. среднее показание, которое видим на дисплее соответствует середине периода усреднения, находящегося в данном случае 25 секунд тому назад. И этот момент невозможно улучшить при такой стратегии и при невысокой радиации.

В описанном выше алгоритме время интервала и количество интервалов фиксировано: 10 по 5 сек. Можно сделать 8 ячеек по 6 сек. Или 16 ячеек по 3 сек. и т. д. Важно, что бы весь период давал возможность набрать достаточную статистику даже при низкой радиации (на фоне). Поскольку попадание частиц в счетчик Гейгера и, соответственно, импульсы с него есть процесс с математической точки зрения случайный, то среднеквадратичное отклонение определяющее погрешность показаний будет равно плюс‑минус квадратному корню из количества импульсов. При 15 импульсах получаем плюс‑минус 3.87, т. е. погрешность 25%. При 100 импульсах — плюс‑минус 10, т. е. 10% и т.д.

Ускорение показаний при увеличении радиации

При увеличении радиации количество импульсов со счетчика в единицу времени и за весь период будут возрастать. Соответственно будет уменьшаться (улучшаться) погрешность результата измерений. И начиная с какого‑то момента можно пожертвовать дальнейшим улучшением статистики ради ускорения реагирования дозиметра на изменение радиации. Выдавать измененные показания не раз в 5 сек, а чаще.

Для этого целесообразно сделать временнЫе интервалы не фиксированными. Это позволит реагировать на изменение радиации быстрее. Например дозиметр попал в более мощное радиационное поле и нужно оперативно отобразить его увеличение и далее чаще изменять показания на дисплее.

При подсчете количества импульсов Count в каждом интервале времени Time добавим условие на ускорение, если импульсов становится больше. т. е. прерываем длительность интервала подсчета Time по достижению некого порогового количества импульсов. Например:

INT_timer ()   // Каждую секунду по таймеру:
{
Time++;
if (Time >= 5 сек  ИЛИ Count >= 4 имп ) {подпрограмма вычисления Radiation}

// Или более адаптивный вариант:
if (Time >= 5 сек  ИЛИ (Time * Count) >= 10 ) {подпрограмма вычисления Radiation}
...

Если дозиметр уже насчитал 10 импульсов в первую секунду, или 5 во вторую и т.д., то не дожидаясь 5 секунд он рассчитает новое значение Radiation и отобразит его на дисплее. Таким образом скорость изменения показаний на дисплее будет зависеть от радиации. Чем она мощнее, тем быстрее будут меняться показания без ущерба погрешности.

Для корректного вычисления Radiation при переменных интервалах одновременно с подсчетом импульсов и записыванием их в массив Counts[i] нужно держать массив такой же размерности интервалов времени Times[i], за которые насчитаны эти импульсы и также накапливать и обновлять их по кругу. И тогда:

// подпрограмма вычисления Radiation:
Radiation = CPS * SENS;   
где: CPS = Sum (Counts[i]) / Sum (Times[i]);  // если считаете среднее кадждый раз
или: CPS = SUMofCounts / SUMofTimes;  // если используете переменные для сумм

Далее для супероперативного отображения резких скачков радиации необходимо предусмотреть “аварийный” перезапуск набора статистики:

// подпрограмма вычисления Radiation:
...
if (CPS0 последнего замера *СИЛЬНО ОТЛИЧАЕТСЯ ОТ* предыдущей средней CPS)  
  {
  обнулить массивы оставив в них последнее значение (или 2-3-4 последних значений)
  и пересчитать показания
  }
...

Здесь CPS - это суммарное усредненное, которое вычислилось в предыдущем периоде, а 
CPS0 = Count / Time;   // текущее только за последний интервал

Вариант реализации условия *СИЛЬНО ОТЛИЧАЕТСЯ ОТ* может быть разный.

К примеру если в 1,5 раза, то оставляем пол массива, а если в 2 раза, то только последние значения.

Спад радиации, инерция смены показаний

Ускорять работу дозиметра при увеличении радиации мы научились. А что будет, если после зоны с большой радиацией дозиметр попадет в зону со слабой?

За скорость обновления показаний отвечает условие:

if (Time >= 5 сек  ИЛИ (Time * Count) >= 10 ) {подпрограмма вычисления Radiation}

Дозиметр вышел из зоны с высокой радиацией. Количество импульсов со счетчика Гейгера резко упало и дозиметр по этому условию ждет 5 секунд набора статистики. А на дисплее в это время продолжает висеть большой микро или даже мили Зиверт, что нехорошо. Для оперативного реагирования на резкий спад радиации нужно сохранить по инерции скорость смены показаний, какие они были при повышенной радиации, до тех пор, пока они не спадут до текущего значения. Для этого добавим в условие еще один элемент:

if (Time >= 5 сек  ИЛИ (Time * Count) >= 10  ИЛИ (Radiation*Time)>2)) 
    {подпрограмма вычисления Radiation}

Теперь повышенная радиация Radiation в предыдущих периодах будет по инерции вынуждать программу не дожидаться 5 секунд и быстрее заполнять массив даже небольшим количеством импульсов для ускорения спада показаний до реальных.

Альтернативный алгоритм

Как альтернативный или как дополнительный вариант вместо укорачивания интервалов времени при повышении количества импульсов можно реализовать динамичное уменьшение количества ячеек массивов. т. е. сокращать размерность массивов Counts[i] и Times[i] по мере набора достаточной статистики.

Как только SUMofCounts достигло достаточного статистического значения, например 100 импульсов, уменьшаем количество ячеек массива на 1, с 10 до 9.

Если сумма и 9 ячеек превышает 100 импульсов — уменьшаем еще на 1, до 8 и т. д.

И наоборот (с небольшим гистерезисом): Если сумма ячеек оказалась меньше например 70 импульсов, то добавляем одну ячейку обратно, увеличиваем размерность массива на единицу.

Такой дополнительный алгоритм позволит сохранять погрешность около 10–12% и при этом тоже оперативно реагировать на изменение радиации.

Усреднение усреднений

Мы выбрали период набора статистики (время усреднения) примерно равным тому самому периоду 45 сек, когда микроРентгены/час совпадают с импульсами. Но даже при таком периоде вероятностный разброс следования импульсов создает недостаточно плавный график изменения показаний со временем даже при постоянной радиации.

Вот для сравнения графики показаний в зависимости от количества ячеек скользящего усреднения (от размерности массивов Counts[i] и Times[i]):

Фиолетовый график не усредненные замеры количества импульсов за фиксированный интервал.Желтый график усреднения по 8 последовательным ячейкам, а Красный - по 16-и. Видно, что красный плавнее, но подтормаживает с реакцией на изменение радиации.
Фиолетовый график не усредненные замеры количества импульсов за фиксированный интервал.
Желтый график усреднения по 8 последовательным ячейкам, а Красный - по 16-и.
Видно, что красный плавнее, но подтормаживает с реакцией на изменение радиации.

Чем больше суммарное время набора статистики, тем точнее показания (при неизменной радиации) и тем плавнее график. И первое желание для достижения более плавного изменения замеров — это увеличить общий период набора статистики (больше 45 сек) или увеличить количество ячеек массивов Counts[i] и Timess[i] (не 10, а 16, 20...), что тоже приведет к удлинению периода усреднения показаний для расчета Radiation. Получим плавность, но потеряем оперативность самих показаний (на дисплее будет результат усреднения бОльшей давности).

Есть еще интересный вариант сглаживания графика: «усреднение усреднений». Усредняем массив первичных замеров по 8 точкам. А затем еще раз усредняем получившийся массив средних снова по 8 точкам. Результат получается более плавный, чем усреднение по 16 точкам, но при той же давности показаний.

Добавился Синий график - усреднение усреднений.В сравнении с Красным графиком он выглядит плавнее и даже кажется чуть более оперативным на подъемах и спадах.
Добавился Синий график - усреднение усреднений.
В сравнении с Красным графиком он выглядит плавнее
и даже кажется чуть более оперативным на подъемах и спадах.

Формула обычного усреднения для 8 точек выглядит вот так:

Среднее \, арифметическое =  \frac{a_1 + a_2 + a_3 + a_4 + a_5 + a_6 + a_7 + a_8 }{8}

А усреднение усреднений получается почти такая же формула, только с коэффициентами:

Среднее \, арифметическое \, взвешенное =  \frac{a_1 + 2a_2 + 3a_3 + 4a_4 + 4a_5 + 3a_6 + 2a_7 + a_8 }{20}

В применении к массивам количества импульсов и интервалов времени:

CPS = \frac{C_1 + 2 C_2 + 3 C_3 + 4 C_4 + 4 C_5 + 3 C_6 + 2 C_7 + C_8 }{T_1 + 2 T_2 + 3 T_3 + 4 T_4 + 4 T_5 + 3 T_6 + 2 T_7 + T_8 }где \quad C_i = Counts[i], \quad a \quad T_i = Times[i]

Мертвое время

У счетчиков Гейгера есть мертвое время после каждого импульса, когда они не регистрируют частицы. Частица могла пролететь, но счетчик ее не зарегистрировал. Игнорирование этого эффекта может дать погрешность при частом следовании импульсов, т. е. при высокой радиации. Программно учесть наличие мертвого времени можно 2 способами:

  1. Ввести в формулу вычисления мощности дозы корректировку на мертвое время. По разным данным из интернета мертвое время СБМ-20 составляет от 10 до 200 мкс. Наиболее вероятна меньшая оценка: около 10 мкс. Поскольку мертвое время после каждого импульса примерно фиксированное, то суммарно пропущенное время за какой‑то период пропорционально количеству зарегистрированных импульсов в этот период:

    T dead = Count * 10 mks;
    И тогда: 
    CPS = SUMofCounts / (SUMofTimes – SUMofCounts * 10 mks);
  1. Второй вариант учета мертвого времени в самом «железе», т. е. вычесть мертвое время просто выключив таймер подсчета времени в момент прихода импульса на какой то период, больше мертвого. Это позволит просто вырезать из времени набора статистики некоторые интервалы и не считать ни время этих интервалов, ни импульсы в них. С точки зрения вероятности случайных процессов мы не потеряем статистических данных, если в процессе регистрации частиц на какое‑то время просто будем прекращать это делать.

    Если программа и схемное решение устроены так, что импульсы со счетчика Гейгера вызывают прерывание контроллера, то при реализации этого алгоритма нужно в последний момент перед обратным включением таймера и возобновлением набора статистики обнулять регистр прерываний. Что бы не учесть случайный импульс, спустивший прерывание, пока таймер молчал.

Этот второй вариант показался более удобным и, кроме того, он более универсален. Ведь программа периодически должна выполнять какие‑то дополнительные действия (реагировать на кнопки, рассчитывать мощность дозы, выводить показания на дисплей…). Если есть вероятность конфликта этих процедур с процессом набора статистики, то на время всех этих действий достаточно останавливать счетчик времени и обнулять регистр прерываний перед обратным включением счетчика.

И напоследок

Конечно дозиметры на счетчиках Гейгера — это бытовые приборы. Каких‑то научно достоверных цифр от них нет смысла ожидать. Однако один заказчик решил все‑таки проверить, насколько показания дозиметра совпадают с показаниями научных приборов, и отдал образец на тестирование в метрологический институт. Результат получился примерно следующим:

Метрологический прибор, мкЗв/ч

Дозиметр, мкЗв/ч

3

3 (точка предварительной калибровки)

80

60

400

300

1000

550

С увеличением мощности дозы дозиметр сильно недосчитывал. Это не было связано ни с мертвым временем (оно учитывалось), ни с проседанием питания счетчика (схема давала стабильно не менее 400 вольт). В реальности конечно дозиметр вряд ли когда‑то попадет в зоны с такими дозами, и, кроме того, засветку в метрологическом институте делали фиксированным радиоизотопом, но заказчик все равно хотел дотянуть бытовой дозиметр до метрологического сертификата. И ничего не оставалось, как сделать искусственную линейную корректировку. Сплайны более высокого порядка, чем линейные, в микроконтроллер нерационально было заталкивать. А линейные вполне легко вычислялись при вводе таблицы погрешностей и выдавали быстрый результат при работе.

Формула корректировки разбита на линейные отрезки по существующим результатам тестирования в метрологическом институте. На каждом отрезке при вводе этих результатов вычислялась своя чувствительность SENS0[j] и своя погрешность на начальное значение Radiation0[j]. И конечная формула расчета Radiation менялась:

с:

Radiation = CPS * SENS;

На:

RadiationCorrected = CPS * SENS0[j] - Radiation0[j]
Где j – номер отрезка, куда попадают текущие CPS.

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 22: ↑22 и ↓0+22
Комментарии29

Публикации

Истории

Ближайшие события

22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
2 – 18 декабря
Yandex DataLens Festival 2024
МоскваОнлайн
11 – 13 декабря
Международная конференция по AI/ML «AI Journey»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань