реклама на сайте
подробности

 
 
> Фильтр для выделения прямоугольных импульсов
mempfis_
сообщение May 14 2012, 08:24
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Всем добрый день.
При разработке нового прибора возникли проблемы с подсчётом прямоугольных импульсов на входе процессор.
Стоит задача подсчитать кол-во прямоугольных импульсов (предположительно меандр) с периодом от 15-20 мС до 10 С. Входные импульсы ограниченные амплитудой 3В через диод подаются на параллельную RC-цепочку 100k 0,1uF. RC-цепочка одним входом подключена напрямую к ножке процессора (LPC17) а вторым на землю. На пине процессора отключены pullup/pulldown.
В лабораторных условиях подсчёт импульсов происходит точно. При установке аппарата на транспортное средство появляется значительный пересчёт.
Импульсы считаются программно - идёт выборка состояния пина раз в 2 мС, выполняется медианная фильтрация настроенная на фиксацию импульсов от 10 мС (т.е. буффер на 9 отсчётов).
Источник проблемы пока не выяснен, поэтому стоит задача программно обойти проблему. Как я вижу медианной фильтрации недостаточно (или она неправильно настроена). Поэтому вопрос к тем кто сталкивался с подобной задачей - есть ли какие-либо программные фильтры для подобных задача? Поделитесь плиз ссылкой или идеей. Заранее благодарен за любую инфу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
mihalevski
сообщение May 14 2012, 08:42
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 20-05-10
Из: Omsk
Пользователь №: 57 391



Цитата(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 мс может на коротких периодах дать ошибку. На больших периодах ошибка в другом.


Сообщение отредактировал mihalevski - May 14 2012, 08:49
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 14 2012, 09:01
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



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


Реально на вход подаются импульсы от 50 мС и выше. Раньше стояла фильтрация оптимизированная под 5 мС (выборка раз в 1 мС + медианный фильтр). Увеличение периода выборки не спасло ситуацию. Не хочется экспериментировать с разными фильтрами т.к. заказчик находится в другом городе, тестируемые приборы у него, перепрошивка только дистанционная. А в на своём рабочем месте я не могу создать условия, близкие к реальным рабочим.
Go to the top of the page
 
+Quote Post
=AK=
сообщение May 14 2012, 09:26
Сообщение #4


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(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 - устанавливайте ее в единицу.
Go to the top of the page
 
+Quote Post
kovigor
сообщение May 14 2012, 09:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(mempfis_ @ May 14 2012, 12:01) *
... заказчик находится в другом городе, тестируемые приборы у него, перепрошивка только дистанционная. А в на своём рабочем месте я не могу создать условия, близкие к реальным рабочим.


Берите хороший цифровой осциллограф и езжайте к заказчику на объект (в командировку). От борьбы неизвестно с чем толку не будет, поверьте ...
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 14 2012, 10:05
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(=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 мС возможно ли улучшение работы?
Go to the top of the page
 
+Quote Post
=AK=
сообщение May 14 2012, 11:09
Сообщение #7


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(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мС.

Вы опять говорите о медианном фильтре. Вы что, сигнал при помощи АЦП получаете, что ли? Вы, наверное, в книгу рекордов Гиннеса хотели попасть?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 14 2012, 11:38
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 14 2012, 15:43
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(=AK= @ May 14 2012, 14:09) *
Интересно, куда на плате подключен земляной вывод супрессора. Если разводка земли некачественная, то из-за супрессора по земле могут бегать серьезные помехи.

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


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


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

Увеличил период до 20 мС. Ввёл некоторый контроль длительности как самого импульса так и его HIGH-части.
Жаль нет возможности уменьшить конденсатор т.к. платы далеко.
Посмотрим на результаты испытаний....
Всем спасибо за ответы.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 14 2012, 16:47
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

Поскольку разрядность счётчиков невелика, можно подумать про вертикальные счётчики, допилив их до реверсивных, использовав маску входов как up/down а не как вход счёта. Работы немного. Сэкономит малость ОЗУ.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение May 14 2012, 16:48
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(mempfis_ @ May 14 2012, 18:43) *
Про разводку платы и её качество ничего сказать не могу. Думаю что разведено нормально - схемотехник опытный.


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

А почему стесняетесь у этого "опытного схемотехника" спросить, под что он параметры этой входной цепи рассчитывал? Тут либо опытный (и у Вас что-то в софте некорректно, а на железо Вы зря наговариваете), либо не совсем-то он опытный и RC с потолка у него в схеме взято.
Пока не поймете что он хотел сказать этой схемой- счастья не будет. Может, есть еще помехи, которых Вы в течении года не увидите, а у него по техзаданию это описано.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 14 2012, 17:27
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Вот такое:
Прикрепленное изображение

отбегало на нескольких сотнях такси более десяти лет, пока не выпало из перечня.
Да, схема посложнее, но дальше это шло прямо на вход T1 контроллера AT89C55 и считало аппаратным таймером.
Питание и земля компаратора взято с питания процессора (ушло по схеме вправо), POW5V — всё кроме процессора и фискалки — отдельным стабилизатором и отдельной землёй на входную точку массы.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 14 2012, 19:07
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



p.s. Немного врет схема — это что дома нашлось. Всё так, только номиналы были немного другие, тут гистерезис около полувольта, а в окончательной, насколько я помню, было увеличено почти до вольта с соответствующей коррекцией и входного делителя.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
=AK=
сообщение May 14 2012, 22:20
Сообщение #14


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(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
Go to the top of the page
 
+Quote Post
zombi
сообщение May 15 2012, 10:02
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



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

5 баллов! biggrin.gif


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

Во время отсутствия входных импульсов в каком состоянии линия?
Может проще ловить фронты и считать длительность активного/не активного уровня?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016