Счетчик импульсов AnalogRead()
- Войдите на сайт для отправки комментариев
Ср, 09/12/2015 - 20:37
Всем привет! Необходимо сделать подсчет импульсов сигнала у которого амплитуда равняется 1.5 вольта, то есть на ум приходит только функция analogRead(), как возможно реализовать подсчет ипмульсов с учетом того что есть продолжительная пауза без сигнала после которой необходимо снова считать импульсы, как добиться того чтобы при ключении устройства происходило ожидание этой паузы и только после нее подсчет. Спасибо
aleksyum, если есть пауза, где нет сигнала, так стало быть и считать нечего )) Вот вам пример работы компаратора, сигнал подать на 7 пин, срабатывает при напряжении на входе уровнем выше 1,1 вольта.
Спасибо за подсказку с компаратором! Пауза нужна для опредления, наало это цикла сигналов или нет, просто при включении устройства цикл сигналов может быть посередине и устройство будет считывать их не сначала а это нельзя допустить, я думал может сделать ожидание при инициализации? В setup()?
aleksyum, можно и в сетап. Вот например вариант, цикл в сетап крутится до тех пор, пока импульсов не будет более 5 секунд. После этого управление переходит к loop
Оу) А можно поподробнее как именно реализован этот тайм аут в сетапе?
aleksyum, если команды do- while понятны, то остаётся понять их содержание . Если бит состояния выхода компаратора не равен значению флага, то инвертировать флаг, и сбросить счёт миллисекунд, после этого проверить не вышло ли время, и так по кругу. Если сигнала нет, и состояние выхода постоянно, то premillis не будет сбрасываться, и после 5 секунд вылетит из цикла.
компаратор себя ведет очень странно при настроеных последних битах регистра компаратора, прерывание срабатывает при переходе с единицы на ноль а не наоборот как должно быть, в чем может быть причина?
aleksyum, в разных взглядах ваших и компаратора :) Для вас единица как я понимаю - это некий уровень на входе , выше 1,1 вольта. Для компаратора единица - это единица на его выходе. Теперь размышляем логически. На плюс компаратора мы подали 1,1 вольта. На минус пусть будет 0 вольт. Значит компаратор выдаст единицу. Если напряжение выше 1,1 вольта -компаратор выдаст 0. так что всё правильно. Битами ACIS вы можете поменять логику.
Что то все таки я не понимаю) Я два бита логики работы менял, и все то же самое
aleksyum, вариант чудес исключаем. Значит вы как-то обманываете компаратор, посылаете ему быстро 2 импульса подряд. Дребезг?
У меня теперь (1<<ACIS1)|(0<<ACIS0); но прерывание происходит при отсутсиви сигнала, а должно как я понимаю при переходе с ACO с нуля на единицу, я правильно понимаю
RC фильтр на входе компаратора и/или отключать прерывания аналог. компаратора в обработчике (обнуляем бит ACIE) на время ~длительности импульса.
ACIS0 не надо устанавливать.
То есть так, по другому думаю быть не может)
проблема в том что во время паузы когда на напряжения на входе компаратора нет, онвсе равно обрабатывает прерывание
Нет, не так. В обработчике только сбрасываете ACSR &=~(0<<ACIE) а в loop() устанавливаете через какое то время, используя millis().
Я одного не понимаю что мне необходимо сделать чтобы прерывание обрабатывалось когда ЕСТЬ сигнал на входе компаратора?
aleksyum,компаратор работает с тем, что вы ему даёте. Значит напряжение есть, разбирайтесь с своим сигналом.
Напряжение на входе 1.5 вольта соответсвенно больше опорного напряжения, значит на выходе будет 0 правильно? А если в момент паузы напряжение 0 то следовательно на выходе компаратора будет 1, поправьте пожалуйста меня
aleksyum, да, всё правильно. Вставьте в луп строчку Serial.println( ACSR&1<<ACO); и смотрите что на выходе компаратора в реальном времени
Проверил, при отсувии напряжения ACO равняется единице.
aleksyum, отлично так и должно быть. В чём проблема то?) Если что-то не так срабатывает -то разбираться с сигналом, дребезгом, помехами, и.т.п.
Я уже запутался) А как мне сделать обработку прерывания по нулю тогда?)
aleksyum, мне казалось этот вопрос уже разобран окончательно?) Прерывание может вызываться по трём событиям:
1 любое изменение на выходе компаратора (1 -> 0 или 0 ->1) |(0<<ACIS1)|(0<<ACIS0)
2 выход компаратора изменился с 1 на 0 |(1<<ACIS1)|(0<<ACIS0)
3 выход компаратора изменился с 0 на 1 |(1<<ACIS1)|(1<<ACIS0)
если нужно прерывание по спаду входного сигнала на ноль, то выбираем пункт 3
Здравствуйте, у меня схожая тематика и не стал плодить тему новую, чтобы задать вопрос.
Релизовываю проект интегратора со сбросом с частотным преобразователем. Имеется RC цепочка, имеется неизвестное постоянное напряжение. На интегратор из RC цепочки подается фиксированное напряжение 5 В с выхода 13, в это время на вход D2 подаются прямоугольные импульсы с генератора. Выходное напряжение интегратора подается на инвертирующий вход компаратора, когда оно достигнет нашего неизвестного напряжения (здесь для тестов подключено 3.3 В), программа завершит подсчет числа импульсов за которое интегратор зарядился до уровня неизвестного напряжения , дальше рассчитывается значение неизвестного напряжения (не реализовано пока, из-за проблем с основной частью). После этого интегратор разряжается через второй резистор и вывод D11. Выход с интегратора подключен так же к AIN2, чтобы отслеживать момент, когда он разрядится (это сделано как костыль для простоты).
То, что выводит программа в серийный порт:
Т.е. импульсы он считает, но появляется ещё один дополнительный момент срабатывания компаратора. В чем может быть косяк?
Begemot, да кто ж его знает,тут нужно сидеть разбираться с реальным устройством, а не гадать на кофейной гуще. В качестве совета - в диагностических целях уберите пока внешние импульсы совсем, отключите прерывание INT. Считайте вместо этого например сколько микросов натикало, за период зарядки интегратора. Если глюков нет -значит вы косячно подключили внешний сигнал на D2
Извините за долгий ответ, првоерил как сказали, отключил прервыания INT и просто измерял микросекунды в момент срабатывания компаратора.
Вот, что получается на выходе:
Т.е. компаратор все равно срабатывает дважды.
Begemot, стало любопытно, проверил сам. Действительно, прерывание срабатывает 2 раза, при пересечии уровня 1,1вольта в ту и в обратную сторону. В общем при любых вариантах битов ACIS1 ACIS0 логика выхода в прерывания, такая же как при нулевых битах. Это явное противоречие даташиту, но это факт.. Кажется, что должно быть какое-то разумное объяснение, но у меня нет идей.
Противостоять этому глюку конечно нетрудно разными программными ухищрениями, например после срабатывания прерывания компаратора сразу отключать его ACSR=1<<ACD. А после того, как процесс разрядки закончится -снова включать ACSR=1<<ACBG | 1<<ACIE;
А вот за эту проверку - пасибки и от меня тоже. Все хотел запрячь компаратор на сигнал перехода через середину питания для своего BLDC драйвера .. учту.
Так и не успокоился я вчера :) Должно же быть какое-то объяснение этому глюку. Подумал, может в студии сделать тест компаратора, вдруг ардуина что-то намутила с регистрами. Написал, -всё тоже самое. Выход в прерывание компаратора срабатывает вне зависимости от выставленных бит ACISx, причём пересекая границу устойчивости может сработать по нескольку раз, прямо как дребезг. Эффект особо заметен на пологих сигналах типа синуса и треугольника. И чем меньше частота тем чаще происходят ложные срабатывания. Вот картинки для наглядности. Схема подключений.
Бирюзовый -сигнал "треугольник" с генератора. Жёлтый -тестовый импульс при входе в прерывание с 8-й ноги.
При растягивании импульса видно, что входит в прерывания по многу раз.
Если поиграться порогом срабатывания и частотой входящего сигнала, и паузой в прерывании -то можно добится того, что срабатывать будет как должен -один раз, и только на восходящей фазе сигнала. Но это очевидно за счёт того, что времени на ложные срабатывания просто не остаётся. Пробовал давать образцовое опорное от батарейки, но всё равно эффект проявляется, хоть и чуть реже. В общем моё объяснение таково - аппаратно компаратор в меге не может поддерживать программную возможность выхода в прерывание на falling или rising на абы каком сигнале из-за эффекта "дребезга" при переходе сигнала через опорное напряжние, который в свою очередь видимо вызван высокими пульсациями в питании компаратора. А так falling или rising конечно чётко срабатывают, но из-за того, что это происходит так-же и на фронтах дребезга применение этой фишки оказывается затруднено.
Тестовый скетч для студии:
Спасибо за дотошность. То есть получается что компаратор можно использовать только "по фронту", и кроме этого надо блокировать ложные срабатывания в обработчике самого прерывания программно. Так?
Arhat109-2, в принципе можно использовать любую из 3х вариантов логику выхода в прерывание, но при условии что будет программная защита от дребезга. В случае Бегемота например достаточно отключить компаратор при первом входе в прерывание, и включить его уже в начале следующего цикла зарядки.
Хотя пока не разобрал стенд, счас проверю вариант с "фаллинг"
Да, с "фаллинг" сложнее, т.к. затруднительно будет заблокировать алгоритм когда на входе идёт "райсинг" .
ps: фаллинг имелся ввиду у сигнала на входе, у компаратора это будет наоборот райсинг.
Я на эти грабли наступил год назад. Понял что все проблемы из за дребезга - очень чувствительный компаратор! - на входе аппаратный фильтр помогает но не 100%. В конце концов воткнул маленькую программную задержку и в конце прерывания чистил дополнительно флаг прерывания. Работает.
Спасибо вам, что так взялись за эту проблему! Я по всякому пробовал с этим входным сигналом играться, подавал на вход от генератора треугольный сигнал, все равно по разному срабатывало. Выход только один, либо программно через введение задержки времени бороться, либо схемотехнически с использованием тригера Шмидта, для создания петли гистерезиса. Компаратор оказался очень чувствительным и требовательным к сожалению.
Любой компаратор имеет склонность к дребезгу вблизи порогового напряжения. Лечится положительной обратной связью для получения гистерезиса.