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

 
 
 
Reply to this topicStart new topic
> Антидребезг контакта., Как сделать?
Iptash
сообщение Jul 22 2011, 17:59
Сообщение #1


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Здравствуйте все.
Есть входной сигнал с плохим фронтом, поэтому происходит дребезг. Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится, потому что видимо dreb и ndreb не обнуляются и соответственно сигнал zap
который я дальше использую не работает. Алгоритм такой. Приходит внешний сигнал IN, включается счетчик dreb и
пока не досчитает до 1000 zap будет вкл. тем самым исключая ложное срабатывание zap .
Но код какой то кривой и задний фронт вроде не коректно отрабатывает. Подскажите пожалуйста как это лучше сделать или может подправите?
Код
always @ (posedge clock1) begin
  if(IN) begin // внешний сигнал
    if(dreb == 0) begin
     zap <= 1'b1; // сигнал после фильтрации, используется дальше
     ndreb <= 0;
    end
    
  end
  
   if(zap)
    dreb <= dreb + 1'b1;
  
   if(dreb > 1000) begin
    zap <= 1'b0;  
   end
  
   if(!IN) begin
    if(ndreb == 0) begin
     nzap <= 1'b1;
     dreb <= 0;
    end
    
    end
   if(nzap)
    ndreb <= ndreb + 1'b1;
   if(ndreb > 1000) begin
    nzap <= 1'b0;      
   end
end
Go to the top of the page
 
+Quote Post
sazh
сообщение Jul 23 2011, 06:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Iptash @ Jul 22 2011, 20:59) *
Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится,


Если задний фронт должен отрабатывать, в минус наверно надо считать.
Для примера.
Прикрепленные файлы
Прикрепленный файл  digital_filter.v ( 894 байт ) Кол-во скачиваний: 71
 
Go to the top of the page
 
+Quote Post
Iptash
сообщение Jul 23 2011, 07:02
Сообщение #3


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(sazh @ Jul 23 2011, 10:04) *
Если задний фронт должен отрабатывать, в минус наверно надо считать.
Для примера.

Да, действительно. Спасибо.
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Jul 23 2011, 18:34
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Цитата(Iptash @ Jul 22 2011, 20:59) *
Подскажите пожалуйста как это лучше сделать...

Подойдет сдвиговый регистр,например на 16 разрядов, и небольшая FSM на несколько состояний.
Подбирается тактовая частота для FSM, и внутри FSM тактируется сдвиговый регистр, на младший разряд которого подается входной сигнал.
Когда сигнала нет, и он нулевой, то в регистре будет 16'h0000. Когда в регистре будет 16'h7fff, то переходной процесс с дребезгом уже закончился. Все остальные комбинации регистра игнорируются. FSM контролирует только эти два состояния регистра и что-то делает, когда в регистре появится код 16'h7fff.
Важно правильно подобрать тактовую частоту.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Jul 25 2011, 21:11
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(Iptash @ Jul 22 2011, 21:59) *
Есть входной сигнал с плохим фронтом, поэтому происходит дребезг. Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится, потому что видимо dreb и ndreb не обнуляются и соответственно сигнал zap

Я использую вот такой антидребезг:
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity deglitch is
    generic(count:integer:=100);
    port(
        clk, rst, ce:std_logic;
        d:std_logic;
        q:out std_logic
    );
end entity;

architecture rtl of deglitch is
signal cnt:integer range 1-count to 0;
signal sig0, sig1, sig2:std_logic;
begin
process(clk,rst) is begin
if rst = '1' then
    cnt <= 0; sig0<='0'; sig1<='0'; sig2<='0';
elsif rising_edge(clk) then
    sig0 <= d; sig1 <= sig0; sig2 <= sig1; --eliminate metastability
    if sig2 = '1' then
        cnt <= 1-count;
    end if;
    if cnt < 0 and ce = '1' then
        cnt <= cnt+1;
    end if;
