수신 거부 버튼


32

최근 에 버튼 디 바운싱에 대한 기사 를 읽었으며 Arduino (ATMega mC)와 같은 작업을 할 때이 점을 명심 해야하는지 궁금합니다. 특히 인터럽트 작업을 할 때 문제라고 생각합니다.

따라서 코드에서 바운스를 감지하는 것이 더 좋습니까? 아니면 하드웨어로 처리해야합니까? 정교하게 작성하십시오.


답변:


17

스위치에 스코프를 연결하는 것이 좋습니다. 스위치에 바운스가있는 학생의 프로젝트가 5v에서 -5v로, 최대 4v로 -3v로, 최대 2v로, 다시 0v로 바운스되는 것을 보았습니다. 우리가 스코프에서 현재 그림을 볼 때 매우 큰 스파이크가있었습니다.

그의 특별한 경우에 그는 하드웨어에서 자신의 스위치를 공개해야 할 것이 매우 필요했습니다.

그러나 다른 한편으로는 소프트웨어에서 쉽게 제거 할 수있는 훨씬 작은 효과를 가진 스위치를 보았습니다.

그래도 옵션을 계량해야합니다. 매우 복잡한 양의 펌웨어가 있다면 프로그래머와 CPU 사용량으로 오버 헤드를 추가하는 것이 가치가 없을 수 있으며 약간의 하드웨어를 추가하는 것이 좋습니다. 반면에 비용과 크기를 줄이려면 가능한 한 많은 하드웨어를 제거하고 가능한 경우 펌웨어에서 모두 수행해야합니다.


스위치 바운스 이미지의 범위를 지정하여 Wikipedia에 게시했습니다. en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O

바운스의 매우 재미있는 그림 인 @Thomas O. @Vincent Van Den Berghe가 모든 바운스가 그렇게 보이지는 않는다는 것을 이해하고 싶습니다. 이 바운스는 0-5v로 제한되며 항상 그렇게 보이지는 않습니다.
Kellenjb

2
@Thomas O는 부수적으로 Oscope 이미지를 그처럼 찍는 학생들을 실습하는 사례를 만들었습니다. 화면의 플래시가 끔찍합니다. 또한 한 걸음 더 나아가 학생들이 CSV 또는 랩뷰와 같은 것을 사용하여 실제 데이터 포인트를 수집하도록하여 보고서 및 데이터 분석에 쉽게 사용할 수 있도록합니다.
Kellenjb

@Kellenjb, HP-IB를 지원하는 스코프 용 프린터가 곧 제공됩니다. 또한 카메라의 "스포츠"모드를 사용하면 플래시없이 흐리게 촬영하지 않고 스코프 화면을 잘 찍을 수 있습니다.
Thomas O

1
@Lundin 실시간 환경에서는 많은 인터럽트에 의존합니다. 인터럽트에서 버튼을 누르면 버튼을 한 번만 눌러 실시간 시스템이 여러 번 중단되는 것을 원하지 않습니다. 또한 10ms 동안 대기하기 위해 리소스를 할당하지 않아도됩니다.
Kellenjb

15

당신이 직업적인 전자 공학 디자이너 인 경우에 당신의 상사는 당신이 그것을 하드웨어에서 그것을 할 수 없게 할 것입니다. 그 이유는 간단합니다. 생산 배치가 크면 소프트웨어가 거의 무료 이고 생산하는 각 장치에 대해 하드웨어를 지불해야합니다. 저항과 커패시터는 먼지가 싸지 만 PCB에 장착하는 데 구매 가격의 최대 20 배가 소요될 수 있습니다.

소프트웨어 또는 하드웨어에서 디 바운스를 수행하더라도 여전히 품질 푸시 버튼을 선택해야합니다. 이 기사의 악명 높은 157ms 버튼은 어떤 응용 에도 적합하지 않습니다 .
나는 보통 32ms 간격으로 버튼을 샘플링 한다 . 이것은 좋은 버튼의 디 바운스 시간을 연결하기에 충분하다. 저는 알프스 SKQG TACT 스위치 의 팬입니다 .

알프스 택트 스위치

