MC14490 -аппаратный подавитель дребезга контактов (кнопок, энкодеров, герконов,итп)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Потестил микросхемку mc14490 это шестиканальный аппаратный подавитель дребезга,

удобно применять когда нет возможности (или желания:) делать это программно. У меня есть специальный убитый энкодер для тестинга алгоритмов дребезгоподавления, в этот раз тоже использовал его. На осциллограмме -жёлтым цветом сигнал на входе микросхемы (исходный с энкодера), синим - на выходе микросхемы.

Как видно по картинке -результат идеален.  Можно сравнить с работой конденсатора, снимал ранее осциллограммы с тем-же энкодером:

Исходный сигнал без дребезгоподавления:

и сигнал с подавлением дребезга конденсатором (10кОм/0,1мкф):

 

Есть ещё эффективное решение  для кнопок с переключающемися контактами. Стоит о нём упомянуть мимоходом. Кнопки подойдут например такие:

 

С ними можно использовать RS-триггер, который обеспечит 100% отсутствие дребезга. Для желающих узнать подробности можно почитать тут. Я собирал схему из статьи (рис1.2 (а), работает идеально. Но удобнее взять готовый RS-триггер.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Да. Эту микросхему ещё Джек Хасл упоминал. Правда, дорогущая, сволочь!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ЕвгенийП, ну если 150 руб за пять штук дорого... то да :)

axill
Offline
Зарегистрирован: 05.09.2011

Любопытная штука и скрупулезный подход вызывает уважение
Респект автору

Но вот ИМХО в практическом смысле совершенно не нужная вещь. Это вещь эпохи элементарной логики. В том и соль МК, что очень многое можно решить программно с простыми схемными решениями. А так очень многое из того, что делают на МК когда то делали на микросхемах логики

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

axill, мне вот понадобилось :). Всяко ж бывает. Я например очень люблю сажать кнопки и энкодеры на прерывания, вот нравится, и всё тут. А в прерываниях затруднительно программно устранить дребезг. И при отладке программы временно подключить кнопки куда-то, без лишних заморочек, тоже удобно.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

dimax пишет:

ЕвгенийП, ну если 150 руб за пять штук дорого... то да :)

Во, блин! А я её только вот здесь видел - за 1230 р./шт. А сейчас посмотрел на али, так там и 5 штук за 133 рубля есть :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

dimax пишет:

axill, мне вот понадобилось :). Всяко ж бывает. Я например очень люблю сажать кнопки и энкодеры на прерывания, вот нравится, и всё тут. А в прерываниях затруднительно программно устранить дребезг. И при отладке программы временно подключить кнопки куда-то, без лишних заморочек, тоже удобно.

А програмный RS-тригер, сбрасываемый таймером по установленной максимальной частоте, и прерыванием по переднему/заднему фронту (в зависимости что ловить нажатие или отпускание) почему не нравится?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

faeton, иногда пользуюсь, но всё же  тяготею к аппаратным решениям, ибо железячник я, а не программист :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

dimax пишет:

faeton, иногда пользуюсь, но всё же  тяготею к аппаратным решениям, ибо железячник я, а не программист :)

dimax ,  я тоже за "железо" , делал на SN74HC14N , но там "обвеса" на каждый канал много....
никак не могу "победить" MC14490 :(
можешь выложить схему подключения на 6 кнопок ?
спасибо :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SU-27-16, схемы то нет как таковой, на второй странице даташита распиновка.   6 входов, 6 выходов, 2 питания и две ноги для конденсатора. Я брал ёмкость 100пик. Никаких граблей не было.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо :)
и всё ?!!!!!!!!!!!! чЮдесно !
а за что отвечает конденсатор ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Задаёт минимальное время входящего импульса (нажатие-отпускание кнопки). 100 пик это для быстрого вращения энкодера, для простой кнопки можно взять поболее.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

понял , спасибо :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

dimax пишет:

