измерить и сравнить частоту

matvey
Offline
Зарегистрирован: 20.05.2016

Всем привет. Нужно примерную стоимость програмки. Стоит ли заморачиваться.

Тебуется отследить правно меняющуюся частоту импульсов от четырех датчиков  (от 50Гц до 500кГц). Сравнить эту частоту и при появлении разницы более 10 процентов, и если эта разница продолжается например 20-30 секунд то включить  сигнальный светодиод.

импульсы прямоугольные 2.5 вольта. Подойдет ли Ардуино НАНО?  Желательно возможность вывода промежуточных значений на  компьютер (для отладки при подключении).

 

 

 

 

Onkel
Offline
Зарегистрирован: 22.02.2016

50 Гц совсем не проблема, 500 кГц на грани возможности. Было бы 2 датчика (не 4), можно было бы почти до мегагерца считать, а с 4 датчиками - нетривиальная, но решаемая задача. Значения на комп выводить можно хоть все. Напишите более подробно (уровень сигналов, реальные частоты, реальный диапазон, отслеживать постоянно или каждую миллисекунду или каждые n периодов, чем более четко будет составлено тз тем проще будет определить цену. ). Ардуино подойдет, но писать код придется конечно на асме (фрагмент ) и на С (основной код).  Пишите ydom coбaкa mail.ru

madmax96
Offline
Зарегистрирован: 22.09.2011

Так как выше уже заметили - 4 канала это не есть хорошо. 2 канала, положим, понятно куда кинуть. 4 - использовать оба внешних прерывания, если только. Собственно, внешнее прерывания, как-раз, где-то чуть более чем 500 килогерц как-раз и можно заставить работать. 

 Сделать можно, но есть свои нюансы. fmv.electronics (gmail) com

Onkel
Offline
Зарегистрирован: 22.02.2016

прерываний в atmega328 cколько хочешь, но вот таймеров, считающих внешние импульсы, только три.

На 500 кГц прерывание работать будет, но если будет отработка одного прерывания, не сработает второе и т.д. Так что тут задача не проста, тут вы правы.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

madmax96, Onkel, коллеги, вы когда нибудь подавали такие частоты на внешнее прерывание? Даже если взять всего одно прерывание, то  16000000/500000= каждые 32 такта приходит прерывание. 32 такта на всё про всё?  Скажу честно, я не знаток внутренней кухни прерываний, но по-моему там много всего творится, ставятся и стираются флаги, сохраняется/восстанавливается регистр sreg, вобщем 32 такта только-только обслужить самого себя, про исполнение чего-то ещё в прерывании можно и не мечтать. Если учитывать только восходящий или нисходящий фронт - всё равно 250 000 прерываний в секунду слишком много. В лучшем случае успеет какую нибудь int16 инкременировать.. но ни 4 входа обслужить.  ИМХО реально что-то можно успеть сделать в прерывании при ~100..150кГц на все каналы, т.е. примерно частотой не более 25кГц на канал.

Такие вещи делаются только тактируя таймер входящим сигналом, а другим таймером отсчитывая точный отрезок времени. Но в меге 328 только один таймер  с такой возможностью (тактовый вход T0 на 4 пине) , в меге 2560 их много, но на плате ардуино соответсвующие пины не выведены. Моё мнение таково, что единственное решение Т.З. -купить отладочную плату меги 2556 со всеми распаянными пинами, и на основе неё делать.

madmax96
Offline
Зарегистрирован: 22.09.2011

Onkel пишет:

прерываний в atmega328 cколько хочешь, но вот таймеров, считающих внешние импульсы, только три.

Расскажите, пожалуйста, как включить аппаратное отдельное внешнее прервание на всех прочих ногах. Я крайне заинтригован:)
Таймеров 3, только T2, вообще-то, не выведен ни на какую из ножек и посему внешние импульсы считать не умеет. Тем-более, что так или иначе, для определения частоты требуется еще и измерение времени микроконтроллером, на которое уйдет один таймер.

Onkel пишет:

На 500 кГц прерывание работать будет, но если будет отработка одного прерывания, не сработает второе и т.д. Так что тут задача не проста, тут вы правы.

