Перейти к содержанию

Лабораторная работа 9. Дребезг контактов

Цель работы:

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

Теоретическая часть

Дребезг - явление, происходящее в электромеханических коммутационных устройствах, длящееся некоторое время после замыкания электрических контактов и состоящее из многократного неконтролируемого замыкания и размыкания контактов. Явление обусловлено упругостью материалов и деталей контактной системы - контакты «подпрыгивают» некоторое время при соударениях, размыкая и замыкая электрическую цепь. Таким образом, дребезг - явление между двумя стабильными со- стояниями контактов (Рисунок 9.1).

Рисунок 9.1. Явление дребезга

Есть два способа решения этой проблемы: программный и аппаратный (на уровне железа).

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

Аппаратное устранение дребезга, в подавляющем большинстве случаев, более предпочтительно программному способу по ряду причин:

  1. аппаратная реализация всегда более надежна,
  2. высвобождаются ресурсы процессора из-за отсутствия необходимости дополнительных вычислений,
  3. уменьшается объем кода и упрощается процесс отладки.

При возникновении дребезга в задачах с прерыванием решить проблему программным способом невозможно.

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

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

Практическая часть

В данной лабораторной работе необходимо разработать программу, которая будет управлять яркостью светодиода с помощью кнопок. Для этого рассмотрим тип данных boolean.

Тип данных boolean

Описание:

boolean – логический (булевый) тип данных. Переменная такого типа данных может принимать только одно из значений true («логическая еди- ница», 1) или false («логический ноль», 0). Переменная занимает в памяти 1 байт.

Схема подключения:

К данной рабочей программе используется следующая схема под- ключения (Рисунок 9.2). Для реализации проекта потребуются следую- щие компоненты: макетная плата, резистор на 220 Ом (1 шт), тактовая кнопка (2 шт), светодиод (1 шт) и провода.

Рисунок 9.2. Схема подключения

После сборки схема имеет следующий вид (Рисунок 9.3):

Рисунок 9.3. Внешний вид схемы после сборки

Рабочая программа:

#define plus_button_pin 2
#define minus_button_pin 3
#define led_pin 12
int brightness = 100;
// Использование булевой переменной для хранения
// значения с кнопки 
boolean plusUp = true; 
boolean minusUp = true;
// Функция имеет 3 параметра: номер пина с кнопкой (buttonPin),
// состояние до проверки (wasUp) и градация яркости (delta).
// Функция возвращает обратно новое, текущее состояние кнопки.
// Функция будет постоянно вызываться, и при изменении состояния
// кнопки будет меняться яркость.

boolean handleClick(int buttonPin, boolean wasUp, int delta)
{

boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp)

{
delay(10);
isUp = digitalRead(buttonPin);
// при нажатии меняется яркость от 0 до 255 if (!isUp)
brightness = constrain(brightness + delta, 0, 255);
}
// Возвращение значения обратно, в вызывающий код return isUp;
}

void setup()
{
pinMode(led_pin, OUTPUT);
// С помощью INPUT_PULLUP в функции pinMode можно
// использовать подтягивающий резистор
// при открытии пина на вход, что позволит
// избежать дребезга
pinMode(plus_button_pin, INPUT_PULLUP); 
pinMode(minus_button_pin, INPUT_PULLUP);

}

void loop()
{
analogWrite(led_pin, brightness);
// Реакция на нажатие с помощью написанной функции 
plusUp = handleClick(plus_button_pin, plusUp, +35); 
minusUp = handleClick(minus_button_pin, minusUp, -35);

}

Контроллер КПМИС позволяет воспользоваться уже встроенными в плату кнопками. Всего на плате имеется шесть кнопок. Далее, в программе идёт обращение к первой встроенной кнопке, подключенной к 35 пину.

Схема подключения:

К данной рабочей программе используется следующая схема под- ключения (Рисунок 9.4). Для реализации проекта потребуются следую- щие компоненты: макетная плата, резистор на 220 Ом (1 шт), светодиод (1 шт) и провода.

Рисунок 9.4. Схема подключения

После сборки схема имеет следующий вид (Рисунок 9.5):

Рисунок 9.5. Внешний вид схемы после сборки

Рабочая программа:

#define plus_button_pin 30
#define minus_button_pin 31
#define led_pin 12 
int brightness = 100;

// Использование булевой переменной для хранения
// значения с кнопки 
boolean plusUp = true; 
boolean minusUp = true;

// Функция имеет 3 параметра: номер пина с кнопкой (buttonPin),

// состояние до проверки (wasUp) и градацию яркости (delta).

// Функция возвращает обратно новое, текущее состояние кнопки.

// Функция будет постоянно вызываться и при изменении состояния

// кнопки будет меняться яркость.

boolean handleClick(int buttonPin, boolean wasUp, int delta)
{

boolean isUp = digitalRead(buttonPin); 

if (wasUp && !isUp)
{
delay(10);
isUp = digitalRead(buttonPin);
// При нажатии, меняется яркость от 0 до 255 if (!isUp)
brightness = constrain(brightness + delta, 0, 255);

}

// Возвращение значения обратно, в вызывающий код return isUp;

}

void setup()

{

pinMode(led_pin, OUTPUT);

// С помощью INPUT_PULLUP в функции pinMode можно

// использовать подтягивающий резистор при

// открытии пина на вход, что позволит

// избежать дребезга 
pinMode(plus_button_pin, INPUT_PULLUP); 
pinMode(minus_button_pin, INPUT_PULLUP);
}
void loop()
{

analogWrite(led_pin, brightness);
// Реакция на нажатие с помощью написанной функции 
plusUp = handleClick(plus_button_pin, plusUp, +35); 
minusUp = handleClick(minus_button_pin, minusUp, -35);

}

Список контрольных вопросов:

  1. Что такое дребезг?
  2. Как работает программное устранение дребезга?
  3. Как работает аппаратное устранение дребезга?
  4. Какие преимущества и недостатки имеют различные типы устранения?
  5. В каких задачах нельзя использовать программное устранение?

Center-nav

← Назад | Оглавление | Вперёд →