내가 테스트 한 몇 가지 장치에서 초기 반송 시간은 10ns 미만이었습니다. 작동 수명이 10 만 사이클이지만 2 만 사이클 동안 테스트 했으며 32ms 디 바운스로도 충분했습니다. (실제로 디 바운스 수준을 측정 했어야했지만 당시 우리의 주요 관심사는 최종 제품의 동작이었습니다.

하드웨어 솔루션을 정말로 원한다면 기술적으로 최상의 솔루션으로 기사에서 언급 한 SR 플립 플롭 솔루션을 두 번째로 고려하십시오.

디 바운스 회로

플립 플롭은 예를 들어 작은 VSSOP8 패키지로 제공되는 듀얼 NAND 게이트 로 구성 할 수 있습니다 . 이 솔루션의 주요 단점은 SPST가 훨씬 일반적으로 사용되는 SPDT 푸시 버튼이 필요하다는 것입니다.


12

버튼을 디 바운스하는 방법에는 여러 가지가 있습니다. 소프트웨어 또는 하드웨어에서 수행하는지 여부는 프로젝트 요구 사항 및 스위치 유형에 따라 다릅니다.

다른 방법으로 연결되는 링크는 다음과 같습니다.

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

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


나는 질문을 보았을 때 ganssle에 링크를 가지러 갈 예정였다.
Kortuk

ganssle 기사는이 질문을 한 이유입니다. 제 질문에 링크되어 있습니다 :) 디 바운스 코드 스 니펫에 대한 링크에 감사드립니다.
Vincent Van Den Berghe

소프트 / 하드웨어 사용시기를 설명하기 위해 몇 가지 사용 사례를 요약 해 주시겠습니까? (이것은 아마도 주관적이지만, 어쨌든 몇 가지 예를 싶습니다)
빈센트 반 덴 Berghe

1
@Vincent에서 Kellenjb는 결정 방법에 대한 답변을 요약했습니다. 나는 재미있는 이름을 가지고 있기 때문에 귀하의 링크를 클릭하지 않았습니다. 이제 클릭하면 갠슬이 보입니다!
Kortuk

그것이 합의 / 일반 규칙이라면, 더 이상의 예는 필요하지 않습니다.
Vincent Van Den Berghe

6

그 기사는 탈퇴에 관한 "성경"입니다. 연락처 바운스는 모든 응용 프로그램에서 문제가 될 수 있습니다.

접점 바운스 양이 다르기 때문에 특정 스위치에 대한 지연을 조정하기가 쉽기 때문에 일반적으로 소프트웨어에서 스위치를 디 바운스하는 것이 가장 좋습니다. 키 릴리스를 제거하는 것도 종종 필요합니다. 스위치 제조업체는 종종 제품의 바운스 양을 지정합니다. 일반적으로 약 10ms-20ms입니다.


사람들이 왜 투표하지 않습니까?
Toby Jaffey

키 릴리스 디 바운싱에 대한 좋은 지적!
Vincent Van Den Berghe

1
나는 그것을 공감하지 않았지만 소프트웨어로 그것을 말하는 것은 끔찍한 생각입니다. 특성화하는 것이 좋습니다.
Kortuk

나는 "일반적으로"라고 말했고 그 이유를 제시했습니다. 또한 BOM 비용을 최소화하고 신뢰성을 높입니다.
레온 헬러

신호가 컨트롤러의 안전 범위 내에있는 경우에만 안정성이 향상됩니다. 이 조치는 구성 요소 마모를 늘리지 않고 구성 요소 수를 줄이면 신뢰성을 높입니다. 나는 당신의 게시물 개념에 동의하지 않는다고 말하지는 않았지만, 나는 현장에 오는 엔지니어들과 이런 답변을 끊임없이 끊임없이 연구하며 그들은 소프트웨어의 모든 것을 디 바운싱 할 것입니다. 항상 특성화해야합니다. 나는 또한 당신을 공감하지 않았지만, 공감하지도 않았다. 나는 소프트웨어와 같은 광범위한 대답이 새로운 개발자들이 그들의 하드웨어를 위험에 빠뜨릴 것이라고 생각한다.
Kortuk

1

스위치 바운스는 수십 밀리 초 동안 지속될 수 있습니다. 타이머에서 실행되는 인터럽트 루틴에서 스위치를 폴링하는 경우 바운스 문제가 발생하지 않습니다. 바운스 폭풍 중에 스위치를 폴링하더라도 새로운 상태를 즉시 얻을 수 있기 때문입니다. 또는 최악의 경우 이전 상태가되고 다음 타이머 기반 폴링까지 새 상태가 표시되지 않습니다. 이와 같이 시간이 지정된 ISR에서 폴링하는 것은 일종의 소프트웨어 디 바운스를 구성합니다.

