Schema voor schakelaar ontdenderen

Het denderen zichtbaar gemaakt op de scoop. Afbeelding afkomstig van Wikipedia

Het denderen zichtbaar gemaakt op de scoop.
Afbeelding afkomstig van Wikipedia

Als een schakelaar omgezet wordt gaat hij niet meteen van uit naar aan (of andersom). Hij zal eerst een paar keer heen en weer klapperen, dit wordt denderen genoemd (of bouncing op z'n Engels). Op de afbeelding van scoop hiernaast zie je dat de schakelaar 1,72ms dendert voordat hij tot rust komt. Over het algemeen kan je stellen dat het denderen nooit meer dan 10ms duurt. Dit kan voor ongewenste resultaten geven als je een gevoelige schakeling of component hebt die met het denderen mee gaat klappen waardoor bijvoorbeeld een teller 37 pulsen telt in plaats van 1 om maar wat te noemen. Om dit te voorkomen moet de schakelaar dus ontdenderd worden, oftewel switch debouncing.

Kort stukje over Software Debouncing

Als ik af kan met software matig ontdenderen (in een microcontroller) dan gebruik ik meestal een interrupt van ongeveer 10ms die de status van een pin, of meerdere pinnen, naar een variable kopieert. Even een snel voorbeeld, in dit geval heb ik meerdere inputs allemaal aangesloten op PORTB:

 

1 2 3 4 56 7 8 9 1011 
unsigned short Inputs;   void Interrupt(){       if (TMR0IF_bit){ // Elke 10ms        TMR0IF_bit= 0;         TMR0H = 0x3C;         TMR0L = 0xB0;         Inputs= PORTB;     }}

Als ik de status van pin 2 van PORTB wil weten (PORTB.B2) dan kan ik gewoon Inputs.B2 uitlezen. Er zijn vele pagina's op het internet te vinden van andere codes om software matig te ontdenderen. Maar als het voor je schakeling geen probleem is als je maximaal 10ms vertraging hebt nadat een schakelaar omgezet wordt, en een 10ms interrupt is ook geen probleem, dan is dit de meest simpele en effectieve software-matige oplossing naar mijn mening. Maar soms is het beter om het hardware-matig te doen. En daar wou ik het nu over hebben.

Hardware debouncing

Het meest simpele is om een condensator parallel aan de schakelaar te zetten van bijvoorbeeld 100nF. Eventueel kan een kleine weerstand in serie met de condensator gezet worden. De theorie is dat als de schakelaar aan gezet wordt dat de condensator even tijd nodig heeft om op te laden. En als tijdens het denderen de schakelaar even uit gaat dat dan de condensator de spanning nog even hoog houd. De pieken van het scoop plaatje worden dus iets afgevlakt, maar het zal hierdoor dus vaak in het grijze gebied van de logica bevinden, waarin het niet zeker is of de microcontroller dit als een 0 of een 1 zal zien. pin-layout-SN74HC14Kortom, de condensator helpt wel wat, maar zal voor een microcontroller, of andere logische IC's, waarschijnlijk niet genoeg zijn. We moeten iets hebben waardoor we direct van 0 naar 1 of andersom gaan zonder een tijdje in een grijs gebied te zweven. De oplossing hiervoor is de Schmitt-trigger. Een Schmitt-trigger schakelt pas van 0 naar 1 als de ingang boven een bepaalde waarde is, en zal pas weer naar 0 gaan als de ingang onder een bepaalde waarde komt. Bij een ingangsspanning tussen deze twee waarden zal de uitgang niet veranderen. Hierdoor wordt het grijze gebied dus uitgesloten! Er zijn vele Schmitt-trigger, maar een goed verkrijgbare en goedkope is de 74HC14. In dit IC zitten 6 inverterende Schmitt-triggers. Wil je niet dat hij inverteert zet dan gewoon twee Schmitt-triggers in serie. Dat is makkelijker en goedkoper dan een niet inverterende Schmitt-trigger te kopen. Voor het schema gebruiken we een condensator en weerstand om de pieken van het denderen af te vlakken. Met nog een weerstand en een diode erbij zorgen we er voor dat het afvlakken nog wat versterkt wordt doordat de condensator langzamer ontlaad. Tenslotte stuurt dit een Schmitt-trigger aan.

Tussen

Tussen 1 en 2 wordt de schakelaar aangesloten. Op punt 3 kan de schakelaar uitgelezen worden.
Is de schakelaar dicht dan is punt 3 hoog, anders is punt 3 laag

debouncingMocht het nu zo zijn dat je wilt dat de uitgang hoog is bij een open schakelaar en laag bij een gesloten schakelaar dan kan je dit ook hardware-matig oplossen door het nog een inverterende Schmitt-trigger erachter te zetten. Hiernaast zie je hier een voorbeeld van. Je kan het natuurlijk ook software-matig oplossen door bijvoorbeeld Inputs= PORTB; te veranderen in Inputs= ~PORTB;. De schakeling gebruik ik al enige tijd achter een rotary encoder en hij bevalt prima. Het zorgt ervoor dat de rotary encoder geen puls overslaat of dubbel telt. Hieronder nog een overzicht van de kosten, waarbij ik nog wil opmerkingen dat de weerstanden veel goedkoper kunnen als je ze per 50 of 100 koopt ipv per stuk. Zoals je hebt gezien zitten er 6 Schmitt Triggers in 1 IC, hiermee kun je dus 6 schakelaars ontdenderen. De prijs is dan 2,48/6= €0,42 per schakelaar

Aantal Onderdeel Conrad artikelnummer Prijs per schakelaar Prijs per 6 schakelaars
1 100k weerstand 1090050 - 89 € 0,12 € 0,72
1 4k7 weerstand 1089931 - 89 € 0,12 € 0,72
1 74HC14 142913 - 89 € 0,20 € 0,20
1 220nF condensator 1235241 - 89 € 0,10 € 0,60
1 1N4148 diode 162280 - 89 € 0,04 € 0,24
__________________________ +
Totaal:  € 0,58 € 2,48

Prijzen zoals genoteerd op 1-1-2015