Кнопки відсікання


32

Нещодавно я прочитав статтю про розблокування кнопок і мені було цікаво, чи варто пам’ятати про це при роботі, наприклад, з Arduino (ATMega mC)? Я припускаю, що це питання, особливо при роботі з перервами.

Так що краще виявити відмов у коді, або це слід подбати про апаратне забезпечення? Будь ласка, докладно.


Відповіді:


17

Я настійно рекомендую підключити область застосування (сподіваємось, у вас є або ви можете взяти руки на використання) до вашого комутатора. Я бачив проект студента, який відскакував від їхнього перемикача, який перейшов від 5 В до -5 В до 4 В до -3 В, потім до 2 В, а потім назад до 0 В. Коли ми подивилися на нинішнє розіграш в масштабі, було дуже велике спайк.

У його конкретному випадку йому було дуже дуже потрібно, щоб зняти його перемикач в апараті.

Однак, з іншого боку, я бачив перемикачі, які мають набагато менший ефект, які легко можна було б просто зняти з програмного забезпечення.

Однак вам потрібно зважити свої варіанти. Якщо у вас дуже складна кількість мікропрограмного забезпечення, додавання накладних витрат як вам, як програмісту, так і використанню процесора, можливо, не варто, і вам буде краще просто додати трохи обладнання. Тепер, з іншого боку, якщо ви намагаєтесь зменшити витрати та розмір, вам потрібно буде видалити якомога більше обладнання та зробити все це за допомогою програмного забезпечення, якщо зможете.


Я зібрав зображення відмов перемикача і розмістив його у Вікіпедії: en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O

@Thomas O, це дуже весела картина відмов. Я просто хочу переконатися, що @Vincent Van Den Berghe розуміє, що не всі відскоки будуть виглядати так. Цей відмов обмежений 0-5V, він завжди не виглядатиме так.
Kellenjb

2
@Thomas O, як побічна примітка, ми створили практику відмови учнів, які приймають зображення Oscope таким чином. Спалах на екрані жахливий. Ми також робимо це на крок далі і підштовхуємо учнів до збору фактичних точок даних, використовуючи щось на зразок CSV або labview, щоб потім їх було легко використовувати у звітах та аналізі даних.
Kellenjb

@Kellenjb, я скоро отримую принтер для моєї сфери, який підтримує HP-IB. Також я виявив, що режим "Спорт" на моїй камері може робити хороші знімки екрана діапазону без спалаху та без розмивання.
Томас О

1
@Lundin У режимі реального часу ти багато залежить від перерв. Якщо у вас є натискання кнопки на перерві, ви не хочете, щоб ваша система в реальному часі була перервана кілька разів одним натисканням кнопки. Вам також не хочеться виділяти ресурси, щоб чекати 10 мс.
Kellenjb

15

Якщо ви професійний дизайнер електроніки, шанси на те, що ваш начальник навіть не дозволить вам це зробити апаратно. Причина проста: якщо ваша виробнича партія достатньо велика, програмне забезпечення практично безкоштовне , тоді як за кожну вироблену одиницю потрібно платити за обладнання. І хоча резистори та конденсатори забруднюють дешево, їх монтаж на друкованій платі може коштувати до 20 разів більше їхньої покупної ціни.

Незалежно від того, чи ви дебютуєте в програмному чи апаратному забезпеченні, вам все одно потрібно вибрати якісні кнопки. Сумнівна кнопка 157 мс із статті просто не підходить для жодної програми.
Зазвичай я вибираю кнопку з інтервалом у 32 мс , що достатньо, щоб зменшити час дебютування будь-якої хорошої кнопки. Я прихильник перемикачів Alps SKQG TACT.

Альп тактового вимикача

На декількох пристроях, які я тестував, початковий час відмов було менше 10нс. Незважаючи на те, що термін його експлуатації становить 100 000 циклів, ми протестували його на 200 000 циклів, і навіть тоді 32 мс дебюту було достатньо. (Я думаю, я мав би виміряти фактичний рівень дебютації, але нашим головним інтересом на той час була поведінка кінцевого продукту. Так чи інакше, ми використовували його поза специфікою.)

Якщо ви дійсно хочете апаратне рішення, я зазначаю рішення SR-триггер, згадане в статті, як технічно найкраще рішення:

debounce circuit

Триггер може бути сконструйований з подвійним NAND-шлюзом , який, наприклад, є у невеликому пакеті VSSOP8. Основним недоліком цього рішення є те, що вам потрібна кнопка SPDT, де SPST набагато частіше доступний.


12

Існує безліч (і безліч) різних способів знімати кнопки. Чи будете ви це робити в програмному чи апаратному забезпеченні, залежатиме від ваших вимог проекту та типу комутатора.

Ось декілька посилань на різні методи:

http://www.ganssle.com/debouncing.htm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/


Я збирався зайти посилання на ganssle, коли побачив це питання.
Кортук

Стаття про ganssle стала причиною того, що я задав це запитання, це пов'язано з моїм запитанням :) Дякую за посилання на фрагменти коду дебютування.
Вінсент Ван Ден Берге

