Bounce 제거

  • Post author:
  • Post category:STM32

https://istarik.ru/blog/stm32/148.html

이 노트는 stm32 마이크로컨트롤러를 사용할 때 버튼의 “바운스”를 제거하기 위한 몇 가지 옵션을 설명합니다. 우리는 버튼 또는 기타 저속 접점에 대해 이야기하고 있습니다. 일부 모터의 속도 측정과 같은 빈번한 임펄스의 경우 작동하지 않습니다.
버튼을 짧게 누르고 있는 옵션, 즉 하나의 버튼에 두 가지 동작
무한 루프가 변수를 추가하기 전에…

무한 루프에서 우리는 버튼을 폴링합니다 …

2초 이상의 유지 시간, 여기에서 설정 – 2000(ms).

버튼을 놓으면 짧은 누름이 트리거됩니다.

무한 루프가 변수를 추가하기 전에…

무한 루프에서 우리는 버튼을 폴링합니다 ..

300ms 이상 누르면 동작하지 않습니다. 더 자주 필요하면 300의 값을 줄이십시오. 원칙적으로 100ms로 줄일 수 있습니다. 더 적게 하면 “바운스”가 이미 나타날 수 있습니다. 그것은 모두 버튼의 품질과 얼마나 빨리 눌렀다 떼느냐에 달려 있습니다. 300에서 잡담이 있으면 늘리십시오.

 

실수로 누르는 것을 방지하는 짧은 누르기

 

이전 옵션과 동일하지만 작동하려면 버튼을 50ms 동안 누르고 있어야 합니다. 버튼이 일부 트랙터에 부착되어 있고 때때로 저절로 닫히는 경우입니다.

설명된 모든 변형에서 프로그램 주기는 어떤 방식으로도 느려지지 않습니다.

 

인터럽트 버튼

우리는 일종의 타이머를 설정하여 오버플로하고 100-300ms 후에 인터럽트를 일으키고 원하는 프런트(또는 둘 다)에 외부 인터럽트를 설정하고 콜백을 추가합니다.

외부 인터럽트…

 

타이머 오버플로…

 

버튼을 누르자마자 콜백에서 인터럽트가 발생하고 꺼지므로 버튼이 덜거덕거리는지 여부에 관계없이 더 이상 신경 쓰지 않고 인터럽트가 비활성화됩니다. 원하는 작업을 수행하고 타이머를 시작합니다. 타이머는 100-300ms 내에 인터럽트를 트리거하고 여기서 중지한 다음 필요한 비트가 지워지고 외부 인터럽트가 켜집니다.

One Pulse 모드에서 타이머를 설정하면 중지할 필요 없이 시작하기만 하면 됩니다.

HAL_NVIC_DisableIRQ(EXTI15_10_IRQn) 명령은 전체 라인, 즉 이 경우 핀 15~10에서 외부 인터럽트를 비활성화합니다.

또한 EXTI…IRQn을 괄호 안에 표시하십시오. 이는 위와 아래에 설명된 모든 기능에 적용됩니다.

 

인터럽트 버튼, 타이머 없음

외부 인터럽트가있는 변형에서는 타이머없이 할 수 있습니다 (그런 사소한 일에 낭비하지 않도록). 즉, 모든 것이 동일하지만 인터럽트를 다르게 켤 것입니다.

 

 

여기서 다시 인터럽트를 비활성화하고 플래그를 설정하고 HAL_GetTick()의 값을 저장했습니다.

더 이상 타이머와 관련된 것이 필요하지 않습니다.

무한 루프에서 플래그를 확인하고 카운터가 200ms를 초과할 때까지 기다립니다…

 

200ms 후에 비트를 지우고 외부 인터럽트를 켭니다.

그게 다일 것입니다. 커패시터 및 기타 형태의 다양한 하드웨어 사용은 소프트웨어 솔루션에 대해서만 설명할 계획은 없었습니다.