Да, именно так. При достижении определенной частоты внешнего сигнала - наступит такой момент, когда одно прерывание будет частично забивать второе, так как МК не будет успевать возвращаться в рабочий режим. 

 

 

madmax96
Offline
Зарегистрирован: 22.09.2011

dimax пишет:

madmax96, Onkel, коллеги, вы когда нибудь подавали такие частоты на внешнее прерывание? Даже если взять всего одно прерывание, то  16000000/500000= каждые 32 такта приходит прерывание. 32 такта на всё про всё?  Скажу честно, я не знаток внутренней кухни прерываний, но по-моему там много всего творится, ставятся и стираются флаги, сохраняется/восстанавливается регистр sreg, вобщем 32 такта только-только обслужить самого себя, про исполнение чего-то ещё в прерывании можно и не мечтать. Если учитывать только восходящий или нисходящий фронт - всё равно 250 000 прерываний в секунду слишком много. В лучшем случае успеет какую нибудь int16 инкременировать.. но ни 4 входа обслужить.  ИМХО реально что-то можно успеть сделать в прерывании при ~100..150кГц на все каналы, т.е. примерно частотой не более 25кГц на канал.

Такие вещи делаются только тактируя таймер входящим сигналом, а другим таймером отсчитывая точный отрезок времени. Но в меге 328 только один таймер  с такой возможностью (тактовый вход T0 на 4 пине) , в меге 2560 их много, но на плате ардуино соответсвующие пины не выведены. Моё мнение таково, что единственное решение Т.З. -купить отладочную плату меги 2556 со всеми распаянными пинами, и на основе неё делать.

Когда-то давно, года 4 назад, когда я еще только знакомился с микроконтроллерами, начав с ардуино, я сделал двухканальный счётчик внешних импульсов с возможностью установки времени интегрирования и с отображением текущего результата на ks0108 дисплее. Так как таймерами на тот момент я орудовать еще не умел, как и чем либо уходящим дальше arduino ide, то оба счётных канала сделал на прерываниях.

Проверялось это дело генератором. Так вот, даже при условии, что на оба счётных канала подавался один и тот же сигнал, оно корректно работало вплоть до какой-то частоты порядка сотен килогерц. Может не 500. Я точно не помню - сейчас не буду лезть в архив по этому устройству.   

И да, 500 КГц может и не получиться. Вопрос требуемой точности. Это было завуалировано во фразе "некоторые нюансы".

Частота это счёт за единицу времени. Но не забывайте, что это время, в сущности, может быть любым.

То есть, никто не заставляет вас обслуживать все 4 входа раз в 32 такта.

В случае прерываний это довольно просто - инкреминирование жирной лонговой переменной. Даже за секунду она наполнится всего-лишь до 500к.

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

На меге, конечно, всё это реализовать проще будет.

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

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

поставить на входе два (сдвоенных) счетчика 4-х разрядных (по 13 рублей штука) и делить частоту на 8. Прерываний у нас - сколько угодно, если про PCINTx вспомнить. Немножко не wiring библиотекой придется попользоваться. ПинЧейндж интеррапты чуть дольше обрабатывать - они все на одном векторе сидят и нужно первой командой понять номер пина, а второй уже счетчик увеличивать, на две команды дольше.

Нанки - точно хватит, 10 раз в секунду измерения точно можно делать. Немного хитрить: если высокая частота - считать импульзы на фиксированное время, для низкочастотных сигналов - считать время между импульсами, тогда можно спокойно в 10 раз в секудну по всем 4-м каналам улозжиться. Но, судя по постановке задачи, дастаточно одно измерение в секунду делать, Так что нанки хватит ЗА ГЛАЗА! Если за защиту входов от помех, КЗ и перенапряжения  - на Заказчике, и питание нанки  - на нем же, то только нанка и два счетчика типа 74HC393 нужно и 12 резисторов ;).

madmax96
Offline
Зарегистрирован: 22.09.2011

wdrakula пишет:

поставить на входе два (сдвоенных) счетчика 4-х разрядных (по 13 рублей штука) и делить частоту на 8. 