Задаёт минимальное время входящего импульса (нажатие-отпускание кнопки). 100 пик это для быстрого вращения энкодера, для простой кнопки можно взять поболее.

У этой микросхемы есть одна засада - даёт сдвиг фазы. Если её использовать как очиститель энкодера положения двигателя, то уведёт в сторону. :)

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

dimax спасибо за проделанную работу. В принципе у меня энкодер тоже в проекте на прерывании по вашей методике изложенной на этом форуме. Работает практически идеально, в подавлении дребезга RC цепь. Но иногда всетаки бывает проскочет дребезг, а с микросхемой  смотрю вообще идеально. 

Из тех магазинов где я покупаю есть здесь в DIP и SOP крпусах, но дороговато от 100 до 133 за штуку.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Andrey12 пишет:

dimax спасибо за проделанную работу. В принципе у меня энкодер тоже в проекте на прерывании по вашей методике изложенной на этом форуме. Работает практически идеально, в подавлении дребезга RC цепь. Но иногда всетаки бывает проскочет дребезг, а с микросхемой  смотрю вообще идеально. 

Из тех магазинов где я покупаю есть здесь в DIP и SOP крпусах, но дороговато от 100 до 133 за штуку.

Вы искать на али не умеете? :)))

30р за шт: http://ru.aliexpress.com/item/MC14490-10pcs-lot-in-stock-can-pay/3247452...

 

http://ru.aliexpress.com/af/mc14490.html?ltype=wholesale&d=y&origin=n&is...

MacSim
Offline
Зарегистрирован: 28.11.2012

благодарю за информацию.

интересно, а что если выход 1 соеденить со входом 2, выход 2 со входом 3 и т.д. ... в 6 раз чище будет :-) >VJH

axill
Offline
Зарегистрирован: 05.09.2011

dimax пишет:

axill, мне вот понадобилось :). Всяко ж бывает. Я например очень люблю сажать кнопки и энкодеры на прерывания, вот нравится, и всё тут. А в прерываниях затруднительно программно устранить дребезг. И при отладке программы временно подключить кнопки куда-то, без лишних заморочек, тоже удобно.

на прерываниях дребезг отрабатывать еще проще в паре с таймером

но дело сугубо личное) нравится если почему нет?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

axill пишет:

dimax пишет:

axill, мне вот понадобилось :). Всяко ж бывает. Я например очень люблю сажать кнопки и энкодеры на прерывания, вот нравится, и всё тут. А в прерываниях затруднительно программно устранить дребезг. И при отладке программы временно подключить кнопки куда-то, без лишних заморочек, тоже удобно.

на прерываниях дребезг отрабатывать еще проще в паре с таймером

но дело сугубо личное) нравится если почему нет?

Да, только грамотно делать надо, ибо нагрузить проц прерываниями непрерывными можно. :)

1. Cчётчик дребезга кнопки в X при инициализации
2. Настроить прерывание кнопки по изменению состояния
3. В обработчике прерывния кнопки: запретить в маске прерыване кнопки, установить счётчик дребезга, в X, записать в переменную флаг состояния кнопки.
4. В обработчике прерывания таймера: если счётчик дребезга не ноль, -- ему, иначе разрешить в маске прерывание кнопки.

Если необходимо с захватом ловить нажатие, в.2 разрешить прерывание по переднему фронту, если необходимо ловить отпускание - по заднему фронту и не забывать в коде сбрасывать флаг кнопки после его восприятия.

axill
Offline
Зарегистрирован: 05.09.2011

Все намного проще. При срабатывании прерывания по нажатию выставляем обратный отсчет на 200-400мсек, я для этого использую отдельную переменную. Внутри прерывания таймера если переменная не ноль я считаю ее в минус. Если за время этого счета снова срабатывает прерывание по нажатию, то счетчик переустанавливается и начинаем отсчет заново

как только досчитали до нуля смотрим - нажата ли кнопка? Если да, то ставим флаг "нажата". Флаг обрабатываем в loop(). После обработки там же его сбрасываем

По коду это получается буквально 6 строчек кода

если чуть кода добавить можно выделить долгое нажатие или двойное нажатие

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

axill пишет:

Все намного проще. При срабатывании прерывания по нажатию выставляем обратный отсчет на 200-400мсек, я для этого использую отдельную переменную. Внутри прерывания таймера если переменная не ноль я считаю ее в минус. Если за время этого счета снова срабатывает прерывание по нажатию, то счетчик переустанавливается и начинаем отсчет заново

как только досчитали до нуля смотрим - нажата ли кнопка? Если да, то ставим флаг "нажата". Флаг обрабатываем в loop(). После обработки там же его сбрасываем

По коду это получается буквально 6 строчек кода

если чуть кода добавить можно выделить долгое нажатие или двойное нажатие

Похоже, Вы этого не делали и рассуждаете теоритически. :) Во-первых, прерывания бывают разные по сигналу на ноге проца: по переднему фрону, по заднему фронту, по изменению состояния, по высокому и по нихнему уровню. Во-вторых, если юзверь будет держать кнопку нажатой, то неверно установденный тип прерывания - не по фронту или изменению состояния, по уровню, будет генерироваться постоянно и Вы задушите проц этим. В-третьх, вы описали режим защёлки, с мануальным сбрасыванием состояния кнопки. Такая система не катит для организации буфера клавиатуры, для отслеживания длинного нажатия, для автоповтора нажатия. :) Читайте ещё раз мой алгоритм. :)

axill
Offline
Зарегистрирован: 05.09.2011

faeton пишет:

Похоже, Вы этого не делали и рассуждаете теоритически. :) Во-первых, прерывания бывают разные по сигналу на ноге проца: по переднему фрону, по заднему фронту, по изменению состояния, по высокому и по нихнему уровню. Во-вторых, если юзверь будет держать кнопку нажатой, то неверно установденный тип прерывания - не по фронту или изменению состояния, по уровню, будет генерироваться постоянно и Вы задушите проц этим. В-третьх, вы описали режим защёлки, с мануальным сбрасыванием состояния кнопки. Такая система не катит для организации буфера клавиатуры, для отслеживания длинного нажатия, для автоповтора нажатия. :) Читайте ещё раз мой алгоритм. :)

взаимно, читайте )

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Andrey12 пишет:

Из тех магазинов где я покупаю есть здесь в DIP и SOP крпусах, но дороговато от 100 до 133 за штуку.

Какая-то у Вас не "пацанская" цена. Я вон в посте №5 давал ссылку на рассово-правильную цену.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ЕвгенийП пишет:

Andrey12 пишет:

Из тех магазинов где я покупаю есть здесь в DIP и SOP крпусах, но дороговато от 100 до 133 за штуку.

Какая-то у Вас не "пацанская" цена. Я вон в посте №5 давал ссылку на рассово-правильную цену.

Просто частенько беру в выше указанном магазине, а то что скидывают ссылки вот по 3 рубля пучек, там и рейтинги ниже 98%. Бегай потом думай или руки из жопы или просто пластмасску с ножами без кристалла прислали :-)

Но ради интереса куплю, не по пацанской цене конечно, но 100 р на хобби не жалко, прикуплю в очередную закупку.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Привет всем!

Спасибо Dimax за хорошую инфу.
Надо будет закупить и попробовать.
MC14490 разгружает мозги Arduino, но в плане стоимость/эффективность, ИМХО, может проигрывать простым  RC цепочкам. Может, даже и в плане надежности уступать, поскольку требует источника питания и тактовых сигналов от встроенного генератора ( Internal Oscillator (R-C), or External Clok Source).
Не нашел в даташите про ток потребления :((( , что может быть критичным для некоторых пользователей

И про самый "больной" вопрос о двойных, тройных и х.з. сколькоразовых нажатий не увидел инфы в обсуждениях...

Удачи всем!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Олег М, потребление "quiescent current" последняя строчка в таблице на стр.3  

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

dimax пишет:
Олег М, потребление "quiescent current" последняя строчка в таблице на стр.3

Спасибо. Узрел...
Да, потребление очень малое.

Как я понял, задержки вкл/вЫкл здесь регулируются частотой генератора/oscillator-а  и одинаковые для всех каналов/кнопок.

takeda
Offline
Зарегистрирован: 13.11.2018

Прошу подсказать, как её монтировать. Где GND? Почему два входных напряжения? Было бы здорово посмотреть схему

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

takeda пишет:

Где GND? Почему два входных напряжения?

Почитайте Обозначение цепей питания в иностранных материалах

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Вспомнил про эту тему, и обратил внимание, что почему-то мы никогда не рассматривали вариант переключающей кнопки и программного RS-триггера. Ну, если конечно не жалко на одну кнопку отдать два пина :)

Иногда в проектах  свободных ног остаётся полно, и просто грех не воспользоваться. Схема проста, даже подтяжки можно не делать, сгодится внутренняя.

 

RS-триггер программно делается буквально двумя строчками.

#define On 0x1
#define Off  0x2
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
}

void loop() { 
static uint8_t state=Off;
if (  state==On  && ((PINC&3)==Off)) {state=Off; Serial.println("Off");}
else if (  state==Off  && ((PINC&3)==On)) {state=On;Serial.println("On");}

 }

И получаем идеальный результат, в принципе не имеющей дребезга даже на самых раздолбаных кнопках )

Logik
Offline
Зарегистрирован: 05.08.2014

Вот это верно.

А то..

dimax пишет:

...  тяготею к аппаратным решениям, ибо железячник я, а не программист :)

Прогресс однако на лицо! :) 

На обычном, не переключающем, контакте при правильном, не спешном ;)   подходе все тоже очень просто.

SLKH
Онлайн
Зарегистрирован: 17.08.2015

dimax пишет:

Вспомнил про эту тему, и обратил внимание, что почему-то мы никогда не рассматривали вариант переключающей кнопки и программного RS-триггера. Ну, если конечно не жалко на одну кнопку отдать два пина :)

Иногда в проектах  свободных ног остаётся полно, и просто грех не воспользоваться. Схема проста, даже подтяжки можно не делать, сгодится внутренняя.

 

RS-триггер программно делается буквально двумя строчками.

#define On 0x1
#define Off  0x2
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
}

void loop() { 
static uint8_t state=Off;
if (  state==On  && ((PINC&3)==Off)) {state=Off; Serial.println("Off");}
else if (  state==Off  && ((PINC&3)==On)) {state=On;Serial.println("On");}

 }

И получаем идеальный результат, в принципе не имеющей дребезга даже на самых раздолбаных кнопках )

На самом деле две строчки программного RS-триггера ещё проще:

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
}

void loop() {
  static bool state = false; // кнопка не нажата
  if (!digitalRead(A0)) state = false;
  if (!digitalRead(A1)) state = true;
  Serial.println(state);
}

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SLKH, так это то ж самое, но без сохранения предыдущего состояния. А я его специально делал, что б выводить в сериал именно в момент изменения.

SLKH
Онлайн
Зарегистрирован: 17.08.2015

dimax пишет:

SLKH, так это то ж самое, но без сохранения предыдущего состояния. А я его специально делал, что б выводить в сериал именно в момент изменения.

так сохраняется оно - на то и RS-триггер; 2 единицы на входах триггер не опрокидывают.

Можно затолкать 2 строки в функцию, передавать параметрами номера пинов.

а Пух может класс написать на 3 страницы...  

============

основная проблема - необходимость перекидной кнопки. при отсутствии лишних пинов к ней кмоп-повторитель прицепить - и тоже "получаем идеальный результат"

К слову, у меня когда-то прикольные бездребезговые кнопки были: в каждой перекидной контакт и микросхема в планарном (как у серии 164) корпусе, без маркировки.