Debounce ext interrupt

Ik krijg in een arduino project via een eindschakelaar een external interrupt.
Nu heb ik een (dacht ik) goede hardware debounce schakeling maar toch krijg ik regelmatig dubbele interrupts.
Als ik dan op de scoop kijk is de spanning vanaf 4.2 naar 3.3 volt terug gevallen, maar ik dacht dat een signaal al bij 2 volt een logische 1 geeft.

Het plaatje gaf op de arduino 2 interrupts wat erg ongewenst is.
Zit ik nu zo erg mis met de niveau's van de arduio?

blackdog

Golden Member

Hi Djenn,

Kan je ons laten zien hoe je de schakelaar hebt debounced?
Dan kunen we kijken of daar nog wat aan te tunen is.

Die hobbel in de puls hoort daar in principe niet, dan werkt je debounce schakeling niet goed genoeg.

Dus een schema is welkom :-)

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Ik heb dit schema ergens van het internet geplukt, ik weet niet direct waar.

Het werkt eigenlijk best goed want zonder heb ik minstens 5 schakelpieken dus op zich is het nog niet zo gek.
Ik heb wel een beetje met r1 gespeeld maar als die te groot wordt duurt het wat lang voordat het interrupt komt.
Maak ik de c wat kleiner krijg ik te veel interrupts.
Het is voor een zelf te bouwen cnc frees en ik ben een beetje bang dat als de eindswitch te laat schakeld de boel stuk gaat.
Maar toch nog even mijn eerste vraag, ook als is er die dip, die zit toch ruim boven het "1" niveau?

Arco

Special Member

Als het TTL inputs zijn wel; als het S/T inputs zijn ligt '0' meestal bij 0.2*Vcc max, en '1' bij 0.8*Vcc min. (Da's dus 4v minimaal voor een gedefinieerde '1')
Alles daartussen is ongedefinieerd...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
blackdog

Golden Member

Hi Djenn,

Kik eens bij de volgende link van een topic van mij, daar kan je zien hoe ik debounce oplos voor een Arduino ingang.
Je kan ook de puls bekijken op de foto.
Scrol naar beneden naar deze tijd: maandag 23 oktober 2017 09:29:41

https://www.circuitsonline.net/forum/view/138638/1

Heb je en zeer slechte schakelaar, dan kan je de condensator nog wat groter maken.
De debounce die aan de Arduino hangt is voor cmos ingangen zoals b.v. de Arduino.
In je code voor de Arduino niet de interne "Pull Up" voor de schakelaar input gebruiken.

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Je maakt dus een delay dmv dat RC circuit? Het idee van een digitale ingang is dat ie of '0', of '1' is en niet iets er tussenin. Nou heb je dat altijd even in de overgang, maar om die tijd nou nog wat extra op te rekken... slecht idee.
Het beste kun je gewoon een Ctje van 100n oid over de ingang zetten en het debouncen volledig in firmware doen. Een eventuele extra delay maak je uiteraard ook in firmware.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
blackdog

Golden Member

Hi flipflop,

maar om die tijd nou nog wat extra op te rekken... slecht idee

Wil je dit voor ons eens uitleggen?

Wat ik laat zien is een uitstekende manier om ongewenst gedrag van een schakelaar kwijt te raken.
Kan debounce in de code, ja natuurlijk, ik vind beter een paar goed gekozen componenten beter, zodat wat je de Arduino aanbied als goed is.
Ga je duizenden apparaten gebruiken met veel schakelaars, dan ga je een afweging doen tussen de BOM kosten en betrouwbaarheid.
Mijn keuze voor een paar eindschakelaars is passieve debounce, maar iedereen mag het op zijn manier doen :-)

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Waarom moeilijk doen?
Gewoon eens in de (bijv) 100msec de ingang inlezen en je hebt geen last van contactdender.

Een schakelaar hoort alleen een nul of een af te geven als hij schakelt. In rust zou er geen signaal mogen komen, door trillingen etc.
Helaas, ideale (mechanische) schakelaars zijn zeldzaam.

Het traject waar de schakelaar van gesloten naar open gaat is wat ruig, dat heet bouncing. Dat signaal bestaat uit meer of minder gedefinieerde niveau's en spikes.
Je zou een NO schakelaar kunnen nemen (normally open), met een niet al te hoogohmige belasting. Op het moment dat de schakelaar sluit en eenmaal een niveau is bereikt waarbij de ingang getriggerd is, kun je de ingang verder via software even blokkeren. Bij het weer openen van de schakelaar kun je zoiets herhalen.
Als de schakelaar tijdens bedrijf normaal open is, zal ik moeilijk spikes kunnen afgeven.

buckfast_beekeeper

Golden Member

Als eindschakelaar in een cnc wordt normaal een NC contact gebruikt. Je wil niet dat er bij draadbreuk de machine verder blijft lopen.

Waarom niet kiezen voor een elektronische eindeloop?

Van Lambiek wordt goede geuze gemaakt.
EricP

mét CE