не на 8, а на 16 тогда уж. Но про внение счётчики я выше писал как оно должно быть. Это больше к автору топика вопрос  - удовлетворяют ли такое решение его тз. 

PCINT - вообще не вариант. Оно будет активно терять короткие импульсы.

wdrakula пишет:

Немного хитрить: если высокая частота - считать импульзы на фиксированное время, для низкочастотных сигналов - считать время между импульсами, тогда можно спокойно в 10 раз в секудну по всем 4-м каналам улозжиться. 

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

Выше обсуждалась, именно не проблема как посчитать, а проблема просчёта на высоких частотах. 

 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1.Деление на 8, в тех, что я имел ввиду нет вывода переполнения, а 4-ый разряд - к сожалению 8-рки ;). (1,2,4,8)

2. Почему ПинЧейндж должен что-то терять? на каком основании? Это просто прерывания на любой ноге контроллера, Вошел, прочел весь байт порта и сравнил с сохраненным, что за странное суждение? И почему импульсы короткие? Настолько короткий, что по входу в прерывание считать его не успеешь? Это на какой частоте, позволь поитересоваться?

Но если сам так считаешь - не стану в холивар втягиваться. Тут и без меня есть любители... с лопатой у вентилятора....

 

madmax96
Offline
Зарегистрирован: 22.09.2011

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

1. Значит это не 4-й разряд, а 3-й.  2^3 = 8. Это, конечно, суть вещей не меняет. Но и не моя придирка. Любую схему открой, где есть хоть одна шина - всё отсчитывается от нуля. 

2. У него меньший приоритет к другим прерываниям (это не так страшно. просто, к слову). 

Насчет остального повторяться не буду. Так как да - сидеть спорить тут желания нет. Если автор топика так или иначе выйдет на связь, то и будем обсуждать. 

Так или иначе - задача реализуемая. Вопрос в ресурсах и требуемой точности. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

madmax96 пишет:

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

Малец ты рамки то не попутал? Ты папе своему советы давай, если, вдруг, мама тебя с ним познакомила!

Удачи, родное сердце!

matvey
Offline
Зарегистрирован: 20.05.2016

Спасибо за проявленный интерес.

Немного уточню. Сегодня померил. частота при самой большой скорости вращения составила 2100 Гц. Я так понимаю это упрощает ситуацию.

Замеры можно делать раз в 3-4 секунды. необязательно одновременно все четыре канала, можно по очереди . 

Сравнить Частоту или количество импульсов за секунду или полсекунды. вычислить разницу в процентах. Не уверен как это сделать  и если отклонения в большую или меньшую сторону более 10 процентов наблюдаются на протяжении 20-30 секунд , включить светодиод. и он должен гореть пока не снимется питание с ардуины.

Очень интересует стоимость написания программки для ардуино НАНО. Хотябы коридор от и до. 

Думаю сейчас понятнее обьяснил.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

matvey, да, с такой частотой нано справится. Если частота на входах не постоянная, то увеличивается, то уменьшается  -то измерять нужно по всем каналам строго одновременно, иначе разница непременно будет. Все прерывания PCINT группируются в 3 независимые группы.  Так что повесив входа на соответсвующие ноги можно получить  3 независимых прерывания + 2 основных INT. Есть ещё прерывание компаратора, так что в теории можно 6 каналов сделать :)

Onkel
Offline
Зарегистрирован: 22.02.2016

dimax пишет:

madmax96, Onkel, коллеги, вы когда нибудь подавали такие частоты на внешнее прерывание? Даже если взять всего одно прерывание, то  16000000/500000= каждые 32 такта приходит прерывание. 32 такта на всё про всё?  Скажу честно, я не знаток внутренней кухни прерываний, но по-моему там много всего творится, ставятся и стираются флаги, сохраняется/восстанавливается регистр sreg, вобщем 32 такта только-только обслужить самого себя, про исполнение чего-то ещё в прерывании можно и не мечтать. Если учитывать только восходящий или нисходящий фронт - всё равно 250 000 прерываний в секунду слишком много. В лучшем случае успеет какую нибудь int16 инкременировать.. но ни 4 входа обслужить.  ИМХО реально что-то можно успеть сделать в прерывании при ~100..150кГц на все каналы, т.е. примерно частотой не более 25кГц на канал.

