최근 에 버튼 디 바운싱에 대한 기사 를 읽었으며 Arduino (ATMega mC)와 같은 작업을 할 때이 점을 명심 해야하는지 궁금합니다. 특히 인터럽트 작업을 할 때 문제라고 생각합니다.
따라서 코드에서 바운스를 감지하는 것이 더 좋습니까? 아니면 하드웨어로 처리해야합니까? 정교하게 작성하십시오.
최근 에 버튼 디 바운싱에 대한 기사 를 읽었으며 Arduino (ATMega mC)와 같은 작업을 할 때이 점을 명심 해야하는지 궁금합니다. 특히 인터럽트 작업을 할 때 문제라고 생각합니다.
따라서 코드에서 바운스를 감지하는 것이 더 좋습니까? 아니면 하드웨어로 처리해야합니까? 정교하게 작성하십시오.
답변:
스위치에 스코프를 연결하는 것이 좋습니다. 스위치에 바운스가있는 학생의 프로젝트가 5v에서 -5v로, 최대 4v로 -3v로, 최대 2v로, 다시 0v로 바운스되는 것을 보았습니다. 우리가 스코프에서 현재 그림을 볼 때 매우 큰 스파이크가있었습니다.
그의 특별한 경우에 그는 하드웨어에서 자신의 스위치를 공개해야 할 것이 매우 필요했습니다.
그러나 다른 한편으로는 소프트웨어에서 쉽게 제거 할 수있는 훨씬 작은 효과를 가진 스위치를 보았습니다.
그래도 옵션을 계량해야합니다. 매우 복잡한 양의 펌웨어가 있다면 프로그래머와 CPU 사용량으로 오버 헤드를 추가하는 것이 가치가 없을 수 있으며 약간의 하드웨어를 추가하는 것이 좋습니다. 반면에 비용과 크기를 줄이려면 가능한 한 많은 하드웨어를 제거하고 가능한 경우 펌웨어에서 모두 수행해야합니다.
당신이 직업적인 전자 공학 디자이너 인 경우에 당신의 상사는 당신이 그것을 하드웨어에서 그것을 할 수 없게 할 것입니다. 그 이유는 간단합니다. 생산 배치가 크면 소프트웨어가 거의 무료 이고 생산하는 각 장치에 대해 하드웨어를 지불해야합니다. 저항과 커패시터는 먼지가 싸지 만 PCB에 장착하는 데 구매 가격의 최대 20 배가 소요될 수 있습니다.
소프트웨어 또는 하드웨어에서 디 바운스를 수행하더라도 여전히 품질 푸시 버튼을 선택해야합니다. 이 기사의 악명 높은 157ms 버튼은 어떤 응용 에도 적합하지 않습니다 .
나는 보통 32ms 간격으로 버튼을 샘플링 한다 . 이것은 좋은 버튼의 디 바운스 시간을 연결하기에 충분하다. 저는 알프스 SKQG TACT 스위치 의 팬입니다 .
내가 테스트 한 몇 가지 장치에서 초기 반송 시간은 10ns 미만이었습니다. 작동 수명이 10 만 사이클이지만 2 만 사이클 동안 테스트 했으며 32ms 디 바운스로도 충분했습니다. (실제로 디 바운스 수준을 측정 했어야했지만 당시 우리의 주요 관심사는 최종 제품의 동작이었습니다.
하드웨어 솔루션을 정말로 원한다면 기술적으로 최상의 솔루션으로 기사에서 언급 한 SR 플립 플롭 솔루션을 두 번째로 고려하십시오.
플립 플롭은 예를 들어 작은 VSSOP8 패키지로 제공되는 듀얼 NAND 게이트 로 구성 할 수 있습니다 . 이 솔루션의 주요 단점은 SPST가 훨씬 일반적으로 사용되는 SPDT 푸시 버튼이 필요하다는 것입니다.
버튼을 디 바운스하는 방법에는 여러 가지가 있습니다. 소프트웨어 또는 하드웨어에서 수행하는지 여부는 프로젝트 요구 사항 및 스위치 유형에 따라 다릅니다.
다른 방법으로 연결되는 링크는 다음과 같습니다.
http://www.ganssle.com/debouncing.htm
http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/
그 기사는 탈퇴에 관한 "성경"입니다. 연락처 바운스는 모든 응용 프로그램에서 문제가 될 수 있습니다.
접점 바운스 양이 다르기 때문에 특정 스위치에 대한 지연을 조정하기가 쉽기 때문에 일반적으로 소프트웨어에서 스위치를 디 바운스하는 것이 가장 좋습니다. 키 릴리스를 제거하는 것도 종종 필요합니다. 스위치 제조업체는 종종 제품의 바운스 양을 지정합니다. 일반적으로 약 10ms-20ms입니다.
스위치 바운스는 수십 밀리 초 동안 지속될 수 있습니다. 타이머에서 실행되는 인터럽트 루틴에서 스위치를 폴링하는 경우 바운스 문제가 발생하지 않습니다. 바운스 폭풍 중에 스위치를 폴링하더라도 새로운 상태를 즉시 얻을 수 있기 때문입니다. 또는 최악의 경우 이전 상태가되고 다음 타이머 기반 폴링까지 새 상태가 표시되지 않습니다. 이와 같이 시간이 지정된 ISR에서 폴링하는 것은 일종의 소프트웨어 디 바운스를 구성합니다.
그러나 해당 스위치를 사용 하여 인터럽트 를 발생 시키고 인터럽트 서비스 루틴이 10 밀리 초 미만으로 빠르게 실행될 것으로 예상되면 하드웨어 디 바운싱이 필요합니다. 그렇지 않으면 하나의 스위치 이벤트로 인해 임의의 숫자가 발생할 수 있습니다. 인터럽트, 그리고 종종 종종 예상했던 것 이상을 방해합니다. 반면, 인터럽트 루틴이 충분히 오래 실행되면 스위치 바운스가 ISR이 끝나기 전에 정산 될 것입니다. 그러나 잘 구성된 ISR은 그렇게 오래 걸리지 않습니다.
가장 좋은 방법은 자신에게 가장 잘 맞는 방법입니다. 그러나 이미 마이크로 컨트롤러를 사용하는 경우 약간의 코드 노력만으로도 소프트웨어를 디 바운싱 할 수 있습니다.
소프트웨어에서 디 바운스하는 가장 확실한 방법은 가장 긴 바운스 시간보다 멀리 떨어져있는 순간에 버튼을 확인하는 것입니다. 50ms는 '정상'스위치의 바운스 시간에서 상한으로 보이므로 소프트웨어를 이와 같이 정렬 할 수 있으면 분명합니다.
forever loop
wait (at least) 50 ms
check buttons
do procesing
end loop