Можно ли использовать только конденсатор для устранения дребезга кнопки?

Мне было интересно: почему вы не можете просто подключить конденсатор к кнопке, чтобы устранить дребезг? Я выяснял, как уменьшить работу, которую должен выполнять мой микропроцессор, но у меня очень ограниченное пространство на печатной плате, которую я разрабатываю, поэтому я не хочу делать полноценную схему подавления дребезга, которая усложнила бы конструкцию.


схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab


Это пример схемы; извините за любые ошибки (я не умею проектировать схемы с конденсаторами). Будет ли это вообще работать? Что касается переключателя тактов, я не смог найти такого, который соответствовал бы тому, что он есть в реальной жизни, но в этой ситуации он работает. Кнопка похожа на ту, что здесь . D10означает Digital Pin 10, но это не имеет значения; это просто означает вход Arduino. Я также не знаю, какого размера конденсатор мне понадобится, поэтому, если эта схема работает, какой размер мне нужен?


Опять же, я просто пытаюсь упростить это, чтобы упростить сборку, не прибегая к программному устранению дребезга. Судя по тому, как работают конденсаторы, кажется, что это сработает, но также может заставить кнопку нажиматься дольше / задерживать ее, если емкость слишком велика. Они обычно используются для «сглаживания» шума в источниках питания, так что не похоже ли это на «сглаживание» дребезга? Любые модификации схемы, чтобы она работала (при необходимости), также будут оценены.

Вот где мы обсуждали это раньше: electronics.stackexchange.com/questions/6884/…
Вы понимаете, что можно устранить дребезг ввода, просто опрашивая его с интервалом не менее 50 мс? Меньше работы для вашего адуино :)
50 миллисекунд хватило бы - хорошая мысль, мистер О.
@ Andyaka Я видел это, но это было то, использовать ли аппаратное или программное обеспечение, а не то, как использовать наименьшее количество деталей, но в этом есть несколько хороших моментов.
@WoutervanOoijen Итак, вы имеете в виду, когда он впервые обнаруживает «высокий уровень», затем делает, delay()50;а затем делает все, что вам нужно? (загораются светодиоды и т. д.)
Нет, я имею в виду опрос с интервалом не менее 50 мс, и делайте все, что вам нужно, в соответствии с обнаруженным вами уровнем.
@AnnonomusPerson - задержка () в однопоточной среде означает, что больше ничего не может произойти. Хотя это один вариант, другой — выполнять другую полезную работу, пока не придет время проверить снова.
Я согласен с ответом Воутера - просто проверяйте переключатель каждые ~ 50 мс. Тем не менее, я думаю, что ваша схема выше работала бы лучше, если бы резистор был между переключателем и конденсатором, тогда это RC-цепь, и вы можете рассчитать постоянную времени, чтобы получить хорошее устранение дребезга.

Ответы (3)

Это зависит от состояния переключателя по умолчанию. Конденсатор будет заряжаться только тогда, когда вы подадите на него положительное напряжение. Обычно во встроенной среде мы используем подтягивание, чтобы придать контакту высокое состояние по умолчанию и соединить переключатель с землей. Добавление конденсатора здесь не поможет, потому что он не будет «сохранять» состояние земли.

Тем не менее, вы также можете использовать раскрывающийся список. Это будет означать, что вывод по умолчанию низкий. Поставив высокий уровень, нажав переключатель, зарядит конденсатор. После отпускания конденсатор некоторое время будет держать вывод высоким, так что да, это сработает. Я не уверен, достаточно ли 1 мкФ, слишком мало или слишком много, я бы порекомендовал вам посмотреть с помощью прицела и немного попробовать.

Итак, если бы я изменил +и -это сработало бы?
@AnnonomusPerson это зависит. Каково состояние переключателя по умолчанию?
Вы имеете в виду, когда он не нажат, проводит ли он электричество? Если это то, что вы имеете в виду, я могу сделать это в любом случае из-за характера переключателя, который я использую. Глядя на ссылку в моем вопросе, когда не нажата, кнопка ведет от top left to the bottom leftи the top right to the bottom right. При нажатии ведет от top left to the bottom right, а от top right to the bottom left.
Хорошо. Это будет означать, что вы по умолчанию хотите, чтобы вывод был низким. Переключатель должен соприкасаться с +, чтобы конденсатор зарядился до того, как вы отпустите кнопку.
Извините, я сейчас в замешательстве. Вы сказали, что хотите, чтобы контакт был низким по умолчанию (что я понимаю, когда он не нажат), но он должен контактировать с + (что означает, что он должен выводить высокий уровень, когда он не нажат)? Разве это не два разных утверждения или я неправильно читаю? Еще один момент: резистор и конденсатор на своих местах? Это было одним из моих самых больших сомнений, почему это не сработает.
@AnnonomusPerson Нет, переключатель должен контактировать с +. Это своего рода жаргон для того, к чему будет подключаться переключатель при нажатии . Конденсатор на месте. Резистор было бы лучше подключить от земли к контакту ввода-вывода напрямую.
В чем проблема с использованием резистора между выходом переключателя и конденсатором? Когда переключатель нажат, он будет медленно заряжать конденсатор, когда он не нажат, он медленно разряжает его. Эффект кратковременных скачков будет ограничен резистором.

Я думаю, что в принятом ответе говорилось, что вы можете использовать трюк RC только для устранения дребезга переключателя, привязанного к низкому уровню, но я думаю, что это неправда. Вы можете сделать это и на высоком уровне. Вот схемы. Существует настоящая Библия против подпрыгивания , в которой рекомендуются следующие схемы:

RC устраняет дребезг, R1 привязан к высокому уровню, срабатывание переключателя заземляет его.  Однако есть конденсатор, параллельный переключателю с землей, и R2, соединяющий переключатель с конденсатором и логическим элементом, который вы хотите запитать.  Здесь показан инвертор, но это может быть буфер или любой вход логического элемента.

RC устраняет дребезг, R1 привязан к высокому уровню, срабатывание переключателя заземляет его. Однако есть конденсатор, параллельный переключателю с землей, и R2, соединяющий переключатель с конденсатором и логическим элементом, который вы хотите запитать. Здесь показан инвертор, но это может быть буфер или любой вход логического элемента.

Когда C полностью заряжен, и вы нажимаете переключатель, заряд будет стекать через R2, надеюсь, до тех пор, пока переключатель не установится, прежде чем вы достигнете низкого логического уровня на входе.

Когда C полностью разряжен и вы размыкаете переключатель, C будет заряжаться через R1 + R2, пока не будет достигнут высокий логический уровень.

Поскольку нормальный высокий логический уровень TTL при 2 В относительно низок по сравнению с низким логическим уровнем 0,8 В, имеет смысл, что R1 + R2 будет увеличивать время заряда, чем время разряда только через R2.

Использование входа с триггером Шмитта приведет к повышению логического уровня до 4 В (что некоторые источники могут даже не срабатывать надежно, но переключатель может).

Сейчас я попробую это на своем макете и (аналоговом) прицеле. Надеюсь, я смогу увидеть отскоки на канале 1 для срабатывания, и надеюсь, что смогу увидеть это без области хранения. Но я также могу использовать 4-битный счетчик 74LS161 для обнаружения отказов. И о чудо, у меня под рукой есть шестигранный инвертор 74LS04 TTL и шестигранный инвертор с триггером Шмитта 74LS14, с которыми можно поиграться.

Обновление: экспериментальные результаты

Поскольку у меня нет цифрового запоминающего осциллографа, я вообще не мог его использовать. Вместо этого я использовал счетчик 74LS161 с 4 светодиодами и просто слежу за тем, чтобы каждое срабатывание переключателя считало ровно одно приращение.

Я ясно вижу упругость переключателя. Итак, базовая линия положительна, а это означает, что я смогу сказать, когда мои контрмеры будут эффективны.

Я не смог найти комбинацию R1, R2 и C, которая работала бы, когда у меня есть обычный TTL-вход на 74LS04. Тем не менее, с входом триггера Шмитта 74LS14 у меня есть довольно хорошая настройка, когда R1 и R2 оба равны 1 кОм, а C = 1 мкФ или лучше даже 4,7 мкФ. Очевидно, это зависит и от коммутатора.

Я нашел несколько переключателей с резиновыми кнопками, у которых было слишком высокое внутреннее сопротивление, чтобы они не могли достаточно снизить входное напряжение. С двумя переключателями среднего качества я насчитал несколько запусков из 16, и у меня было только несколько сбоев с 100 нФ, 1 мкФ и ни одного с 4,7 мкФ.

С обычным входом TTL я не мог заставить его работать.

Однако, если ваш вход представляет собой Arduino, вы можете перепроверить, что на самом деле его цифровые входы могут быть триггерами Шмитта, и поэтому вы можете справиться с R1 и R2, оба 1 кОм и C = 1 мкФ и, возможно, даже 100 нФ.

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

Для этого вам понадобится триггер Шмитта. Сомневаюсь, что даже CMOS работает.

Вот короткое видео от TI (они должны знать) о том, что здесь нужен триггерный инвертор Шмитта.

А вот альтернативная схема с триггером Шмитта , которая тем более интересна, что не требует конденсатора.

введите описание изображения здесь

Тем не менее, я попробовал это и обнаружил, что это не работает. Просто не работает.

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

введите описание изображения здесь

Я пробовал это, и это не работает ни в этом волшебном пути. Это почти работает, но двойное срабатывание у меня все равно происходит гораздо чаще, чем с RC 1k/1k/100nF и триггером Шмитта. Кроме того, если я использую эту схему двойного инвертора с триггерным инвертором Шмитта 74LS14, она работает не лучше. Так что это просто не работает, и точка.

Хорошее обновление. Я использую кнопочный переключатель для управления 4-битным счетчиком 74HC393, и единственный способ, которым я смог правильно устранить дребезг переключателя, — это использование триггерного инвертора Шмитта (74HC14) с конденсатором 100 нФ на переключателе.

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

Я действительно не понимаю, почему вы так усложнили или думаете, что это сложно. Вы не упомянули, какой микроконтроллер вы используете, однако я вижу, что это Arduino. Вы можете сделать это с помощью программного обеспечения input( pin, INPUT_PULLUP );(так что вам не нужны никакие внешние компоненты) или вы можете использовать подтягивающий или подтягивающий резистор (SMD действительно маленький) 10K на GND или 5V, это то, что вы предпочитаете использовать.

Единственное, что вам нужно сделать, это прочитать значение из ввода со скоростью устранения дребезга в мс, использовать millis()для этого (не использовать delay()!) и использовать его в функции loop(). Это арахис для каждого Arduino.

Например:

схема

#define BTM_PIN_BTN_BT_POWER               10 // Tactile switch to power on/off/
#define BTM_POW_BTN_DEBOUNCE               200 // in ms
//#define BTM_POW_BTN_NO_WAIT              // uncomment if you don't want to wait for a release   

bool getPowerButtonPressed() // I dunno if your button is power, this is just an example
{
  static uint32_t iDebounceTime = millis();
  bool bResult = false;

  if( millis()-iDebounceTime >= BTM_POW_BTN_DEBOUNCE )
  {
    #ifndef BTM_POW_BTN_NO_WAIT 
    while( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH )
    {
      bResult = true;
    }
    #else
      bResult = ( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH ); 
    #endif
    
    iDebounceTime = millis();
      
}  
  
  return bResult;
}


void loop()
{
  if( getPowerButtonPressed() )
  {
    // do something
    
  } 

  // other code
  .....
  .....
}

Вот и все!