Stap 10: Interupts
Na een suggestie van rfmdelgado ook kunt u interrupts op arduino digitale pennen te registreren de tijd die het marmer elke poort gaat. Dit vereist een beetje externe circuits te kunnen werken met de verstelbare drempel waarden nodig voor elke poort.
Het eerste wat dat we nodig hebben is een Comparateur van de spanning die kan vergelijken twee input spanningen en uitgangsspanning een hoge of lage volgens welke een hoogste is. Ik heb niet een speciaal gebouwde spanning Comparateur chip maar zijn mogelijk in plaats daarvan een opamp met geen feedback-lus gebruiken. Ik volgde de instructies van Spanning Comparator informatie en Circuits voor het gebruik van een LM358 dual op-amp. Als de arduino input impedantie zo hoog, in de volgorde van 10MΩ is, voorgesteld zijn schoon om rechtstreeks verbinding te maken met de opamp uitgang direct naar de digitale pin van de arduino zonder gebruik te maken van een diode of transistor als in de link.
Een eenvoudige schakeling zou gewoon de uitgang van de poorten met de spanning van een variabele weerstand gebruikt als een divider spanning te vergelijken. Dit zou vereisen handmatige aanpassing telkens de apparatuur gebruikt.
Een beter alternatief is het gebruik van de PWM-uitgang van de arduino analogWrite() te voorzien van een verstelbare referentie spanning. Een low-pass filter, bestaande uit een weerstand en een condensator, is nodig om de uitvoer glad, gebruikte ik de calculator op RC Low-pass Filter ontwerp voor PWM de waarden te kiezen. Nogal een hoge waarde van 10μF werd gebruikt voor de condensator want willen we in principe een constante gelijkspanning met minimale rimpelspanning. De weerstand die ik gebruikte was 2.2kΩ. Er is nogal een flexibiliteit in de waarden gebruikt. De uitgang van het filter wordt gevoerd in de niet-inverterende (+)-ingang van de opamp ingangen en een uitgang vanaf de gate ingang ingevoerd de omkeren (-) ingang. Op een Uno worden pin 5 en 6 gebruikt omdat deze een hoge 980 Hz frequentie meer speelruimte te geven op de RC-waarden hebben.
Voor de code hebben we weer een nogal een lange opleiding-fase. Het PWM-uitgang wordt langzaam verhoogd, bij elke stap die de comparator spanning wordt gelezen. Dit zal in eerste instantie nul en gaat naar 1 wanneer de PWM-uitgang groter is dan de poort. De waarde wanneer dit gebeurt is gehercodeerd. Het proces dan omgekeerd met de output van de PWM daalde van maximale op nul, de waarde waar de input verandert van 1 naar 0 is opgenomen. Tot slot wordt de drempelwaarde genomen als het gemiddelde van de stijgende en dalende waarden plus een vaste interval. Deze waarde wordt weggeschreven naar de PWM die wordt gebruikt als de lange termijn drempel spanning.
Met de drempel worden instellen interrupts vervolgens ingeschakeld met behulp van AttachInterrupt. We zijn alleen geïnteresseerd in de RISING-modus wanneer de input van laag naar hoog gaat. Pin 2 en 3, die interrupts 0 en 1 werden gebruikt op een Uno. De werkelijke interruptcode is heel simpel de tijd wordt geregistreerd en het tijdsverschil tussen de twee keer is de verstreken tijd van het marmer.
Met behulp van interrupts kan het verbeteren van de resolutie van de timing potentieel beter dan de ongeveer 1ms verkregen uit de basic-code. Maar er is een aanzienlijke variatie in het experiment, met name in de exacte positie die het marmer is vrijgegeven, dus er niet te veel is te winnen.