Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Фильтр для выделения прямоугольных импульсов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
mempfis_
Всем добрый день.
При разработке нового прибора возникли проблемы с подсчётом прямоугольных импульсов на входе процессор.
Стоит задача подсчитать кол-во прямоугольных импульсов (предположительно меандр) с периодом от 15-20 мС до 10 С. Входные импульсы ограниченные амплитудой 3В через диод подаются на параллельную RC-цепочку 100k 0,1uF. RC-цепочка одним входом подключена напрямую к ножке процессора (LPC17) а вторым на землю. На пине процессора отключены pullup/pulldown.
В лабораторных условиях подсчёт импульсов происходит точно. При установке аппарата на транспортное средство появляется значительный пересчёт.
Импульсы считаются программно - идёт выборка состояния пина раз в 2 мС, выполняется медианная фильтрация настроенная на фиксацию импульсов от 10 мС (т.е. буффер на 9 отсчётов).
Источник проблемы пока не выяснен, поэтому стоит задача программно обойти проблему. Как я вижу медианной фильтрации недостаточно (или она неправильно настроена). Поэтому вопрос к тем кто сталкивался с подобной задачей - есть ли какие-либо программные фильтры для подобных задача? Поделитесь плиз ссылкой или идеей. Заранее благодарен за любую инфу.
mihalevski
Цитата(mempfis_ @ May 14 2012, 15:24) *
Всем добрый день.
При разработке нового прибора возникли проблемы с подсчётом прямоугольных импульсов на входе процессор.
Стоит задача подсчитать кол-во прямоугольных импульсов (предположительно меандр) с периодом от 15-20 мС до 10 С. Входные импульсы ограниченные амплитудой 3В через диод подаются на параллельную RC-цепочку 100k 0,1uF. RC-цепочка одним входом подключена напрямую к ножке процессора (LPC17) а вторым на землю. На пине процессора отключены pullup/pulldown.
В лабораторных условиях подсчёт импульсов происходит точно. При установке аппарата на транспортное средство появляется значительный пересчёт.
Импульсы считаются программно - идёт выборка состояния пина раз в 2 мС, выполняется медианная фильтрация настроенная на фиксацию импульсов от 10 мС (т.е. буффер на 9 отсчётов).
Источник проблемы пока не выяснен, поэтому стоит задача программно обойти проблему. Как я вижу медианной фильтрации недостаточно (или она неправильно настроена). Поэтому вопрос к тем кто сталкивался с подобной задачей - есть ли какие-либо программные фильтры для подобных задача? Поделитесь плиз ссылкой или идеей. Заранее благодарен за любую инфу.


Одна цифирь: за половину периода равного 15мс (7,5мс) напряжение на RC цепи упадет от 100% до 47,2%. Уровень принятия 0/1 плюс ошибка в 2 мс может на коротких периодах дать ошибку. На больших периодах ошибка в другом.
mempfis_
Цитата(mihalevski @ May 14 2012, 11:42) *
Одна цифирь: за половину периода равного 15мс (7,5мс) напряжение на RC цепи упадет от 100% до 47,2%. Уровень принятия 0/1 плюс ошибка в 2 мс может на коротких периодах дать ошибку. На больших периодах ошибка в другом.


Реально на вход подаются импульсы от 50 мС и выше. Раньше стояла фильтрация оптимизированная под 5 мС (выборка раз в 1 мС + медианный фильтр). Увеличение периода выборки не спасло ситуацию. Не хочется экспериментировать с разными фильтрами т.к. заказчик находится в другом городе, тестируемые приборы у него, перепрошивка только дистанционная. А в на своём рабочем месте я не могу создать условия, близкие к реальным рабочим.
=AK=
Цитата(mempfis_ @ May 14 2012, 17:54) *
Входные импульсы ограниченные амплитудой 3В через диод подаются на параллельную RC-цепочку 100k 0,1uF. RC-цепочка одним входом подключена напрямую к ножке процессора (LPC17) а вторым на землю.

То есть, у вас пиковый детектор на входе стоит. С постоянной времени разряда 100к*100n=10 мс и задним фронтом 2.2*R*C = 22мс. При этом время заряда конденсатора неизвестно, оно определяется выходным сопротивлением источника сигнала. Непонятно, почему вы используете пиковый детектор, а не обычный RC фильтр. Я бы вместо диода поставил резистор 33к, а резистор на землю увеличил бы до 1М.