Een eindschakelaar op een interrupt riekt naar een wat minder doordacht ontwerp. Maar eh... waarom is het erg als die IRS 2x (5x...) een schop krijgt - afgezien van dat het wat lomp is...

Verder kun je het zowel in hardware als in software oplossen. Ik denk dat ik het in software zou doen. Makkelijker aanpassen als er eens andere schakelaars komen.
Het concept in hardware is echter niet anders: je maakt die input feitelijk gewoon 'traag'. Dus vandaar dat ik het gebruik van een interrupt niet zo begrijp - die dingen gebruik je normaal juist als het 'snel' moet zijn.

De reden dat ik een interrupt gebruik is ligt in het feit dat de library die ik gebruik om de stepsticks aan te sturen wat traag reageerd.
Het leek me een goed om met een interrupt direct de boel stop te kunnen zetten.

@EricP:
Ik merkte dat de arduino wel eens vast liep op de interrupts en nu moet eerlijk vertellen dat er een Serial.println instruktie in de interrupthandler zat dus dat kan de reden van het vastlopen zijn geweest.

@blackdog:Bedankt voor tip, jouw oplossing werkt perfect.

Op 14 november 2017 22:57:05 schreef blackdog:
maar om die tijd nou nog wat extra op te rekken... slecht idee
Wil je dit voor ons eens uitleggen?

Als je hele trage flanken hebt, dan "loopt" je spanning heel traag langs het schakelmoment van je input. Met een heel klein beetje ruis zit je dan even wisselend boven of onder het schakelpunt. Tevens zit je lang in het grijze gebied tussen 0 en 1. Dat vind ik niet netjes.
Door een kleine C voorkom je dat er veel stoorpulsen op je ingang staat. Het echte debouncen doe je dan in firmware.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Dat klinkt heel logisch als ik er zo over nadenk.
Ik ga er vanvond nog even mee aan de gang.
Aangezien ik meerdere schakelaars wil afhandelen op deze manier zou ik er ook een 74HCT14 bij kunnen zetten want dan heb je wel een mooie schakelpiek.
Misschien wel wat overkill maar dat is niet zo erg.

Uiteraard moet je wel blackdog's truc blijven gebruiken.

Op 15 november 2017 09:04:53 schreef buckfast_beekeeper:
Als eindschakelaar in een cnc wordt normaal een NC contact gebruikt. Je wil niet dat er bij draadbreuk de machine verder blijft lopen.

Waarom niet kiezen voor een elektronische eindeloop?

Misschien moet je met de eindschakelaar gewoon de spanning onderbreken, dan is dat alvast geregeld. Daarnaast kun je dan de controller nog aansturen.
Mocht die laatste wat fout doen, dam blijft de machine in elk geval heel.

blackdog

Golden Member

Hi,

Djenn, als het nu goed werkt, waarom dan nog meer tijd er in steken...
In industriele omgevingen plaatsten wij "vroeger" nog een CMOS Schmidtrigger functie na de debounce die ik liet zien.
Dat was dan meestal een 1/4 4093 of 1/6 40106 poort.

Mijn ervaring is dat dit niet direct nodig is bij een goed ontworpen passieve debounce bij de Arduino.
Bij de meeste moderne CMOS digitale ingangen is er al een soort hysteresis aanwezig,
dit samen met goed ontworpen debounce is dus voldoende voor een betrouwbare werking.

Ga je naar hele lage spanning logica <2V voeding, dan zou ik daar eerst naar kijken wat de fabrikant voorschrijft van wat je gaat aansturen.

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.

Op 15 november 2017 20:50:44 schreef Djenn:
ook een 74HCT14 bij kunnen zetten want dan heb je wel een mooie schakelpiek.

Hoezo? Verplaats je dan niet het probleem van de micro naar de gate?

@bd hieronder: joh, je denkt toch niet dat ik al die families uit m'n hoofd ken? Ik heb wel wat anders te doen :-) [edit] check, de hct14 heeft een ST input, ik dacht dat je het algemeen voor hct bedoelde.
Maar serieus, met een extra gate ervoor wordt het helemaal een niet-elegante oplossing.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
blackdog

Golden Member

Hi,

Kom flipflop, ken je CMOS logica, de 74HCT14 heeft een Schmidtrigger ingang!

Groet,
Blackdog

You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.
buckfast_beekeeper

Golden Member

Op 15 november 2017 21:10:57 schreef buzzy:
[...]Misschien moet je met de eindschakelaar gewoon de spanning onderbreken, dan is dat alvast geregeld. Daarnaast kun je dan de controller nog aansturen.
Mocht die laatste wat fout doen, dam blijft de machine in elk geval heel.

Dat is niet de bedoeling van de eindeloop. Deze is bedoelt als 0 referentiepunt. De as loopt tot hij de 0 bereikt en loopt dan enkele mm terug. In te stellen in de software hoeveel dit is. De snelheid naar de eindeloop toe is ook altijd dezelfde opgegeven snelheid zodat het 0 punt altijd op dezelfde wijze wordt benaderd.

Van Lambiek wordt goede geuze gemaakt.