Debounce для новичков

Тема в разделе "Arduino & Shields", создана пользователем ImmOrtal, 17 фев 2012.

  1. ImmOrtal

    ImmOrtal Нуб

    Не могли бы вы объяснить что она делает? Я читал материал на arduino.cc(http://arduino.cc/it/Tutorial/Debounce), но все что я понял - эта функция делает кнопку в примере переключателем(не надо держать её для получения 1 или 0). И где вообще эту функцию можно использовать?
     
  2. Evgeniy

    Evgeniy Нуб

    Ну, судя из кода, переключает кнопку только с некоторой задержкой. То есть не сразу в момент нажатие, а спустя 50мс. Не знаю, с чем связано, я в английском не силен, но возможно это нужно для какой то стабилизации сигнала. Почитай про эти кнопки, может и суть всплывет, просто я больше программист, чем электрик :) и свой набор arduino из кучи вкусностей все никак дождаться не могу
     
  3. Dmitriy Kunin

    Dmitriy Kunin Гик

    Вы когда-нибудь видели, как при включении чего-то проскакивает искра ?
    Это когда подключается мощная нагрузка, а когда искры не видно, не значит, что её нет.
    Если представить себе нажатие на кнопку разложенное по шкале времени, то это будет выглядеть так:
    выключено...выключено, включено-выключено много раз, включено...включено.
    Вот это "включено-выключено много раз" ничто иное, как плохой контакт, в момент включения...
    Это безобразие прекращается, когда давление на кнопку превысило определённый порог, и контакт становится постоянным.
    Для нас в нашей жизни от выключено до включено проходит очень мало времени, нажат на кнопку, это мгновенное действие.
    Но микроконтроллер живёт гораздо более быстрой жизнью чем мы, и он видит этот плохой контакт, как последовательность состояний вкючено и выключено, то есть за некий промежуток времени ваш светодиод успеет включиться и выключиться несколько десятков раз, а может и сотен...
    Данный программный способ обхода Дребезга контактов, а именно так переводится Debounce, основан на добавлении паузы с целью пропустить момент дребезга.
    Это не самы лучший способ борбы с этим явлением, нельзя так бездарно разбазаривать мощности процессора, а то получится, что на целом микроконтроллере будет сделана одна кнопка и всё, больше он ничем в это время не может быть занят...
    Как обычно, очень много и занудно написал, наверно было проще отослать вас в раздел Вики к Десятому уроку Джереми Блюма, там всё подробно...
     
  4. Evgeniy

    Evgeniy Нуб

    Эм... Вот тут немного не согласен. Та функция не занимает все время процессора. Правда и ее можно было бы реализовать получше (производительней), но идея у нее очень даже ничего. Хотя я не видел ни одной другой пока.

    Если бы там было что то вроде этого:
    Код (Text):
    void loop () {
    delay(50);
    int reading = digitalRead(buttonPin);
    if (reading != lastButtonState) {
    buttonState = reading;
    digitalWrite(ledPin, buttonState);
    }
    }
    Тогда да, плохо. А если использовать ту идею более логично, например так:
    Код (Text):
    void loop () {
    int reading = digitalRead(buttonPin);
    if ((millis() - lastDebounceTime) > debounceDelay) {
    lastDebounceTime = millis ();
    if (reading != lastButtonState) {
    lastButtonState = reading;
    digitalWrite(ledPin, lastButtonState);
    }
    }
    То мы бы не ждали каждый раз эту задержку... И могли бы в этот промежуток (равный задержке) исполнять остальной код программы... Ну или как то так, надеюсь не ошибся и суть ясна, просто время позднее уже, глаза слипаются :)