Цитата(mempfis_ @ May 14 2012, 17:54) *
При установке аппарата на транспортное средство появляется значительный пересчёт.

Надо полагать, помехи. А пиковый детектор редкие помехи не фильтрует, он их регистрирует. sm.gif

Цитата(mempfis_ @ May 14 2012, 17:54) *
Импульсы считаются программно - идёт выборка состояния пина раз в 2 мС, выполняется медианная фильтрация настроенная на фиксацию импульсов от 10 мС (т.е. буффер на 9 отсчётов).

Если 9 отсчетов по 2мс, это 18мс получается, а не 10.

Медианный фильтр - лишняя сущность. Используйте простой "антидребезговый" алгоритм: берите отсчеты раз в миллисекунду и вдвигайте их в однобайтный сдвиговый регистр; если в сдвиговом регистре все восемь бит равны 0 - устанавливайте выходную переменную в ноль, если все восемь бит равны 1 - устанавливайте ее в единицу.
kovigor
Цитата(mempfis_ @ May 14 2012, 12:01) *
... заказчик находится в другом городе, тестируемые приборы у него, перепрошивка только дистанционная. А в на своём рабочем месте я не могу создать условия, близкие к реальным рабочим.


Берите хороший цифровой осциллограф и езжайте к заказчику на объект (в командировку). От борьбы неизвестно с чем толку не будет, поверьте ...
mempfis_
Цитата(=AK= @ May 14 2012, 12:26) *
То есть, у вас пиковый детектор на входе стоит. С постоянной времени разряда 100к*100n=10 мс и задним фронтом 2.2*R*C = 22мс.


Надо полагать, помехи. А пиковый детектор редкие помехи не фильтрует, он их регистрирует. sm.gif

Если 9 отсчетов по 2мс, это 18мс получается, а не 10.


Схему составлял не я - возможно это есть пиковый детектор реагирующий на помехи. Я только программирую плату.
Вот схема. Резистор сверху 4к7 подключён к +3В, снизу 100к. Конденсатор 0,1uF. диодная сборка BTA54. Значёк сапрессора не нашёл - заменил на закарлючку.
Эта схема позволяет подавать на вход до 12В. Реагирует на подачу 0.
Медианный фильтр просимулирован и работает корректно - сохраняет в буффер на место самого старого отсчёта новый, сортирует по возрастанию и возвращает 9/2=4 й элемент буффера - поэтому 5*2 = 10мС.

Если ничего нельзя поменять в схеме то если я увеличу период фильтра до 20-30 мС возможно ли улучшение работы?
=AK=
Цитата(mempfis_ @ May 14 2012, 19:35) *
Вот схема. Резистор сверху 4к7 подключён к +3В, снизу 100к. Конденсатор 0,1uF. диодная сборка BTA54. Значёк сапрессора не нашёл - заменил на закарлючку.

Слава богу, есть резистор 4.7к, значит, короткая помеха все-таки будет отфильтрована. Хотя фильтр все-таки нелинейный.

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

Цитата(mempfis_ @ May 14 2012, 19:35) *
Медианный фильтр просимулирован и работает корректно - сохраняет в буффер на место самого старого отсчёта новый, сортирует по возрастанию и возвращает 9/2=4 й элемент буффера - поэтому 5*2 = 10мС.

Вы опять говорите о медианном фильтре. Вы что, сигнал при помощи АЦП получаете, что ли? Вы, наверное, в книгу рекордов Гиннеса хотели попасть?
demiurg_spb
Цитата(=AK= @ May 14 2012, 14:09) *
Вы опять говорите о медианном фильтре. Вы что, сигнал при помощи АЦП получаете, что ли? Вы, наверное, в книгу рекордов Гиннеса хотели попасть?
А какая разница откуда он получает данные?
Битовый массив нечётного размера (массив нулей и единиц) вполне себе нормально можно фильтрануть медианным фильтром. Только зачем так сложно это вопрос...
Можно просто посчитать кол-во нулей или единиц в скользящем окне (это кстати одна инструкция на некоторых архитектурах) и если оно больше половины размера массива то принимать соответствующее решение.
Тут ИМХО главное грамотно размер массива выбрать (лучше чтобы в нативный тип int все битики влезли) и период выборки рассчитать.
mempfis_
Цитата(=AK= @ May 14 2012, 14:09) *
Интересно, куда на плате подключен земляной вывод супрессора. Если разводка земли некачественная, то из-за супрессора по земле могут бегать серьезные помехи.

