Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Debounce algoritmi
#1
Evo jedna fina kolekcija "debounce" algoritama tj programskih resenje/pristupa za izbegavanje "zvonjave" kontakata od prekidaca ili generalno kod ulaznih portova.

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

Posto su danasnji mikrokontroleri sve brzi i vreme instrukcija sve krace, pojavljuje se problem da kada citate neki ulazni port koji su vezani na mehanicke prekidace, enkodere i slicno, vas program (recimo interapt rutina - ISR), moze da se "okine" uzastopno vise puta, npr 100-ak puta u sekundi a hteli ste samo da se to desi jednom kada je pritusnut taster.

Tehnicki gledano kontakt nekog tastera ne moze da napravi savrsen signal koji pravi tranziciju sa 0>1 (ili obrnuto) vec tu ima "krckanje", "zvonjava" koja pravi probleme jer je programsko vreme citanja kontakta drasticno krace nego sto je potrebno jednom kontaktu vremena da se "smiri".
U tim situacijama se koristi "debounce" tj vrsta zadrske/delay koja pravi programsko filtriranje (low-pass filter) i sprecava brzo uzastopno "okidanje" ISR rutine.

Na gornjem linku ima nekoliko desetina razlicitih pristupa za resenje tog problema ali ja bih izdvojio (u prilogu) ovaj relativno prost i po tvrdnji autora prilicno robustan algoritam koji se zasniva po ponasanju integratora. Algoritam se prakticno ponasa kao da ste postavili mali kondenzator paralelno (prema GND) sa ulaznim portom (moze i to da upotrebite ako ne zelite programski to da radite ali sa programom mozete to fino da stelujete, u suprotnom bi morali da menjate i nadjete optimalnu vrednost za kapacitet kondenzatora).

Code:
real signal 0000111111110000000111111100000000011111111110000000000111111100000
corrupted   0100111011011001000011011010001001011100101111000100010111011100010
integrator  0100123233233212100012123232101001012321212333210100010123233321010
output      0000001111111111100000001111100000000111111111110000000001111111000

I have been using this algorithm for years and I show it here as a code
fragment in C.  The algorithm has been around for many years but does not seem
to be widely known.  Once in a rare while it is published in a tech note.  It
is notable that the algorithm uses integration as opposed to edge logic
(differentiation).  It is the integration that makes this algorithm so robust
in the presence of noise.


Attached Files
.c   debounce.c (Size: 3,48 KB / Downloads: 55)
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)