Tienes dos opciones, usar las interrupciones del pin 2 y 3 y usar el lenguaje de Arduino ó usar el ICP, lo que tendrás que usar C (que puedes combinar con wiring).
Para saber la velocidad máxima que puedes medir, depende de tu clock (16MHz) y también del código que hagas en la interrupción.
Yo hasta 80 KHz, usando ICP mido bien.
De acuerdo a este post: The overhead of Arduino Interrupts | Bill Grundmann's Blog se tardan 51 ciclos para atender al interrupt. Supongamos que lo que haces en el interrupt se tarda 49 ciclos, entonces lo maximo que puede medir es 16MHz/100 o 160KHz
Lo que esta claro,que para intentar sacar el máximo, no puedes hacerlo en C y menos en Wiring.... tienes que ir a ensamblador, si quieres minimizar los tiempos y un control total.
Algo en Wiring, normalmente será más lento que hacerlo en C. Ya que en WInterrupts, al final hace ISR (bueno, hace Signal porque es algo antiguo....). Pero hasta llegar a esto, hace muchas cosas más ya que attachInterrupt es una función creada... Por lo que mira si le has pasado interrupcion 1 ó 0 y configura los registros para atender interrupciones.
Luego, una vez que entras a la interrupción, llama a la función que le has pasado en attachInterrupt..... Sólo con esto: hace un salto al código de interrupción y otro desde la interrupción a tu función....
Hola, ahora que sacáis el tema de ensamblador, es algo que estoy muy interesado, aunque mi ensamblador está algo oxidado tengo experiencia en él (alguien recuerda el commode C64, luego tambien toque algo de 8086).
Me gustaría programar Arduino en Ensamblador, por una idea que tengo en mente (aún tengo que aprender mucho sobre esta placa), y ahora que lo comentáis, pues quizás lo necesite para este contador de pulsos.
Ya que la idea, por la que abrí este post, es leer las revoluciones de un motor que gira, sobre 40.000-50.000 vueltas por minuto. Lo que son muchas, por eso mi pregunta de la capacidad del arduino.
Aunque tengo que comentar que tengo en mente poner una reducción mecánica.
Pero bueno, sin liar mucho el post, ¿por dónde puedo empezar a ver el tema del ensamblador? .
Busca info directamente acerca de ATMega168.... La página de avrfreaks...
¿Cuantos dientes vas a poner para medir la velocidad? 50.000 vueltas por minuto son aprox 850 Hz si usas un diente...Yo usando C + Wiring "veo" 80.000 hz sin problemas y todo es más fácil. Uso el ICP porque me interesa saber el duty cycle además de la frecuencia. Y no me he matado en optimizar el código....
Hola, la reducción ira en función de lo que encuentre y me valga en una impresora que voy a desmontar.
Por otra parte no entiendo como calculas esto:
¿Cuantos dientes vas a poner para medir la velocidad? 50.000 vueltas por minuto son aprox 850 Hz si usas un diente...
Si yo pongo un disco, un sensor en él, de manera que de una vuelta y en cada una de ellas envíe un pulso, tendré que el número de pulsos por unidad de tiempo, me darán las vueltas a lo que gira eso, osea la frecuencia de giro, ¿o me me equivoco?
Te comentaba, que depende de lo que vayas a hacer y la precisión que necesites para la velocidad, si no pones muchos dientes, no te sale una frecuencia muy elevada y vas sobrado usando Wiring ó C, y todo es muchisimo más sencillo y rápido de programar....
Puedes ver que son 4 líneas de código en los ejemplos que te puse de tacómetro....