Дозиметр

Вопросы от новичков
Ответить
Sergzloy
Рядовой
Сообщения: 3
Зарегистрирован: 05.04.2020{, 09:16}
Репутация: 0
Имя: Серёга

Дозиметр

#1

Сообщение Sergzloy » 17.04.2021{, 18:42}

Всем здравствуйте. Проект заключается в передаче данных с СБМ-20 по NRF каналу на другой терминал. Проект базируется на Arduino pro-mini. Пытаюсь посчитать импульсы с счетчика Гейгера, накачка импульсов идет через 8 ногу микроконтроллера, снятие импульсов с 3 ноги этого же кристалла. Устройства работают нормально при следующей схеме. При попытке добавления хотя бы дисплея происходит неправильная работа схемы счетчика. Возможно конфликт блоков. Хотя подобные схемы не имеют недостатков, но хотелось выполнить проект в FLprog. Посоветуйте, что делать.
Вложения
Снимок1.JPG
GEGER_PROG_02.flp
(45.73 КБ) 17 скачиваний
Снимок2.JPG
GEGER_PROG_03.flp
(1.15 МБ) 19 скачиваний

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Дозиметр

#2

Сообщение edyapd » 17.04.2021{, 18:49}

Смотрели эти две темы? ПЕРВАЯ, ВТОРАЯ

Sergzloy
Рядовой
Сообщения: 3
Зарегистрирован: 05.04.2020{, 09:16}
Репутация: 0
Имя: Серёга

Дозиметр

#3

Сообщение Sergzloy » 17.04.2021{, 19:25}

Уважаемый edyapd у меня тактирование импульсов накачки идет из внутреннего источника, а не из внешнего, поэтому ваш ответ не удовлетворяет моему запросу

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Дозиметр

#4

Сообщение Labu559 » 17.04.2021{, 22:11}

Sergzloy писал(а):
17.04.2021{, 19:25}
... у меня тактирование импульсов накачки идет из внутреннего источника...
При использовании дисплея, т.е.организации интерфейса (I2C в данном случае) или выполнения любых других дополнительных цикличных задач, Ваш генератор накачки(10 мкс/20мкс) может не соблюдать установленные интервалы времени полупериодов (однопоточная система занята другими текущими задачами и время основного цикла превышает время программного генератора), а скоростной счётчик (на прерываниях) продолжает считать импульсы. Даже применив прерывания по переполнению аппаратного таймера для генератора импульсов накачки, понижение частоты возможно из-за ардуиновского digitalWrite() (см.ссылку) + вызов функции безконечного цикла loop() + сравнительно медленного переключения выхода МК LOW--->dead Time--->HIGH + вызов совпавшего по времени обработчика прерываний скоростного счётчика в любом возможном сочетании этих факторов и это будет уже не измерительный прибор, так как о поддержания стабильности частоты программного генератора не может идти речи вообще. Потому для быстрой смены состояния выхода МК (например в скоростных интерфейсах) применяют способ переключения ножки LOW--->Z-State+PULLUP (т.е. переключить выход на землю--->отключить выход, а резистор внешней подтяжки притянет линию к питанию - переключив в HIGH и применения прямого доступа к регистрам ввода /вывода. В таком случае переключение состояния линии выполняется за один такт МК (условно). Также замечу, что Arduino IDE прекрасно работает с функциями main() и while(), вместо setup() и loop() соответственно,- т.е. с организацией скетча в стиле Си т.о. можно добиться более быстрым вызов циклов программы. Если низкоуровневое программирование Вам не по силам- применяйте внешний генератор, о чём резонно подсказал Вам ув. edyapd,. Но в любом случае необходимо организовать разделение задач и чёткую последовательность их выполнения. Как пример, для Вашего случая задачи: 1) Первичное измерение при включении питания или по внешней команде (кнопке) без инициализации/запретом других задач; 2) Запрещение 1-й задачи, как ненужной на данном этапе, програмный расчёт данных и вывод на дисплей; 3) запрещение 2-й задачи, как выполненой; 4) Цикличное измерение (подсчёт и опционально програмная генерация импульсов) с сохранением результата; 5) Последующее сравнение сохранённого отдельно предыдущего значения скоростного счётчика с текущим в пределах определённого гистерезиса(опционально); 6) повторный вызов 2-й задачи при обнаружении значимого изменения данных скоростного счётчика. Изолировав задачи, Вы сможете исключить их взаимное влияние и соответственно стабилизировать время выполнения цикла (получить константу задержки выполнения), скорректировать продолжительности полупериодов программного генератора с учетом полученой константы. Реализация в ФЛПрог возможна с помощью размещения задач на отдельных платах в проекте и выполнения их кода по условию или в цикле по условию, но выбраный Вами пользовательский блок OLED дисплея (автор не указан) совершенно не подходит для таких задач, так как выполняется по внутреннему таймеру, а нужно постоянно/по внешней команде En. IMHO :) Удачи!

Ответить

Вернуться в «Начинающим»