end if;
end process;
q <= '1' when cnt < 0 else '0';
end rtl;

Обратите внимание, как делать эффективный счётчик(всё будет работать на очень высокой тактовой частоте).
Сигнал CE позволяет уменьшить разрядность счётчиков в каждой из антидребезжалок, подключив их к дополнительному общему счётчику.

UPD: очень полезно публиковать исходникиsm.gif, так как изначально я перезапускал счётчик по фронту, а надо по уровню. Иначе он будет давать второй ложный фронт на дребезге на отпускании кнопки. Странно, что не заметил, правда я с этим только слегка игрался на evaluation board.


Сообщение отредактировал Timmy - Jul 26 2011, 06:00
Go to the top of the page
 
+Quote Post
Ethereal
сообщение Jul 29 2011, 14:05
Сообщение #6


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

Группа: Свой
Сообщений: 114
Регистрация: 7-05-08
Из: РФ, Москва
Пользователь №: 37 354



Цитата(Iptash @ Jul 22 2011, 21:59) *
Здравствуйте все.
Есть входной сигнал с плохим фронтом, поэтому происходит дребезг. Написал антидребезговый блок, так в принципе работает не плохо,
но иногда при включении стопорится,

Внешних (для ПЛИС) сигналов в коде быть не должно. In нужно пропустить через >=2 последовательных регистра (в качестве примера смотрите код Timmy), и уже этот сигнал использовать в логике подавления. Иначе при попадании клока на фронт входного сигнала модуль может застопориться даже при нормальном коде.


--------------------
SystemVerilog - язык, заточенный Альтерой под свои кристаллы теми же приемами использования примитивов, что и AHDL. ©
Go to the top of the page
 
+Quote Post
Iptash
сообщение Jul 29 2011, 17:13
Сообщение #7


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(Ethereal @ Jul 29 2011, 18:05) *
Внешних (для ПЛИС) сигналов в коде быть не должно. In нужно пропустить через >=2 последовательных регистра (в качестве примера смотрите код Timmy), и уже этот сигнал использовать в логике подавления. Иначе при попадании клока на фронт входного сигнала модуль может застопориться даже при нормальном коде.

Реакция на входной сигнал IN должно быть с точностью в один такт clock1 который воздействует на zap который защелкивается допустим на 1000тактов.
Эта часть работает прикрасно, у меня были проблемы с задним фронтом и взведением все в исходное. Это я тоже решил, сейчас блок антидребезга
работает очень хорошо и обрабатывает самые плохие фронты.
Спасибо.
Go to the top of the page
 
+Quote Post
privet
сообщение Aug 1 2011, 06:57
Сообщение #8





Группа: Новичок
Сообщений: 3
Регистрация: 30-07-11
Пользователь №: 66 498



если речь идет о дребезге контакта кнопочки, то не проще просто опрашивать ее редко?
Если надежный контакт устанавливается, скажем, 1мс, то тогда опрашивать можно, например, с периодом 10мс.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Aug 1 2011, 07:40
Сообщение #9


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(privet @ Aug 1 2011, 09:57) *
если речь идет о дребезге контакта кнопочки, то не проще просто опрашивать ее редко?
Если надежный контакт устанавливается, скажем, 1мс, то тогда опрашивать можно, например, с периодом 10мс.


имея вероятность 10% напороться на грабли.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
privet
сообщение Aug 1 2011, 09:16
Сообщение #10





Группа: Новичок
Сообщений: 3
Регистрация: 30-07-11
Пользователь №: 66 498



Цитата(Victor® @ Aug 1 2011, 11:40) *
имея вероятность 10% напороться на грабли.

не очень понял Вашу мысль про грабли, но попробую объяснить свое понимание проблемы.
Есть кнопка, поключенная ко входу. Человек, довольно редко нажимает на кнопки.
Предположим вход подтянут резиком к питанию, при замыкании кнопки вход оказывается в нуле.
Таким образом, сигнал с дребезгом контакта получается на входе вот такой:

11111111111111111111111111111111110110101110101100000000000000000000000000
--------не нажата--------------->|<--дребезг--->|<----------кнопка нажата
__^____________________^____________________^____________________^_______
редкий опрос


ИМНО, период опроса кнопки просто должен быть много больше длительности дребезга.
Даже если ОДИН момент опроса попадет внутрь интервала с дребезгом - это нормально.
При этом, что будет считано? Ноль или единица? - это не важно.
Если момент опроса в попадает в интервал дребезга и читается 0, то считаем, что нажали кнопку. Ну и правда, ведь нажали? Значение входа сейчас установится и будет стабильный ноль.
Если попали в интервал дребезга и считали 1, тоже нормально, считаем, что кнопка не нажата (ну и в самом деле - нажали не очень хорошо - контакт плохой). Уже следующий poll даст стабильный 0 и тогда уж точно определим нажатие кнопки.
При таком подходе точность определения момента нажатия определяется периодом опроса, но в большинстве случаев с кнопками это вполне приемлимо.
Всякие альтернативные методы в принципе тоже имеют свой "период фильтрации", только другие методы сложнее в реализации и требуют больше логики.
Go to the top of the page
 
+Quote Post
Iptash
сообщение Aug 1 2011, 09:27
Сообщение #11


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(privet @ Aug 1 2011, 10:57) *
если речь идет о дребезге контакта кнопочки, то не проще просто опрашивать ее редко?
Если надежный контакт устанавливается, скажем, 1мс, то тогда опрашивать можно, например, с периодом 10мс.

Я его не опрашиваю, он же у меня срабатывает по posedge в always. Это не кнопка, а выход компаратора.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Aug 1 2011, 09:50
Сообщение #12


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Iptash @ Aug 1 2011, 12:27) *
Я его не опрашиваю, он же у меня срабатывает по posedge в always. Это не кнопка, а выход компаратора.


кстати, а чего это компаратор дребезжит-то?


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Iptash
сообщение Aug 1 2011, 13:57
Сообщение #13


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(Victor® @ Aug 1 2011, 13:50) *
кстати, а чего это компаратор дребезжит-то?

Осциллографом смотрел, передний фронт на вых. компаратора где то 200нс от 0 -> 3,3в.. А быстродействие MAX II 200мгц, я фронт смотрел, задержка
распространения ~5нс.. Видимо несколько раз MAX II воспринимает вых. компаратора как 1 и 0, наверное все же шумы тоже есть. Блок антидребезга
поставил, работает идеально.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Aug 1 2011, 14:22
Сообщение #14


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Iptash @ Aug 1 2011, 16:57) *
Осциллографом смотрел, передний фронт на вых. компаратора где то 200нс от 0 -> 3,3в.. А быстродействие MAX II 200мгц, я фронт смотрел, задержка
распространения ~5нс.. Видимо несколько раз MAX II воспринимает вых. компаратора как 1 и 0, наверное все же шумы тоже есть. Блок антидребезга
поставил, работает идеально.


Так надо решать источник проблемы, а не следствие.
Что за компаратор? С гистерезисом?
По-скоростнее не думали компаратор взять?


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Iptash
сообщение Aug 1 2011, 16:02
Сообщение #15


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

Группа: Свой
Сообщений: 1 613
Регистрация: 2-09-08
Из: г.Набережные Челны
Пользователь №: 39 936



Цитата(Victor® @ Aug 1 2011, 18:22) *
Так надо решать источник проблемы, а не следствие.
Что за компаратор? С гистерезисом?
По-скоростнее не думали компаратор взять?

Компаратор LM211, резистор в ПОС стоит, поскоростнее AD8561 должны вот вот подойти. Но в принципе и с LM211 не плохо работает. По даташиту у
LM211 задержка распространения как раз 200нс.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 20:58
Рейтинг@Mail.ru


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