그러나 해당 스위치를 사용 하여 인터럽트 를 발생 시키고 인터럽트 서비스 루틴이 10 밀리 초 미만으로 빠르게 실행될 것으로 예상되면 하드웨어 디 바운싱이 필요합니다. 그렇지 않으면 하나의 스위치 이벤트로 인해 임의의 숫자가 발생할 수 있습니다. 인터럽트, 그리고 종종 종종 예상했던 것 이상을 방해합니다. 반면, 인터럽트 루틴이 충분히 오래 실행되면 스위치 바운스가 ISR이 끝나기 전에 정산 될 것입니다. 그러나 잘 구성된 ISR은 그렇게 오래 걸리지 않습니다.


인터럽트를 발생시키는 스위치를 갖는 것이 좋습니다. 그러나 일단 당신이 그것을 얻으면, 더 이상의 인터럽트를 허용하지 마십시오-그것들을 끄고 대신 지정된 디 바운스 시간에 대한 타이머를 시작하십시오.
Lundin

@Lundin-타이머를 사용할 수있는 경우 타이머를 사용하여 폴링 방식을 구현할 수 있으며 스위치가 인터럽트를 전혀 생성하지 않아도됩니다.
JustJeff

0

가장 좋은 방법은 자신에게 가장 잘 맞는 방법입니다. 그러나 이미 마이크로 컨트롤러를 사용하는 경우 약간의 코드 노력만으로도 소프트웨어를 디 바운싱 할 수 있습니다.

소프트웨어에서 디 바운스하는 가장 확실한 방법은 가장 긴 바운스 시간보다 멀리 떨어져있는 순간에 버튼을 확인하는 것입니다. 50ms는 '정상'스위치의 바운스 시간에서 상한으로 보이므로 소프트웨어를 이와 같이 정렬 할 수 있으면 분명합니다.

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

이를 위해 MCU의 온칩 타이머를 사용하십시오.
Lundin

물론 가능하지만 많은 프로그램을 작성하지 않고도 작성할 수 있습니다.
Wouter van Ooijen

3
고급 제품의 전문 소프트웨어는 항상 온칩 타이머를 사용합니다. 애호가들은 루프 또는 데드 대기 폴링에 대해 "NOP"를 사용할 수 있습니다. 그러나 실시간 요구 사항에 관계없이 실제 제품에서이를 수행 할 이유가 없습니다. "타이머가 어떻게 작동하는지 모르겠지만 게으른 자기가 작성하는 데이 데드 루프가 10 초가 걸린다"는 엔지니어에게는 올바른 논거가 아니다.
Lundin

불락. 전문가는 (현재 프로젝트에 따라) '하드웨어를 최대한 효과적으로 사용'하거나 '전문가의 시간을 최대한 효율적으로 사용'을 의미 할 수있는 효과적이어야합니다. 따라서 귀하의 오는 것은 확실히 어떤 경우에는 (어쩌면 당신이 처리 한 모든 경우에) 적용됩니다.
Wouter van Ooijen

온칩 타이머를 구현하려면 최대 1 시간이 걸립니다. 이것은 복잡한 일이 아니며 일상적인 빵 및 버터 공학입니다. 훨씬 더 나은 솔루션과 전반적인 품질을 얻기 위해 프로젝트에 1 시간을 투자 할 수 없습니까? 그래 ... 프로그래밍에 대해 잘 모른다면 일주일이 걸릴 수 있습니다. 그러나 아마도 처음부터 소프트웨어로 작업해서는 안됩니다 ... 또는 더 많은 작업을해야 하므로이 간단한 작은 것을 즉시 구현하는 법을 배우게됩니다.
Lundin

0

아직 언급되지 않은 디 바운싱 방법 중 하나는 VDD에 연결되고 다른 하나는 접지에 연결된 이중 스로우 스위치를 사용하는 것입니다. 소프트웨어 또는 하드웨어를 통해 현재 상태로 약하게 당겨지는 핀에 공급하십시오. 이러한 접근 방식은 이중 스로 스위치의 장점을 제공하지만 2 개가 아닌 1 개의 I / O 핀만 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.