Trouble reading pulsing input over 100 pulses per second

I am working on a Speedometer. I need to to read from my sending unit that pulses 16 times per revolution. I measure delta time between pulses, through a running average node to collect a sample size, then through some maths, convert everything to KM/h/MPH.

Everything works at very low speeds. However, When frequency gets up above about 80 pulse per second, the reads just sort of hang. I have tried digital read with and without pullup, as well as trying a pull-up and pull-down on my breadboard. I need to count pulses reliably up to about 600/s

I am using a nano clone. Should I use a better board? Something obvious im missing?

This is outside my experience level with Arduino, so I could be completely wrong and can’t help much more than this, but I think Arduino is going to have trouble counting fast pulses without using interrupts, and XOD doesn’t really support interrupts yet. One possible solution for you is to use the pulsein function, which is implemented in the pulse-in node in robertspark/components library. If you call it with H/L pin false, it should give you an accurate reading for time between pulses. At best, you will only be reading time for every 2nd or 3rd pulse (if it is already low when you call [almost every time], it will wait for pulse to start timing, so you are not reading length of delay between pulses in progress when you call the node), but unless speed changes very rapidly, that probably won’t be an issue. The downside is that instead of averaging number of pulses to calculate speed, you are extrapolating the speed from a VERY small time sampling, so it might not end up very accurate. Fewer pulses per revolution might actually make the final calculation more accurate since the time between pulses could be read more accurately. Fewer pulses per revolution might also allow your current code to work, but it might break again when you start adding more code to do other things & tying up the CPU so it starts missing pulses again.

Acabo de hacer algunas pruebas en el banco de trabajo, inyectando pulsos utilizando gpio/change-interrupt y la librerĂ­a amperka/pc-interrupt. resultados aceptables.
Entonces no me queda mas que darle algunos de mis recursos que suelo usar en estos casos que solĂ­amos usar con algunos viejos microntroladores con relojes operativos de 1Mhz.

  • hacer las rutinas de interrupciones lo mas breve posible maximo 6 operaciones ideal entre una a tres. Por Ej escribir una variable y verificarla procesarla en el Loop
  • poner un divisor externo (siempre da resultado en estos casos - experimente con el viejo 4017 o cualquier otro contador/divisor, sin hacer ninguna modificaciĂłn en su proyecto mas que ajustar algĂșn coeficiente por el que se multiplica o divide segĂșn su caso).
  • No recargue su procesador de gama baja con tareas que una simple lĂłgica se hacen mucho mas eficientes y confiables.
  • Haga que su controlador atienda lo realmente importante. Priorice esto en su diagrama lĂłgico, XOD nos permite hacer esto de una forma sumamente eficiente y fĂĄcil de analizar.
  • XOD nos permite hacer desarrollo modulares con varios microcontraladores chicos operando en paralelo con tareas altamente especifica. Le recomiendo mucho esta estrategia, No trate de concentrar todas las tareas en un solo solo microcontrolador porque el sistema es muy Vulnerable a fallas cuando son dependientes del tiempo como es su caso.
  • Actualice su informaciĂłn visual en perĂ­odos no menores a 500ms y no mayores a 2000ms. Se ve muy agradable. casi como con un toque vintage analĂłgico. y esto mejora la perforarse de su equipo porque en definitiva usted tiene un filtro pasa bajo digital muy bĂĄsico pero efectivo.

Por ultimo y creo que es la mĂĄs IMPORTANTE

  • No deje de preguntar.
  • No deje de experimentar.
  • No deje de estudiar.
  • Evite que le den la soluciĂłn hecha, Prefiera siempre aprender.

Posibles mejoras

  • Una vez que tenga funcionando su equipo puede poner un auto rango en la escala de mediciĂłn.
  • Mostrar el en un diagrama de Barras de LED o puede ser mucho mas rĂĄpido y ocupar muchos menos recursos de su procesador
  • Utilice un pequeño servo como si fuera un instrumento a analĂłgico, BMW lo utiliza hace años en muchos de los tableros de sus motos mas costosas. el servo le ocuparĂĄ muy poco cĂłdigo y recursos de su su microcontrolador.
  • Puede usar tambiĂ©n alguna salida PWM y algĂșn instrumento o visualizado analĂłgico. Hay una Gama muy amplia de opciones con la que puede experimentar segĂșn su caso.

Espero que algo de esto le sea Ăștil.
Un Cordial saludo desde la Cuidad de Concordia - Entre RĂ­os - Argentina.
Guillermo

Thanks for the replies. Im going to explore some other options. Maybe a simple gear reducer since the resolution is somewhat overkill for my application.

Es mĂĄs reducir la la frecuencia con un divisor electrĂłnico.

I ended up getting it to work, but not in xod. I used a Metro M4 board (SAM51) and wrote a script in Python which im more familiar with.

Getting solid and predictable readings up to 100mph (161 km/h)

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.