|
Фильтр для выделения прямоугольных импульсов |
|
|
|
 |
Ответов
(1 - 14)
|
May 14 2012, 08:42
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 14 2012, 09:26
|

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)  При установке аппарата на транспортное средство появляется значительный пересчёт. Надо полагать, помехи. А пиковый детектор редкие помехи не фильтрует, он их регистрирует.  Цитата(mempfis_ @ May 14 2012, 17:54)  Импульсы считаются программно - идёт выборка состояния пина раз в 2 мС, выполняется медианная фильтрация настроенная на фиксацию импульсов от 10 мС (т.е. буффер на 9 отсчётов). Если 9 отсчетов по 2мс, это 18мс получается, а не 10. Медианный фильтр - лишняя сущность. Используйте простой "антидребезговый" алгоритм: берите отсчеты раз в миллисекунду и вдвигайте их в однобайтный сдвиговый регистр; если в сдвиговом регистре все восемь бит равны 0 - устанавливайте выходную переменную в ноль, если все восемь бит равны 1 - устанавливайте ее в единицу.
|
|
|
|
|
May 14 2012, 10:05
|

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

|
Цитата(=AK= @ May 14 2012, 12:26)  То есть, у вас пиковый детектор на входе стоит. С постоянной времени разряда 100к*100n=10 мс и задним фронтом 2.2*R*C = 22мс. Надо полагать, помехи. А пиковый детектор редкие помехи не фильтрует, он их регистрирует.  Если 9 отсчетов по 2мс, это 18мс получается, а не 10. Схему составлял не я - возможно это есть пиковый детектор реагирующий на помехи. Я только программирую плату. Вот схема. Резистор сверху 4к7 подключён к +3В, снизу 100к. Конденсатор 0,1uF. диодная сборка BTA54. Значёк сапрессора не нашёл - заменил на закарлючку. Эта схема позволяет подавать на вход до 12В. Реагирует на подачу 0. Медианный фильтр просимулирован и работает корректно - сохраняет в буффер на место самого старого отсчёта новый, сортирует по возрастанию и возвращает 9/2=4 й элемент буффера - поэтому 5*2 = 10мС. Если ничего нельзя поменять в схеме то если я увеличу период фильтра до 20-30 мС возможно ли улучшение работы?
|
|
|
|
|
May 14 2012, 11:09
|

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мС. Вы опять говорите о медианном фильтре. Вы что, сигнал при помощи АЦП получаете, что ли? Вы, наверное, в книгу рекордов Гиннеса хотели попасть?
|
|
|
|
|
May 14 2012, 11:38
|

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

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

Профессионал
    
Группа: Свой
Сообщений: 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-части. Жаль нет возможности уменьшить конденсатор т.к. платы далеко. Посмотрим на результаты испытаний.... Всем спасибо за ответы.
|
|
|
|
|
May 14 2012, 16:47
|

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

|
Жуть. Зачем сортировать данніе, состоящие (после наложения маски) только из нулей и одинаковых значений, равных маске? Просто посчитать число не-нулей и вернуть маску, если число больше или равно половины длины массива, результат как при медиане. Хотя в этом не слишком много толку — если на входе для какой-то ноги будет идти 01010101 то и на выходе фильтра будет то же самое. Лучше внести гистерезис — взять число не-нулей и Код если (текущее_фильтрованное_состояние_ножки_равно_1 И число_не_нулей_меньше_трети_длины_массива) присвоить_0_текущему_фильтрованному_состоянию_ножки иначе если число_не_нулей_больше_двух_третей_длины_массива) присвоить_1_текущему_фильтрованному_состоянию_ножки эквивалентно тому, что в отсортированном массиве будет браться не средний элемент, а стоящий на трети или на двух третях в зависимости от текущего фильтрованного значения. А вместо кольцевого буфера значений и пересчёта числа не-нулей по маске по всему массиву маско входов каждый раз проще взять массив знаковых счётчиков для каждого пина и увеличивать/уменьшать значение счётчика в зависимсоти от 1/0 на входе. Ввести насыщение на величину, ориентировочно равную плюс/минус полудлине того массива, по которому медианили. Пороги гистерезиса взять плюс/минус треть от уровня насыщения. Тогда на каждую новую ножку нужна одна операция инкремента/декремента с насыщением её счётчика вместо того всего. Поскольку разрядность счётчиков невелика, можно подумать про вертикальные счётчики, допилив их до реверсивных, использовав маску входов как up/down а не как вход счёта. Работы немного. Сэкономит малость ОЗУ.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 14 2012, 16:48
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(mempfis_ @ May 14 2012, 18:43)  Про разводку платы и её качество ничего сказать не могу. Думаю что разведено нормально - схемотехник опытный. Цитата(mempfis_ @ May 14 2012, 18:43)  Как влияет сапрессор на вход тоже ничего сказать не могу. Моё мнение что проблема в параметрах входного фильтра - кажется завышена тау RC-цепочки и слишком затянут задний фронт. А почему стесняетесь у этого "опытного схемотехника" спросить, под что он параметры этой входной цепи рассчитывал? Тут либо опытный (и у Вас что-то в софте некорректно, а на железо Вы зря наговариваете), либо не совсем-то он опытный и RC с потолка у него в схеме взято. Пока не поймете что он хотел сказать этой схемой- счастья не будет. Может, есть еще помехи, которых Вы в течении года не увидите, а у него по техзаданию это описано.
|
|
|
|
|
May 14 2012, 22:20
|

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 переменной текущего состояния пинов с результатом фильтрации. И всё. Вы мне живо напомнили некого студента, который задачу "определить, четное число или нечетное" решал так: завел два массива по миллиону слов, при инициализации заполнил их от счетчика по очереди, в один массив - четные, во второй - нечетные; для определения четное или нечетное число производил скоростной поиск сначала в одном массиве, затем в другом, если находил число - выдавал результат, если не находил - выдавал ошибку.
|
|
|
|
|
May 15 2012, 10:02
|

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

|
Цитата(=AK= @ May 15 2012, 01:20)  задачу "определить, четное число или нечетное" решал так: завел два массива по миллиону слов, при инициализации заполнил их от счетчика по очереди, в один массив - четные, во второй - нечетные; для определения четное или нечетное число производил скоростной поиск сначала в одном массиве, затем в другом, если находил число - выдавал результат, если не находил - выдавал ошибку.  5 баллов! Цитата(mempfis_ @ May 14 2012, 11:24)  Стоит задача подсчитать кол-во прямоугольных импульсов (предположительно меандр) с периодом от 15-20 мС до 10 С. Во время отсутствия входных импульсов в каком состоянии линия? Может проще ловить фронты и считать длительность активного/не активного уровня?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|