Вы опять говорите о медианном фильтре. Вы что, сигнал при помощи АЦП получаете, что ли? Вы, наверное, в книгу рекордов Гиннеса хотели попасть?


Про разводку платы и её качество ничего сказать не могу. Думаю что разведено нормально - схемотехник опытный.
Как влияет сапрессор на вход тоже ничего сказать не могу.
Моё мнение что проблема в параметрах входного фильтра - кажется завышена тау RC-цепочки и слишком затянут задний фронт.


По поводу медианной фильтрации.
Сигнал получаю опросом входа - т.е. 0 или 1. В программе используется процедура медианной фильтрации показаний АЦП.
Применил её для фильтрации цифровых входов. Поначалу думал просто фиксировать состояния пинов в массив и если весь массив конкретного пина == 1 то вход в 1, и наоборот - если весь массив == 0 то вход в 0. Но тогда пришлось бы запоминать какое текущее состояние пина чтобы знать что мы ожидаем - заполнение нулями или еденицей. С медианным фильтром всё проще. Сохраняю текущее значение всех пинов в массив на место самого старого. Обнуляю переменную текущего состояния пинов, сколько пинов столько раз выполняю сортировку массива по возрастанию для каждого пина (массив копируется в промежуточный буффер с наложенной маской пина на каждый элемент, потом сортируется и возвращается средний элемент промежуточного буффера который содержит отфильтрованное состояние пина). Делаю OR переменной текущего состояния пинов с результатом фильтрации. И всё.
Комуто покажется что громоздко - на самом деле очень просто и удобно. А главное эффективно фильтрует позволяя избавиться от дребезга (переходов 0-1 1-0 в пределах нескольких отсчётов) + легко расширяемо до 32х входов.

Увеличил период до 20 мС. Ввёл некоторый контроль длительности как самого импульса так и его HIGH-части.
Жаль нет возможности уменьшить конденсатор т.к. платы далеко.
Посмотрим на результаты испытаний....
Всем спасибо за ответы.
ReAl
Жуть.
Зачем сортировать данніе, состоящие (после наложения маски) только из нулей и одинаковых значений, равных маске?
Просто посчитать число не-нулей и вернуть маску, если число больше или равно половины длины массива, результат как при медиане.
Хотя в этом не слишком много толку — если на входе для какой-то ноги будет идти 01010101 то и на выходе фильтра будет то же самое.
Лучше внести гистерезис — взять число не-нулей и
Код
    если (текущее_фильтрованное_состояние_ножки_равно_1 И число_не_нулей_меньше_трети_длины_массива)
        присвоить_0_текущему_фильтрованному_состоянию_ножки
    иначе   если число_не_нулей_больше_двух_третей_длины_массива)
        присвоить_1_текущему_фильтрованному_состоянию_ножки
эквивалентно тому, что в отсортированном массиве будет браться не средний элемент, а стоящий на трети или на двух третях в зависимости от текущего фильтрованного значения.
А вместо кольцевого буфера значений и пересчёта числа не-нулей по маске по всему массиву маско входов каждый раз проще взять массив знаковых счётчиков для каждого пина и увеличивать/уменьшать значение счётчика в зависимсоти от 1/0 на входе. Ввести насыщение на величину, ориентировочно равную плюс/минус полудлине того массива, по которому медианили. Пороги гистерезиса взять плюс/минус треть от уровня насыщения. Тогда на каждую новую ножку нужна одна операция инкремента/декремента с насыщением её счётчика вместо того всего.

Поскольку разрядность счётчиков невелика, можно подумать про вертикальные счётчики, допилив их до реверсивных, использовав маску входов как up/down а не как вход счёта. Работы немного. Сэкономит малость ОЗУ.
Ruslan1
Цитата(mempfis_ @ May 14 2012, 18:43) *
Про разводку платы и её качество ничего сказать не могу. Думаю что разведено нормально - схемотехник опытный.


Цитата(mempfis_ @ May 14 2012, 18:43) *
Как влияет сапрессор на вход тоже ничего сказать не могу.
Моё мнение что проблема в параметрах входного фильтра - кажется завышена тау RC-цепочки и слишком затянут задний фронт.

