Одновременный счет импульсов с 4х входов и передача их по 485 в ПК
- Войдите на сайт для отправки комментариев
Пт, 17/04/2020 - 13:21
Привет всем. В ардуино новичок. Интересует вопрос. Горожу счетчик фотонов на ФЭУ. Сигнал с ФЭУ поступает на дискриминаторы настроенные на разный уровень сигнала. после каждого дискриминатора стоит триггер для более крутых фронтов. Уровень 5в. Сигнал не периодический, частоту по длительности полки не померить. Надо именно посчитать количество импульсов за единицу времени (от0,5 мин до 1 мин) . С каждого входа. И измеренные значения передать в ПК. В пк уже будет программа обсчета этого. Частота следования импульсов по осциллу ну где то килогерц, может два в зависимсти от их амплитуды (чем меньше амплитудла тем они чаще)
Возможно ли такое реализовать на ардуино микро?
Теоретически можно. Лучше использовать прерывания. А какова длительность самого импульса?
0,25-1 мкс по справочнику на NaI c теллуром. фэу не сильно его растянет.
я про прерывания почитал, только их можно использовать для этих целей? просто на ардуино микро их не так много. и как я понял 3 спользуется либо под порт либо под прерывание. или я не прав?
Если Вы новичок, то для 4-х входов лучше взять не микру, а... Может мегу.
Порты PD0, PD1, PD2 и PD3 имеют собственные прерывания, но PD2 и PD3 используются так же и как UART.
Еще можно любой пин из порта PORTB задействовать, так как у него (у порта), есть собственное прерывание. Итого максимум 5 независимых счётчиков, но это если отказаться от UART-а. Я бы посоветовал сначала задействовать 3 прерывания PD0, PD1 и любой пин порта В, а когда программу отладишь, можно будет и 4 прерывание добавить. Ну а если есть Мега, то там конечно с прерываниями (в плане их количества) попроще будет.
Привет всем. В ардуино новичок. Интересует вопрос. Горожу счетчик фотонов на ФЭУ. Сигнал с ФЭУ поступает на дискриминаторы настроенные на разный уровень сигнала. после каждого дискриминатора стоит триггер для более крутых фронтов. Уровень 5в. Сигнал не периодический, частоту по длительности полки не померить. Надо именно посчитать количество импульсов за единицу времени (от0,5 мин до 1 мин) . С каждого входа. И измеренные значения передать в ПК. В пк уже будет программа обсчета этого. Частота следования импульсов по осциллу ну где то килогерц, может два в зависимсти от их амплитуды (чем меньше амплитудла тем они чаще)
Возможно ли такое реализовать на ардуино микро?
в зависимости от наличия и амплитуды сигнала от ФЭУ внешнее устройство формирует уровень лог. 1 на своих выходах, 0000-0001-0011-0111-1111 - так?
внешнее устройство дает 5 в импульс то биш лог 1 при приходу импульса заданной амплитуды
нужно именно считать количество импульсов, горожу я радиоактивный плотномер. там зависимость интенсивности радиоизлучения от плотности изучается посредством счета фотонов как пропорциональная величина излучению источника и потерь при прохождении образца
количество импульсов пропорционально интенсивности излучения, которое засвечивает кристалл перед фэу, и фэу регистрирует фотоны от кристалла. то есть как я понимаю счетчик должен считать импульсы за энное время, результат счет передавать в уарт, обнуляться ну и так по циклу. а ПК будет читать эти значения. то значение в котором счетчик насчитал наибольшее и будет искомым. Конечно можно на уровне мк решить вопрос какое наибольшее и одно передавать.
разные дискриминаторы нужны для того чтобы во первых отсечь шум, во вторых при разных условиях амплитуды импульсов разные так как энергия частиц, выбивающих фотон разная.
8xPCINT + 5xINT sources да именно. с РС INT можно считать приход фронтов лог 1 с частотой пару килогерц?
РС INT можно считать приход фронтов лог 1 с частотой пару килогерц?
легко, причем если импульсы от всех 4х источников равноценны - то вообще можно использовать только один PCint. без внешних прерываений
Только надо учитывать, что PCINT будет не только на RISING реагировать. Ну и вообще - это посложнее, чем просто на external Interrupt подвесится.
ТС же сказал, что они не равноценны и считать нужно каждый в отдельности.
Только вот он пока не ответил на вопрос SLKH, как именно приходят импульсы. Если, к примеру, сработал дискриминатор 2, то первый тоже даст сигнал? Будет 0011 или 0010 ?
ТС же сказал, что они не равноценны и считать нужно каждый в отдельности.
Только вот он пока не ответил на вопрос SLKH, как именно приходят импульсы. Если, к примеру, сработал дискриминатор 2, то первый тоже даст сигнал? Будет 0011 или 0010 ?
допустим дискриминаторы настроены на урони 0,2, 0,4 , 0,8 и 1,2 вольта
0,2 вольта будет отдавать то что от 0,2 и выше
0,4 отсеит то что меньше 0,4 и так далее
импульс с величиной 1,3 вольта попадет везде.
поэтому считать нужно по 4м отдельным входам
Только надо учитывать, что PCINT будет не только на RISING реагировать. Ну и вообще - это посложнее, чем просто на external Interrupt подвесится.
то есть берем на этот вход сажаем счетчик, считаем переходы с низкого на высокое с высокое на низкое, делим на два и получаем искомое число ?
Зачем считать переходы в обе стороны и делить на 2, если можно считать переходы в одну сторону? Тут надо держать в голове, что общий обработчик будет дёргаться чаще, чем раздельные. И, если он будет "удачно" написан, то напропускаете импульсы за милую душу.
ТС же сказал, что они не равноценны и считать нужно каждый в отдельности.
Только вот он пока не ответил на вопрос SLKH, как именно приходят импульсы. Если, к примеру, сработал дискриминатор 2, то первый тоже даст сигнал? Будет 0011 или 0010 ?
допустим дискриминаторы настроены на урони 0,2, 0,4 , 0,8 и 1,2 вольта
0,2 вольта будет отдавать то что от 0,2 и выше
0,4 отсеит то что меньше 0,4 и так далее
импульс с величиной 1,3 вольта попадет везде.
поэтому считать нужно по 4м отдельным входам
Прочитал первое сообщение и сильно удивился вывертам окружающей реальности, т.к. сижу отлаживаю пятиканальный счётчик импульсов. Сделано на блюпиле. Пять ног имеют собственные прерывания и считают импульсы. Таймер задаёт интервал и по окончании интервала считываются насчитанные импульсы, обнуляются переменные и всё по новой. По запросу отдаются компу по MODBUS. Блюпил взят, потому что импульсы могут идти до 500 кГц. Да и связь с компом по усб проводу не последнюю роль играет.
ссори что долго молчал, переключили на другой проект и я им занимался. а сейчас остро встал вопрос.
итак по обработке прерывания накорябал следующее
соответсвенно мне надо чтобы это значение обнулялось и считалось заново в цикле. либо при каждом выводе переменной вычиталось значение предыдущей.
соответсвенно мне надо чтобы это значение обнулялось и считалось заново в цикле. либо при каждом выводе переменной вычиталось значение предыдущей.
и в чем вопрос? не знаете как присвоить переменной значение или не умеете вычитать одно из другого?
И. прежде чем продолжить - вставте код в сообщение по правилам
скетч поправил как положено. то есть в цикле где loop надо ввести еще одну переменную из которой вычесть предыдущее значение переменной rot
для наглядности хочу это значение вывести на лсд дисплей.
Попробовал я залить прошивку. после залития потух светодиод рядом с портом. горит только синий.
как быть? шил через шнур юсб. плата в воздухе
шут с ней с ардуиной, на нано все работает. вот скетч
вопрос следующий. с ноги ардуино я вывел шим. со скважностью 2. подаем это на два входа прерывания ардуино. допустим задали мы 5000 импульсов в секунду. включаем. первая итеррация считает 5002 оба счетчика. последующая итак далее 4988. ну плюс минус. понятно что точность от много чего зависит. непонятно почему первое точное а последующие отличаются причем сильно от первой. на врем вывода я отключаю прерывание. и потом запускаю вновь. во внешний 485 все пуляется.
Во-первых - интервалы считаются по-еврейски, во-вторых - между стр. 36 и 38 накидано ещё много чего.
Там по дороге есть шанс на ещё одни грабли наступить:
импульс длительностью 0,25 мксек (#2) - это всего 4 такта процессора. хорошо бы как-то убедиться что такие импульсы нормально обрабатываются.
ещё лучше повесить триггеры перед входами МК.
Там по дороге есть шанс на ещё одни грабли наступить:
импульс длительностью 0,25 мксек (#2) - это всего 4 такта процессора. хорошо бы как-то убедиться что такие импульсы нормально обрабатываются.
ещё лучше повесить триггеры перед входами МК.
Или перейти на более скоростные аппараты. Хотя сигналы с ФЭУ мы считывали и считали еще 30 лет назад на Очень больших ЭВМ.
Там по дороге есть шанс на ещё одни грабли наступить:
импульс длительностью 0,25 мксек (#2) - это всего 4 такта процессора. хорошо бы как-то убедиться что такие импульсы нормально обрабатываются.
Согласен. Даташит на 328й мк содержит:
-----------------
The interrupt execution response for all the enabled AVR® interrupts is four clock cycles minimum. After four clock cycles the program vector address for the actual interrupt handling routine is executed. During this four clock cycle period, the program counter is pushed onto the stack.
-----------------
Так что, если импульс - 4 такта, то на высшей границе частоты регистрация импульсов станет непредсказуемой.
в чем еврейство в подсчете интервала. подскажите что поменять?
Для начала - строку 36 перенести поближе к аттачинтерраптам в 48-й
в чем еврейство
Евреи справа налево пишут.
-----
В строке №32 мина замедленного действия Прочитайте вот это, а потом исправьте эту строку.
в чем еврейство
Евреи справа налево пишут.
-----
В строке №32 мина замедленного действия Прочитайте вот это, а потом исправьте эту строку.
вот исправил. в выводе в порт мне надо кидать 4 числа разделенные значками и чтобы было явно видны начало и конец данных. поэтому без разделителя никуда. единственное можно порт сделать на прием и читать регистру памяти куда кидать значения.
вот исправил...
Условие не перепутали? <=
поправил. все равно при подсчете сначала шим мериется 5003, затем 4993, затем 4988, затем опять 4993 и так по циклу. вопрос почему?
про вычитание в миллс я понял. спасибо за совет.
сделал скетч для микро. использую 4 прерывания. компилит без ошибок. при загрузке в девайс выдает ошибку. в чем может быть причина?
прошился контроллер. но. передача запускается когда подключаешь монитор порта.
Вот вам ещё одна потенциальная проблема: SoftwareSerial блочит прерывания наглухо, когда дергает ногой.
я подключал в своем случае так прерывания PCINT от устройства, что бы их безболезненно закомментировать в библиотеке SoftWare Serial. Но да, на высокие частоты входного сигнала можно даже не рассчитывать.
Это на вход. На выход он просто cli делает.
при подключении к юсб монитором порта в строчке получаются левые значения в 3 и 4 числе. с чем моет быть связано. сейчас попробую подкинуть внешний 485 порт и посмотреть чего туда валится при отключенном мониторе порта
ступил. подключил шим. считает
вопрос остается открытым следующий
какова точность миллс.
Точность millis() в пределах нормы при стандартных условиях.
При любом импульсе у тебя будет фронт на самом "низковольтном" пине. Нах те тебе четыре прерывания?
Други. теперь встал вопрос посчитать среденне значение импульсов за интервал в 5 отсчетов по 200 мс и передать их в пк. как реализовать в моем случае усредение?
Просуммировать и поделить на количество.
Други. теперь встал вопрос посчитать среденне значение импульсов за интервал в 5 отсчетов по 200 мс и передать их в пк. как реализовать в моем случае усредение?
Просуммировать и поделить на количество.
я тупой или туплю? как посчитать среднее по двум известный константам... ммм думаю даже в уме не сложно будет, неужто МК необходим?
блин, картинку бы увидеть с примером... эпюры сигналов
В ходе исследований выяснили, что прибор плывет по температуре. и фэу и кристалл. прикрутил я датчик 18в20. после добавления его количество подсчитанных импульсов резко упало. по всей видимости контроллер ждет 750 мс ответа от датчика а потом импульсы считает?
если ввести задержку в 750 или 800 мс после строчки 54 он будет стоять и ждать отвтет датчика. в время цикла увеличить на эту задержку. или это совсем коряво?
Если уж чинить скетч серебрянным скотчем, то лично я бы все детачинтеррапты перенес под 54-ю строку.
переделал, сначала он запрашивает температуру, ждет ответ. потом 1000 мс считает прерывания по 4м входам и отдает в порт значения счета и температуру
Зачем считать переходы в обе стороны и делить на 2, если можно считать переходы в одну сторону? Тут надо держать в голове, что общий обработчик будет дёргаться чаще, чем раздельные. И, если он будет "удачно" написан, то напропускаете импульсы за милую душу.
так ты и предложил мегу, если повесить на раздельные аппаратные а в обработчике только ++ то видимо это будет самый удачный подход!?