Такие вещи делаются только тактируя таймер входящим сигналом, а другим таймером отсчитывая точный отрезок времени. Но в меге 328 только один таймер  с такой возможностью (тактовый вход T0 на 4 пине) , в меге 2560 их много, но на плате ардуино соответсвующие пины не выведены. Моё мнение таково, что единственное решение Т.З. -купить отладочную плату меги 2556 со всеми распаянными пинами, и на основе неё делать.

может много чего твориться, а может и немного. Вход/выход из пустого прерывания занимает меньше полмикросекунды. Когда возникают такого рода вопросы, желательно не писать сочинения, а померять или посчитать. А как делать в деталях- это уж денег дадут - сделаю.

Onkel
Offline
Зарегистрирован: 22.02.2016

matvey пишет:

Спасибо за проявленный интерес.

Немного уточню. Сегодня померил. частота при самой большой скорости вращения составила 2100 Гц. Я так понимаю это упрощает ситуацию.

Замеры можно делать раз в 3-4 секунды. необязательно одновременно все четыре канала, можно по очереди . 

Сравнить Частоту или количество импульсов за секунду или полсекунды. вычислить разницу в процентах. Не уверен как это сделать  и если отклонения в большую или меньшую сторону более 10 процентов наблюдаются на протяжении 20-30 секунд , включить светодиод. и он должен гореть пока не снимется питание с ардуины.

Очень интересует стоимость написания программки для ардуино НАНО. Хотябы коридор от и до. 

Думаю сейчас понятнее обьяснил.

 

теперь понятно. А как с вами связаться? Или мне отпишите ydom coбaкa mail.ru

matvey
Offline
Зарегистрирован: 20.05.2016

Matveyavto@mail.ru
Моя почта. Жду предложений.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Ардуино не справится --- но можно сделать и тоже самое на STM32f -- та пошустрее около 72 мгц

yarosvar
Offline
Зарегистрирован: 30.01.2019

кто может напісать програму по замру частоти 40/500гц

і с двумя регуліруемимі отводамі  верхній і ніжній прідел.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а отводы что и куда отводят? 

yarosvar
Offline
Зарегистрирован: 30.01.2019

две крутілкі регуліруют верхній і ніжній прідели і виходи для вкючения реле

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

не понимаю твою мову, земляков жди. 

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

А я нажал кнопку ПЕРЕВЕСТИ СТРАНИЦУ. 

Вот что получилось

две крутилки регулируют верхний и нижний приделы и выходы для вкючения реле

b707
Offline
Зарегистрирован: 26.05.2017

yarosvar - опишите подробнее задачу. Частоту чего измерять (что за сигнал, откуда берется, параметры) - а то может это частоа вращения мотора, так ее еще сначала в сигнал преобразовать надо

И, пожалуйста, на русском языке. Если не можете - есть такой же сайт в домене /ua - обращайтесь туда.

renoshnik
Offline
Зарегистрирован: 11.04.2013

yarosvar пишет:

две крутілкі регуліруют верхній і ніжній прідели і виходи для вкючения реле

http://forum.arduino.ua/

 

yarosvar
Offline
Зарегистрирован: 30.01.2019

спасибо буду искаить ближе ,и с оплатой проще.

promavto
promavto аватар
Offline
Зарегистрирован: 30.04.2013

yarosvar пишет:

спасибо буду искаить ближе ,и с оплатой проще.

Почему бы не применить DUE (SAM3X8E). У него  АЦП может работать в автономном режиме независимо от основного процесса. Измерять одновременно несколько каналов и по окончанию преобразования (измерения) отправляет по DMA результат измерения в массив. Далее с массив можно обрабатывать и отправлять данные в КОМ порт. Итого два одновременных процесса, быстродействия более чем достаточно.

Даже где то в недрах  интернета есть библиотека с похожей задачей.