измерить и сравнить частоту
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 - 23:54
Всем привет. Нужно примерную стоимость програмки. Стоит ли заморачиваться.
Тебуется отследить правно меняющуюся частоту импульсов от четырех датчиков (от 50Гц до 500кГц). Сравнить эту частоту и при появлении разницы более 10 процентов, и если эта разница продолжается например 20-30 секунд то включить сигнальный светодиод.
импульсы прямоугольные 2.5 вольта. Подойдет ли Ардуино НАНО? Желательно возможность вывода промежуточных значений на компьютер (для отладки при подключении).
50 Гц совсем не проблема, 500 кГц на грани возможности. Было бы 2 датчика (не 4), можно было бы почти до мегагерца считать, а с 4 датчиками - нетривиальная, но решаемая задача. Значения на комп выводить можно хоть все. Напишите более подробно (уровень сигналов, реальные частоты, реальный диапазон, отслеживать постоянно или каждую миллисекунду или каждые n периодов, чем более четко будет составлено тз тем проще будет определить цену. ). Ардуино подойдет, но писать код придется конечно на асме (фрагмент ) и на С (основной код). Пишите ydom coбaкa mail.ru
Так как выше уже заметили - 4 канала это не есть хорошо. 2 канала, положим, понятно куда кинуть. 4 - использовать оба внешних прерывания, если только. Собственно, внешнее прерывания, как-раз, где-то чуть более чем 500 килогерц как-раз и можно заставить работать.
Сделать можно, но есть свои нюансы. fmv.electronics (gmail) com
прерываний в atmega328 cколько хочешь, но вот таймеров, считающих внешние импульсы, только три.
На 500 кГц прерывание работать будет, но если будет отработка одного прерывания, не сработает второе и т.д. Так что тут задача не проста, тут вы правы.
madmax96, Onkel, коллеги, вы когда нибудь подавали такие частоты на внешнее прерывание? Даже если взять всего одно прерывание, то 16000000/500000= каждые 32 такта приходит прерывание. 32 такта на всё про всё? Скажу честно, я не знаток внутренней кухни прерываний, но по-моему там много всего творится, ставятся и стираются флаги, сохраняется/восстанавливается регистр sreg, вобщем 32 такта только-только обслужить самого себя, про исполнение чего-то ещё в прерывании можно и не мечтать. Если учитывать только восходящий или нисходящий фронт - всё равно 250 000 прерываний в секунду слишком много. В лучшем случае успеет какую нибудь int16 инкременировать.. но ни 4 входа обслужить. ИМХО реально что-то можно успеть сделать в прерывании при ~100..150кГц на все каналы, т.е. примерно частотой не более 25кГц на канал.
Такие вещи делаются только тактируя таймер входящим сигналом, а другим таймером отсчитывая точный отрезок времени. Но в меге 328 только один таймер с такой возможностью (тактовый вход T0 на 4 пине) , в меге 2560 их много, но на плате ардуино соответсвующие пины не выведены. Моё мнение таково, что единственное решение Т.З. -купить отладочную плату меги 2556 со всеми распаянными пинами, и на основе неё делать.
прерываний в atmega328 cколько хочешь, но вот таймеров, считающих внешние импульсы, только три.
Расскажите, пожалуйста, как включить аппаратное отдельное внешнее прервание на всех прочих ногах. Я крайне заинтригован:)
Таймеров 3, только T2, вообще-то, не выведен ни на какую из ножек и посему внешние импульсы считать не умеет. Тем-более, что так или иначе, для определения частоты требуется еще и измерение времени микроконтроллером, на которое уйдет один таймер.
На 500 кГц прерывание работать будет, но если будет отработка одного прерывания, не сработает второе и т.д. Так что тут задача не проста, тут вы правы.
Да, именно так. При достижении определенной частоты внешнего сигнала - наступит такой момент, когда одно прерывание будет частично забивать второе, так как МК не будет успевать возвращаться в рабочий режим.
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к.
Таймеры живут своей жизнью. На них такты не тратятся. И тут, скорее всего, в высокочастотном режиме работы придётся ограничиться прерываниями по переполнению таймера. На больших частотах это будет пренебрежимая ошибка.
На меге, конечно, всё это реализовать проще будет.
В общем и целом, это, если делать совсем правильно, конечно, должно быть реализовано на внешних счётчиках, которые ардуина лишь будет опрашивать периодически.
поставить на входе два (сдвоенных) счетчика 4-х разрядных (по 13 рублей штука) и делить частоту на 8. Прерываний у нас - сколько угодно, если про PCINTx вспомнить. Немножко не wiring библиотекой придется попользоваться. ПинЧейндж интеррапты чуть дольше обрабатывать - они все на одном векторе сидят и нужно первой командой понять номер пина, а второй уже счетчик увеличивать, на две команды дольше.
Нанки - точно хватит, 10 раз в секунду измерения точно можно делать. Немного хитрить: если высокая частота - считать импульзы на фиксированное время, для низкочастотных сигналов - считать время между импульсами, тогда можно спокойно в 10 раз в секудну по всем 4-м каналам улозжиться. Но, судя по постановке задачи, дастаточно одно измерение в секунду делать, Так что нанки хватит ЗА ГЛАЗА! Если за защиту входов от помех, КЗ и перенапряжения - на Заказчике, и питание нанки - на нем же, то только нанка и два счетчика типа 74HC393 нужно и 12 резисторов ;).
поставить на входе два (сдвоенных) счетчика 4-х разрядных (по 13 рублей штука) и делить частоту на 8.
не на 8, а на 16 тогда уж. Но про внение счётчики я выше писал как оно должно быть. Это больше к автору топика вопрос - удовлетворяют ли такое решение его тз.
PCINT - вообще не вариант. Оно будет активно терять короткие импульсы.
Немного хитрить: если высокая частота - считать импульзы на фиксированное время, для низкочастотных сигналов - считать время между импульсами, тогда можно спокойно в 10 раз в секудну по всем 4-м каналам улозжиться.
Ну про это я тоже писал. Только в случае низких частот надо не время между импульсами мерить, а просто увеличивать время интегрирования. Замерить один большой кусок времени это проще и точнее, чем много мелких.
Выше обсуждалась, именно не проблема как посчитать, а проблема просчёта на высоких частотах.
1.Деление на 8, в тех, что я имел ввиду нет вывода переполнения, а 4-ый разряд - к сожалению 8-рки ;). (1,2,4,8)
2. Почему ПинЧейндж должен что-то терять? на каком основании? Это просто прерывания на любой ноге контроллера, Вошел, прочел весь байт порта и сравнил с сохраненным, что за странное суждение? И почему импульсы короткие? Настолько короткий, что по входу в прерывание считать его не успеешь? Это на какой частоте, позволь поитересоваться?
Но если сам так считаешь - не стану в холивар втягиваться. Тут и без меня есть любители... с лопатой у вентилятора....
Во-первых, не надо Тыкать. Если ты сам какой-нибудь школец, то это не значит что все тут такие.
1. Значит это не 4-й разряд, а 3-й. 2^3 = 8. Это, конечно, суть вещей не меняет. Но и не моя придирка. Любую схему открой, где есть хоть одна шина - всё отсчитывается от нуля.
2. У него меньший приоритет к другим прерываниям (это не так страшно. просто, к слову).
Насчет остального повторяться не буду. Так как да - сидеть спорить тут желания нет. Если автор топика так или иначе выйдет на связь, то и будем обсуждать.
Так или иначе - задача реализуемая. Вопрос в ресурсах и требуемой точности.
Во-первых, не надо Тыкать. Если ты сам какой-нибудь школец, то это не значит что все тут такие.
Малец ты рамки то не попутал? Ты папе своему советы давай, если, вдруг, мама тебя с ним познакомила!
Удачи, родное сердце!
Спасибо за проявленный интерес.
Немного уточню. Сегодня померил. частота при самой большой скорости вращения составила 2100 Гц. Я так понимаю это упрощает ситуацию.
Замеры можно делать раз в 3-4 секунды. необязательно одновременно все четыре канала, можно по очереди .
Сравнить Частоту или количество импульсов за секунду или полсекунды. вычислить разницу в процентах. Не уверен как это сделать и если отклонения в большую или меньшую сторону более 10 процентов наблюдаются на протяжении 20-30 секунд , включить светодиод. и он должен гореть пока не снимется питание с ардуины.
Очень интересует стоимость написания программки для ардуино НАНО. Хотябы коридор от и до.
Думаю сейчас понятнее обьяснил.
matvey, да, с такой частотой нано справится. Если частота на входах не постоянная, то увеличивается, то уменьшается -то измерять нужно по всем каналам строго одновременно, иначе разница непременно будет. Все прерывания PCINT группируются в 3 независимые группы. Так что повесив входа на соответсвующие ноги можно получить 3 независимых прерывания + 2 основных INT. Есть ещё прерывание компаратора, так что в теории можно 6 каналов сделать :)
madmax96, Onkel, коллеги, вы когда нибудь подавали такие частоты на внешнее прерывание? Даже если взять всего одно прерывание, то 16000000/500000= каждые 32 такта приходит прерывание. 32 такта на всё про всё? Скажу честно, я не знаток внутренней кухни прерываний, но по-моему там много всего творится, ставятся и стираются флаги, сохраняется/восстанавливается регистр sreg, вобщем 32 такта только-только обслужить самого себя, про исполнение чего-то ещё в прерывании можно и не мечтать. Если учитывать только восходящий или нисходящий фронт - всё равно 250 000 прерываний в секунду слишком много. В лучшем случае успеет какую нибудь int16 инкременировать.. но ни 4 входа обслужить. ИМХО реально что-то можно успеть сделать в прерывании при ~100..150кГц на все каналы, т.е. примерно частотой не более 25кГц на канал.
Такие вещи делаются только тактируя таймер входящим сигналом, а другим таймером отсчитывая точный отрезок времени. Но в меге 328 только один таймер с такой возможностью (тактовый вход T0 на 4 пине) , в меге 2560 их много, но на плате ардуино соответсвующие пины не выведены. Моё мнение таково, что единственное решение Т.З. -купить отладочную плату меги 2556 со всеми распаянными пинами, и на основе неё делать.
может много чего твориться, а может и немного. Вход/выход из пустого прерывания занимает меньше полмикросекунды. Когда возникают такого рода вопросы, желательно не писать сочинения, а померять или посчитать. А как делать в деталях- это уж денег дадут - сделаю.
Спасибо за проявленный интерес.
Немного уточню. Сегодня померил. частота при самой большой скорости вращения составила 2100 Гц. Я так понимаю это упрощает ситуацию.
Замеры можно делать раз в 3-4 секунды. необязательно одновременно все четыре канала, можно по очереди .
Сравнить Частоту или количество импульсов за секунду или полсекунды. вычислить разницу в процентах. Не уверен как это сделать и если отклонения в большую или меньшую сторону более 10 процентов наблюдаются на протяжении 20-30 секунд , включить светодиод. и он должен гореть пока не снимется питание с ардуины.
Очень интересует стоимость написания программки для ардуино НАНО. Хотябы коридор от и до.
Думаю сейчас понятнее обьяснил.
теперь понятно. А как с вами связаться? Или мне отпишите ydom coбaкa mail.ru
Matveyavto@mail.ru
Моя почта. Жду предложений.
Ардуино не справится --- но можно сделать и тоже самое на STM32f -- та пошустрее около 72 мгц
кто может напісать програму по замру частоти 40/500гц
і с двумя регуліруемимі отводамі верхній і ніжній прідел.
а отводы что и куда отводят?
две крутілкі регуліруют верхній і ніжній прідели і виходи для вкючения реле
не понимаю твою мову, земляков жди.
А я нажал кнопку ПЕРЕВЕСТИ СТРАНИЦУ.
Вот что получилось
две крутилки регулируют верхний и нижний приделы и выходы для вкючения реле
yarosvar - опишите подробнее задачу. Частоту чего измерять (что за сигнал, откуда берется, параметры) - а то может это частоа вращения мотора, так ее еще сначала в сигнал преобразовать надо
И, пожалуйста, на русском языке. Если не можете - есть такой же сайт в домене /ua - обращайтесь туда.
две крутілкі регуліруют верхній і ніжній прідели і виходи для вкючения реле
http://forum.arduino.ua/
спасибо буду искаить ближе ,и с оплатой проще.
спасибо буду искаить ближе ,и с оплатой проще.
Почему бы не применить DUE (SAM3X8E). У него АЦП может работать в автономном режиме независимо от основного процесса. Измерять одновременно несколько каналов и по окончанию преобразования (измерения) отправляет по DMA результат измерения в массив. Далее с массив можно обрабатывать и отправлять данные в КОМ порт. Итого два одновременных процесса, быстродействия более чем достаточно.
Даже где то в недрах интернета есть библиотека с похожей задачей.