Алгоритм борьбы с дребезгом.
Лабораторная 3 Кнопка
Схема подключения.
Кнопка обычно может находиться в одном из двух состояний: нажата и отжата. При этом, в зависимости от подключения, на ней могу быть разные потенциалы. Например, если кнопка подключена, так как изображено на рис 3.1, на отжатой кнопке в точке Input будет высокий потенциал, а при нажатой низкий. Если же кнопка подключена, как показано на рис 3.2, то, наоборот, при отжатом состоянии на кнопке будет ноль, а при нажатом, напряжение питания (логическая единица).
Рис 3.1
Рис 3.2
Дребезг контактов.
При моделировании кнопка считается идеальной и её модель выглядит, как показано на рис 3.3.
Рис 3.3
Фронты при нажатии считаются идеальными. В реальности обычно при изменении состояния кнопки появляется эффект дребезга контактов. Этот эффект заключается в том, что пластины соприкоснувшись друг с другом (при нажатии) не остаются в таком состоянии, а какое-то время болтаются и сигнал на кнопке принимает вид, как показано на рис. 3.4.
Рис 3.4
Длительность этого переходного процесса обычно составляет от сотых долей до единиц миллисекунд в зависимости от кнопки. Сам по себе дребезг представляет собой случайный процесс.
Дребезг не является проблемой, если необходимо просто отличать состояния нажатой и отжатой кнопок. Например, при решении задачи включения светодиода при зажатой кнопке.
Но он сильно усложняет задачу обнаружения момента нажатия на кнопку. Если просто отлавливать момент изменения уровня сигнала, то, как видно из рисунка, мы получим за одно нажатие хаотическое многократное нажатие и отжатие кнопки.
Алгоритм борьбы с дребезгом.
Существует ряд алгоритмов, позволяющих бороться с эффектом дребезга. Самый простой из них – после первоначального обнаружения изменения уровня не отслеживать изменения уровня на выводе к которому подключена кнопка в течение времени за которое гарантировано окончится эффект дребезга.
Этот алгоритм прост, но имеет тот недостаток, что может среагировать на шумовое изменение уровня сигнала от кнопки. Т.е. на мгновенное короткое изменение состояния сигнала. Это может произойти, например, из-за наводок с других дорожек.
Этот алгоритм обычно применяют при использовании внешних прерываний.
Другой алгоритм подразумевает накапливание информации об изменении состояния кнопки. Т.е. решение об изменении состояния принимается, если N раз подряд было получено ожидаемое значение. Например, если ожидается нажатие на кнопку, при котором на вывод микроконтроллера будет подан логический ноль, мы увеличиваем значение переменной на единицу, когда на выводе, к которому подключена кнопка, появляется ноль. Если на выводе единица, то счёт сбрасывается. Этот алгоритм позволяет отфильтровать дребезг и принять решение только при наличии на входе МК стабильного сигнала.
К недостаткам этого метода можно отнести более сложную реализацию и задержку при принятии решения, что может быть критично при жестких требованиях к скорости реакции системы.
Алгоритм поиска момента нажатия на кнопку
Момент нажатия на кнопку можно определить, если сохранять предыдущее состояние кнопки. В этом случае, если текущее и предыдущее состояния не поменялись, то нажатия не было. Если же текущее и предыдущее состояния не совпадают (Как на рис 3.5 предыдущее состояние N_old не равно текущему состоянию N), то значит состояние кнопки изменилось. Она была или нажата, или отпущена.
Рис 3.5
Что бы отличить момент нажатия от момента отпускания кнопки можно проверять текущее состояние кнопки. Например, для случая, как на рис 3.5 мы получим следующий код:
if (N_Old != N)
{//Состояние кнопки изменилось
if (N == 0)
{
//Кнопка нажата
} else {
//Кнопка отпущена
}
N_Old = N;
}
После обработки изменения состояния кнопки нужно некоторое время подождать, чтобы прошел дребезг. Самое простое – добавить после того, что должно происходить при изменении состояния кнопки небольшую задержку в несколько миллисекунд.