Go Down

Topic: Contar pulsos (Read 6492 times) previous topic - next topic

blueicaro

Hola soy nuevo en arduino, y después de hacer algunos "experimentos", quiero hacer un programa que cuente revoluciones por minuto.

Así que voy a colocar un sensor en una entrada digital que envía pulsos, pero tengo algunas dudas.

Cual es la frecuencia máxima que puede recibir arduino de pulsos, sin perder ninguno?

Saludos

Igor R

Hola,

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).

  • Ejemplo de Tacómetro=> http://www.instructables.com/id/Arduino-Based-Optical-Tachometer/

  • Pin del ICP (8 Diecimila) =>Input Capture Unit. Puedes leer en la documentación de Atmel. Lo que haces es medir directamente con un timer el tiempo. Con ésto podrías por ejemplo, mirar el duty cycle de tu onda cuadrada. http://winavr.scienceprog.com/avr-gcc-tutorial/program-16-bit-avr-timer-with-winavr.html



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.

Saludos   ;)



Igor R.

blueicaro

Gracias por la información.
:)
/BlueIcaro

glt

De acuerdo a este post: http://billgrundmann.wordpress.com/2009/03/02/the-overhead-of-arduino-interrupts/ 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

Igor R

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....




blueicaro

#5
May 13, 2009, 09:51 am Last Edit: May 13, 2009, 09:52 am by blueicaro Reason: 1
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? .

Saludos

/BlueIcaro

Igor R

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....


blueicaro

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:
Quote
¿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?

/BlueIcaro

Igor R

Si no me equivoco, porque hoy estoy un poco espesito....

50.000 vueltas por minuto = 833,33 vueltas por segundo

Hz= veces en un segundo


;)




blueicaro

Vamos, espesito...  :)
Empanado estoy yo, si es que yo solo me estaba contestando, al poner pulsos por unidad de tiempo.

Lo que pasa es que hablé de RPM (revoluciones por minuto) y de golpe pase a vueltas por segundo yo solito, cargando la conversión  [smiley=shocked.gif]

Gracias Igor

Saludos

Igor R

ja,ja,ja

Esto pasa hasta en las mejores familias!!

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....


;)


Go Up