Pages: [1]   Go Down
Author Topic: Contar pulsos  (Read 5430 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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



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   smiley-wink



Igor R.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por la información.
 smiley
/BlueIcaro
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 140
Arduino for HiFi
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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



Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 13, 2009, 02:52:25 am by blueicaro » Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


 smiley-wink



Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vamos, espesito...  smiley
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
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


 smiley-wink

Logged


Pages: [1]   Go Up
Jump to: