Устранение дребезга 🛎️ контактов кнопок STM32 CMSIS (STM32F411)

Поділитися
Вставка
  • Опубліковано 16 гру 2020
  • 📝 Статья: cxemka.com/73-algoritm-borby-...
    🏷️ DevBoard STM32F401/F411 MiniF4 (2.47-3.60💲): ali.ski/2F546
    ​🏷️ STM32F401 STM32F411 (2.46💲): ali.ski/d8svH8
    ​🏷️ STM32F401CCU6 STM32F411CEU6 (2.46-3.58💲): ali.ski/SK7NP
    ​​🏷️ USB Logic Analyze 24M 8CH (4.69💲): ali.ski/RFBZY
    🛒 Мой мультиметр T21D RM113D (13.81💲): ali.ski/ED0syl
    ↪️ GitHub: github.com/Egoruch/Debounce-B...
    #stm32 #cmsis #stm32cubeide
    ✒️ Здесь рассказывается о простом алгоритме обработки нажатий настоящих кнопок (с борьбой дребезгом контактов), основанном подтверждении в течении времени большего дребезга неизменяющегося состояния. Представлена оптимальная схема подключения кнопок. Предусмотрена удобная функция Debounce, позволяющая работать с нужными выводами подавляя влияние дребезга контактов.
  • Наука та технологія

КОМЕНТАРІ • 23

  • @_suso_
    @_suso_ 3 роки тому +7

    Отличная форма подачи материала! Никаких там ненужных пауз и лишних слов. Лайк однозначно.

    • @Aleksandr_Eni
      @Aleksandr_Eni 3 роки тому +1

      Поддерживаю! Прекрасная подача материала. Я наконец узнал зачем эта стрелочка ->...

  • @Scherbakov
    @Scherbakov 2 роки тому +3

    ЕЕЕ!! Кайф. Впервые видео смотрел на пониженной скорости, а не наоборот, как с другими авторами по программированию МК)

    • @masterkit9517
      @masterkit9517 2 роки тому

      удалось ли вам продвинутся в теме MIDI ?

  • @dobroliub1908
    @dobroliub1908 3 роки тому +3

    Отличная подача материала, и наглядно всё показано, мало кто пишет на регистрах, было очень интересно посмотреть. Жду новых видео в подобном формате! Автору благодарность и удачи)

  • @akvilion7365
    @akvilion7365 3 роки тому +9

    Терпи, автор, и не сдавайся. Возможно, через год "умные" алгоритмы туба выведут твои видео в рекомендуемые.

  • @ravil6018
    @ravil6018 3 роки тому +1

    Шикарно!

  • @sozdatelEd
    @sozdatelEd 3 роки тому +3

    // до main
    typedef struct
    {
    uint16_t click; // количество нажатий на кнопку
    uint8_t t_to_trigger; // время до срабатывания
    uint8_t t_trigger; // время до инкремента количества нажатий
    uint32_t t_hold; // время удержания кнопки (в миллисекундах)
    } my_BUTTON;
    const uint8_t button_t_trigger[10] = {1, 10, 10, 20, 20, 40, 40, 60, 60, 60}; // временные интервалы до следующего инкремента количества нажатий
    void BUTTON_step (uint32_t data, my_BUTTON *button) { // подпрограмма работы кнопки (должна выполняться 100 раз в 1 секунду)
    if (data==RESET) {
    if (button->t_to_trigger!=0) { button->t_to_trigger--;
    if (button->t_hold) { button->t_hold+=10; };
    if (button->t_to_trigger==0) { if (button->t_trigger!=0) { button->t_trigger--; } button->t_to_trigger = button_t_trigger[button->t_trigger]; button->click++; if (!button->t_hold) { button->t_hold=10; } }
    }
    } else { button->t_to_trigger=6; button->t_trigger=9; button->t_hold=0; }
    };
    my_BUTTON key_ok;
    my_BUTTON key_left;
    my_BUTTON key_right;
    // в таймере
    void TIM1_UP_IRQHandler(void) { // срабатывает 100 раз в секунду
    BUTTON_step (GPIOB->IDR&GPIO_PIN_1, &key_left);
    BUTTON_step (GPIOA->IDR&GPIO_PIN_7, &key_ok);
    BUTTON_step (GPIOB->IDR&GPIO_PIN_0, &key_right);
    }
    Таким образом в любом месте программы можно узнать время удержания кнопки и количество нажатий. Очень удобно использовать в меню для изменения каких-либо значений - при удержании кнопки аргумент количества нажатий увеличивается быстрее.

  • @ALCohol-qu7ib
    @ALCohol-qu7ib 3 роки тому +1

    В своё время, тоже мудыхался с дребезгом. Но остановился на следующем решении -- опрашиваю кнопки 5 раз в секунду т.е. с интервалом в 200 мС.

  • @user-gm8ez7cq7c
    @user-gm8ez7cq7c 3 роки тому

    Твой голос шедевр

  • @jorchick
    @jorchick 3 роки тому +1

    Я раньше использовал похожий метод. Создавал таймер с частотой 1000Гц, опрашивая порт увеличивал или уменьшал некую переменную. Для этой переменной задал два порога 20 (для состояния нажата) и 80 (для состояния отжата). Таким образом реализовал программный аналог RC-фильтра с триггером Шмидта. Недавно решил проверить встроенный триггер Шмидта и поставил параллельно контактам кнопки последовательно соединенные конденсатор 1 мкФ и резистор 300 Ом (для ограничения тока при разряде). Встроенная подтяжка к плюсу, если не ошибаюсь составляет ~40 кОм. Настроил EXTI прерывание и... у меня все равно иногда срабатывало двойное нажатие. Увеличив конденсатор до 2.2 мкФ эффект все равно остался. Тогда я в прерывании поставил проверку по времени события (с помощью HAL_GetTick). Оказалось в данной конфигурации (2.2 мкФ + 300 Ом) достаточно отбраковки повторных событий в течение 1 мс. Я поставил для надежности 2 мс.

    • @_suso_
      @_suso_ 3 роки тому

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

  • @masterkit9517
    @masterkit9517 2 роки тому +2

    а можно ли таким способом обработать 176 кнопок? делаю цифровое фортепиано

  • @toshibamaster2210
    @toshibamaster2210 3 роки тому

    RC Достаточно R внутренняя подяжка конденсатор на землю..А конденстор на входную НЧ ножку всегда хорошая идея..много лищнего

  • @squidyPet
    @squidyPet 2 роки тому

    В st к резистору в кнопке добавлен конденсатор. И это очень сильно экономит ресурсы 401/411 контроллера из которых и так вырезано все что можно.

  • @masterkit9517
    @masterkit9517 2 роки тому +1

    две проблемы пытаюсь решить, матричную клавиатуру как прикрутить, а точнее к F103C8T6 нужно запихать 176 кнопок, убить дребезг, скорость настолько важна, что минимум задержек на убивание дребезга нужно. Куда копать?

  • @ivanrusev2270
    @ivanrusev2270 2 роки тому

    у меня есть две программы на устранение дребезга контактов.Одна это при нажатии считаются дрбезг после счёта устанавливается флаг.потм при отжатии другой счёт дребезга выставляется флаг отжатия.При уравнении этих флагов операнд и и пороисходит событие.Другая программа.В прерывании по таймеру.При нажатии кнопки выставляется флаг.А при выставлении флага работает инкремент.Если флаг==1&&GPIO==1&&pauza>20 после этого событие.

  • @MrErmish
    @MrErmish 3 роки тому

    Подписался

  • @edmelectronics4110
    @edmelectronics4110 3 роки тому +1

    Скажите пожалуйста, как можна увеличит размер текста и интерфейса в STM32Cube IDE? Я ползою последная версия, но не могу разбиратся, есть ли вооше такая возможност. Хотель би такие надписи, как на вашем комютре? Поздравляю за уроки, они очнь полазные!

    • @cxemkacom3623
      @cxemkacom3623  3 роки тому +1

      текст в окнах (код, консоли):
      увеличить: Ctrl и Shift и +
      уменьшить: Ctrl и -
      все остальное через саму винду 10:
      Нажать Win и u, там масштаб ставлю 175%
      там же размер надписей можно менять
      в полный экран сделать: Alt + F11

    • @masterkit9517
      @masterkit9517 2 роки тому +2

      там же есть в нwindow>preferences>general>apperance>colors and fonts > c/c++ EDITOR TEXT FONT и темы в APPERANCE >Theme >Dark например

  • @user-hi5fy6wv5j
    @user-hi5fy6wv5j 3 місяці тому

    Очень хреново использовать текой фильтр для подавления дребезга. Время реакции на кнопку можно сильно затянуть.
    Годный алгоритм получается на контроле предыдущего длительного состояния, суть его (время утрировано):
    если 0,1 секунду состояние на пине было лог 1, то считаем, что лог 1 это текущее состояние это лог 1, значит любой переход в лог 0 будем считать нажатием, но отпусканием будем считать вновь появление лог 1 только когда лог 0 просуществует не менее 0,1 секунды.
    Таким образом мы "ловим" первое замыкание или первое размыкание кнопки, что человеком воспринимается как "мгновенная реакция на нажатие".