Vanligt för givare är att de reagerar olika fort på negativ respektive positiv flank.
I databladet för honeywell givaren
http://www.mouser.com/ds/2/187/honeywel ... 947405.pdfstår att fall-time max 1 us, rise-time max 5 us.
Om man ligger nära max för givaren (10 kHz) och har en
kuggkrans som är lika mycket kugg som spår så skulle signalen i den bästa av världar bli 50 us on och 50 us off. Då är 5 us 10% felkälla, vilket är lite mer än man vill ha.
Jag kan väldigt lite om hallgivare, har egentligen bara läst i databladet samt ett annat papper jag hittade från Honeywell
https://sensing.honeywell.com/hallbook.pdftitta på sidan 35, fig 5-7.
Här ser man att off alltid är längre än on. Off är tandbredden plus något, on är spårbredden minus något. Detta kan dock vara kompenserat när man fräst kransen.
Vart jag vill komma med allt detta är att, anledningen till att man helst inte vill mäta positiv till negativ flank (eller tvärt om), utan alltid positiv till positiv eller i detta fallet hellre negativ till negativ eftersom falltiden är mer distinkt än stigtiden.
Det är det som är risken med att använda pulsein(), jag skulle också tro att det är anledningen till att janson1 inte kunde använda 30 utan 30.06 då det blev en konstant i hans system. Den konstanten kan ändra sig med en annan givare.
Inte därmed sagt att det är fel att mäta pos flank till neg flank, det går ju att kompensera till viss del, dessutom kanske det inte spelar någon roll för applikationen.
Detta kan med med fördel använda interrupt till
https://www.arduino.cc/reference/en/lan ... interrupt/Jag ska erkänna att jag inte provat interrupt på en arduino, men det borde fungera på samma sätt som vanligt.
Man har sin loop() som jobbar på som vanligt, när en ändring sker på en interrupt-pinne så pausar man loop() och hoppar till interrupt-rutinen, här ska man passa sig för att göra saker som tar tid.
Lämpligt i detta fallet är att spara tiden just nu och jämföra den med tiden för förra interruptet, detta ger tiden mellan två kuggar.
Ofta så sätter man en variabel som berättar att man just har mätt tiden.
När interruptet är färdigt hoppar arduinon automatiskt tillbaka till loop() och fortsätter där den slutade sist.
På detta sättet kan man utföra massa kod utan att processorn behöver stanna upp för att vänta på att en signal ska gå hög eller låg.
Jag vet inte om det gick att hänga med i mitt svammel som ingen bett om.
Orkade du läsa ändå hit är jag imponerad av dig!