А почему стесняетесь у этого "опытного схемотехника" спросить, под что он параметры этой входной цепи рассчитывал? Тут либо опытный (и у Вас что-то в софте некорректно, а на железо Вы зря наговариваете), либо не совсем-то он опытный и RC с потолка у него в схеме взято.
Пока не поймете что он хотел сказать этой схемой- счастья не будет. Может, есть еще помехи, которых Вы в течении года не увидите, а у него по техзаданию это описано.
ReAl
Вот такое:
Нажмите для просмотра прикрепленного файла
отбегало на нескольких сотнях такси более десяти лет, пока не выпало из перечня.
Да, схема посложнее, но дальше это шло прямо на вход T1 контроллера AT89C55 и считало аппаратным таймером.
Питание и земля компаратора взято с питания процессора (ушло по схеме вправо), POW5V — всё кроме процессора и фискалки — отдельным стабилизатором и отдельной землёй на входную точку массы.
ReAl
p.s. Немного врет схема — это что дома нашлось. Всё так, только номиналы были немного другие, тут гистерезис около полувольта, а в окончательной, насколько я помню, было увеличено почти до вольта с соответствующей коррекцией и входного делителя.
=AK=
Цитата(mempfis_ @ May 15 2012, 01:13) *
Моё мнение что проблема в параметрах входного фильтра - кажется завышена тау RC-цепочки и слишком затянут задний фронт.


Мне тоже так кажется. Входной фильтр должен быть, во-первых, линейным, а во-вторых, он должен фильтровать только то, что не может отфильтровать цифровой фильтр. Поэтому частота среза аналогового фильтра напрямую завязана с частотой взятия выборок, чем реже вы берете выборки - тем более инерционным должен быть аналоговый фильтр. А частота выборок зависит от того, как вы их берете. Если через АЦП (что для вашей задачи абсолютно бессмысленно), то выборки вам поневоле приходится брать редко, а затем тратить кучу времени на обработку ненужной информации.

Для такой задачи АЦП надо выбросить и забыть как страшный сон. Выборки надо брать компаратором, коим с успехом может служить цифровой вход микроконтроллера. Сответственно, тогда выборки можно брать намного чаще, скажем, раз в 100мкс, а требования к частоте среза аналогового фильтра, соответственно, снижаются.

Цитата(mempfis_ @ May 15 2012, 01:13) *
Поначалу думал просто фиксировать состояния пинов в массив и если весь массив конкретного пина == 1 то вход в 1, и наоборот - если весь массив == 0 то вход в 0. Но тогда пришлось бы запоминать какое текущее состояние пина чтобы знать что мы ожидаем - заполнение нулями или еденицей.

Не надо ничего "ожидать". Заведите выходную переменную, эквивалент RS-триггера, которая хранит результат обработки. Если весь массив (т.е. сдвиговый регистр) единицы - устанавливаете выходную переменную в 1, если все нули - устанавливаете в 0. Куда уж проще.

Если хотите, то можете рассматривать этот алгоритм как доведенный до предельного упрощения медианный фильтр.

Цитата(mempfis_ @ May 15 2012, 01:13) *
С медианным фильтром всё проще. Сохраняю текущее значение всех пинов в массив на место самого старого. Обнуляю переменную текущего состояния пинов, сколько пинов столько раз выполняю сортировку массива по возрастанию для каждого пина (массив копируется в промежуточный буффер с наложенной маской пина на каждый элемент, потом сортируется и возвращается средний элемент промежуточного буффера который содержит отфильтрованное состояние пина). Делаю OR переменной текущего состояния пинов с результатом фильтрации. И всё.

Вы мне живо напомнили некого студента, который задачу "определить, четное число или нечетное" решал так: завел два массива по миллиону слов, при инициализации заполнил их от счетчика по очереди, в один массив - четные, во второй - нечетные; для определения четное или нечетное число производил скоростной поиск сначала в одном массиве, затем в другом, если находил число - выдавал результат, если не находил - выдавал ошибку. sm.gif
zombi
Цитата(=AK= @ May 15 2012, 01:20) *
задачу "определить, четное число или нечетное" решал так: завел два массива по миллиону слов, при инициализации заполнил их от счетчика по очереди, в один массив - четные, во второй - нечетные; для определения четное или нечетное число производил скоростной поиск сначала в одном массиве, затем в другом, если находил число - выдавал результат, если не находил - выдавал ошибку. sm.gif

5 баллов! biggrin.gif


Цитата(mempfis_ @ May 14 2012, 11:24) *
Стоит задача подсчитать кол-во прямоугольных импульсов (предположительно меандр) с периодом от 15-20 мС до 10 С.

Во время отсутствия входных импульсов в каком состоянии линия?
Может проще ловить фронты и считать длительность активного/не активного уровня?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.