Ви б заперечували підсумовувати декілька випадків використання, щоб проілюструвати, коли використовувати програмне забезпечення / апаратне забезпечення? (це, мабуть, суб'єктивно, але я хотів би будь-які приклади)
Вінсент Ван Ден Берге

1
@ Вінсент, Келлендж підвів підсумки своєї відповіді, як прийняти рішення. Я не натискав на ваше посилання, тому що він мав кумедне ім’я, тепер, коли я натиснув його, я бачу ганглес!
Кортук

Якщо це консенсус / загальне правило, то справді більше прикладів немає.
Вінсент Ван Ден Берге

6

Ця стаття є "Біблією" щодо дебютації. Відмови від контактів можуть бути проблемою для будь-якої програми.

Зазвичай найкраще знімати вимикачі в програмному забезпеченні, оскільки простіше налаштувати затримки для конкретних комутаторів, оскільки вони відрізняються за кількістю відмов контакту. Також часто потрібне дебютування випуску ключів. Виробники комутаторів часто визначають кількість відмов для своїх товарів, як правило, це приблизно 10 мс - 20 мс.


Чому люди голосують за це?
Toby Jaffey

Хороший момент про розблокування ключових релізів!
Вінсент Ван Ден Берге

1
Я не спростовував це, але просто сказати, що робити це в програмному забезпеченні - це жахлива ідея. Це гарна характеристика.
Кортук

Я сказав «взагалі», що так і є, і дав причину. Це також мінімізує вартість BOM та підвищує надійність.
Леон Хеллер

це збільшує надійність лише в тому випадку, якщо сигнал залишається в безпечних межах вашого контролера. Ця дія підвищить надійність, якщо зменшити кількість компонентів без збільшення зносу компонентів. Я не казав, що не погоджуюся з вашою концепцією дописів, але постійно працюю з інженерами, просто виходячи на поле та отримуючи відповідь, як це, і вони дебютуватимуть усе в програмному забезпеченні. Ви завжди повинні характеризувати. Я також вас не порушив, але я також не подав заяву, я думаю, що така широка відповідь, як програмне забезпечення, ризикує новішими розробниками ризикувати їх обладнанням.
Кортук

1

Відмов від перемикання може тривати десятки мілісекунд. Якщо ви опитуєте перемикач з режиму переривання, який працює на таймері, відмов не буде проблемою, тому що навіть якщо вам трапиться опитати перемикач посеред шторму відскоку, ви одразу отримаєте новий стан або, в гіршому випадку, отримати старий стан і не бачити новий стан до наступного опитування, заснованого на таймері. Опитування від приуроченого ISR такого типу є формою програмного дебюту.

Однак якщо ви використовуєте цей перемикач для того, щоб викликати переривання, і ви очікуєте, що рутина служби переривання запуститься швидко, менш ніж за 10 мілісекунд, вам знадобиться апаратне розблокування, інакше одна подія перемикання може призвести до дещо випадкової кількості перебиває, і, звичайно, часто більше, ніж очікував. З іншого боку, якщо програма переривання триватиме досить довго, відмов комутатора буде влаштовано до завершення ISR, і ви будете добре, але більшість добре сконструйованих ISR не забирають все так довго.


Мати перемикач, щоб викликати переривання - це гарна ідея. Але як тільки ви це отримаєте, не допускайте подальших перерв - вимкніть їх і замість цього запустіть таймер для визначеного часу дебютування.
Лундін

@Lundin - якщо таймери доступні, ви можете просто скористатися таймером для здійснення опитуваного підходу, і не турбуватися, щоб комутатор генерував переривання взагалі.
JustJeff

0

Найкращий спосіб зробити anyhting - це спосіб, який вам найбільше підходить. Але коли у вас вже є мікроконтролер, ви можете дебютувати в програмному забезпеченні лише за певний зусилля з кодом.

Найпростіший спосіб вивести з ладу програмне забезпечення - перевірити кнопки в моменти часу, які знаходяться далі, ніж найдовший час відмов. 50 мс, здається, є верхньою межею часу відмов "звичайних" комутаторів, тож коли ви можете влаштувати своє програмне забезпечення таким чином, вам ясно:

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop

І використовуйте для цього таймери на мікросхемі MCU.
Лундін

Це, звичайно, можливо, але без них можна написати безліч програм.
Wouter van Ooijen

3
Професійне програмне забезпечення в якісних продуктах завжди буде використовувати таймери на чіпах. Хоббісти можуть піти з деяким "NOP" для циклу або мертвих очікування опитування. Але немає жодної причини робити це в реальній продукції, незалежно від ваших потреб у реальному часі. "Я не знаю, як працює таймер, і цей мертвий цикл займає 10 секунд, щоб моє ледаче самозапис" не є вагомим аргументом для інженера.
Лундін

Бички. Професіонали повинні бути ефективними, що (залежно від конкретного проекту) може означати (серед іншого) "використовувати апаратне обладнання наскільки ефективно" або "використовувати час професіонала максимально ефективно". Тож ваш вихід, безумовно, застосовується в деяких випадках (напевно, у всіх випадках, які ви мали справу), безумовно, застосовується не у всіх випадках.
Wouter van Ooijen

На реалізацію таймера на мікросхемі потрібно не більше години вашого часу. Це навряд чи щось складне, це повсякденна хлібобулочна техніка. Ви навіть не можете вкласти одну годину у свій проект, щоб отримати значно краще рішення та загальну кращу якість? Так добре ... якщо ви мало знаєте про програмування, це може зайняти тиждень. Але тоді, можливо, вам не варто працювати з програмним забезпеченням в першу чергу ... або, можливо, вам слід більше працювати з ним, так що ви навчитесь реалізовувати цю просту дрібницю за короткий час.
Лундін

0

Один з підходів до розгортання, про який ще не було сказано, - це використовувати перемикач з подвійним кидком, причому один кидок прив'язаний до ВДД, а другий - заземлення. Подайте їх у штифт, який (або за допомогою програмного забезпечення, або за допомогою апаратних засобів) буде слабко виведений до теперішнього стану. Такий підхід забезпечить переваги перемикача з подвійним кидком, але знадобиться лише один штифт вводу / виводу, а не два.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.