Разбиране на проблема:
* Отскачане на превключване на контакти: Механичните превключватели, когато бъдат натиснати или освободени, не преминават незабавно между отворено и затворено състояние. Те "подскачат" многократно поради механични вибрации и контактни несъвършенства.
* Множество задействания: Това подскачане може да генерира множество електрически сигнали, въпреки че потребителят е възнамерявал само едно натискане. Това може да причини нежелано поведение във веригите, особено тези, чувствителни към времето.
Защо Debounce?
* Точно тълкуване на сигнала: Предотвратява влиянието на фалшивите сигнали върху логиката или контролните функции на вашата верига.
* Надеждна работа: Гарантира, че вашата верига реагира само веднъж на едно натискане на превключвателя.
Методи за премахване на отскок:
1. Хардуерно отстраняване на отскок:
* RC верига: Най-често срещаният метод. Резистор (R) и кондензатор (C) са свързани паралелно през превключвателя. Кондензаторът се зарежда и разрежда бавно, филтрирайки бързите отскачащи сигнали.
* Как работи: Когато превключвателят се затвори, кондензаторът се зарежда през резистора. Сигналите на отскачане са твърде бързи, за да заредят напълно кондензатора, така че преминава само един чист сигнал.
* Базирани на диоди: Използва диод, за да предотврати твърде бързото разреждане на кондензатора. Това гарантира чист сигнал, дори ако отскачането е продължително.
2. Отстраняване на отскок на софтуера:
* Софтуерен таймер: Микроконтролерът може да бъде програмиран да игнорира входните промени за кратко време след натискане на превключвател. Всички промени в рамките на това време се считат за отпадане.
* Как работи: Таймерът се стартира при първото натискане на превключвателя. Всякакви допълнителни промени в рамките на продължителността на таймера се игнорират. След като таймерът изтече, новото състояние на превключвателя се приема.
* State Machine: Използва машина за състояние за проследяване на състоянието на превключвателя. Машината променя състоянията само след забавяне, филтрирайки отскачащите сигнали.
3. Специализирани интегрални схеми за отблъскване:
* Интегрални схеми за отстраняване на отскок: Проектиран специално за отстраняване на сигнали, осигурявайки стабилни и надеждни решения.
Избор на правилния метод:
* Хардуерно разбиване: Най-добър за прости вериги и когато рентабилността е важна.
* Софтуерна защита: Предлага по-голяма гъвкавост и може да се справи с по-сложни сценарии.
* Специализирани интегрални схеми за отблъскване: Идеален за приложения, изискващи висока точност, скорост или когато пространството е ограничено.
Основни съображения:
* Време за отстраняване на отскок: Закъснението или времевият прозорец, използван за премахване на отскок, трябва да бъде по-дълъг от продължителността на отскачането на превключвателя, но по-кратък от очакваното време за реакция на потребителя.
* Сложност на веригата: Избраният метод за отстраняване на отскок трябва да е подходящ за сложността на веригата и наличните ресурси.
Примерен код (Софтуерно обезсърчаване с Arduino):
```c++
const int switchPin =2; // Пин, свързан към превключвателя
int switchState =0; // Първоначално състояние на превключвателя
unsigned long lastDebounceTime =0; // Последният път, когато ключът промени състоянието
const unsigned long debounceDelay =50; // Закъснение в милисекунди
void setup() {
pinMode(switchPin, INPUT_PULLUP); // Конфигуриране на щифта за въвеждане
Serial.begin(9600);
}
void loop() {
int четене =digitalRead(switchPin);
// Ако превключвателят се промени, нулирайте таймера
if (четене !=switchState) {
lastDebounceTime =millis();
}
if ((millis() - lastDebounceTime)> debounceDelay) {
// Ако забавянето е достатъчно дълго, считайте промяната за валидна
switchState =четене;
// Обработка на състоянието на превключвателя
if (switchState ==LOW) {
Serial.println("Превключвател натиснат!");
} иначе {
Serial.println("Превключвателят е освободен!");
}
}
}
```
Този код на Arduino прилага премахване на отскок на софтуера чрез проверка на състоянието на превключвателя и сравняването му с предишното състояние. Ако бъде открита промяна, тя нулира таймера. Само след известно забавяне (debounceDelay) промяната се счита за валидна и се обработва.