Componentes y tecnología electrónica, regulación, automatización, domótica, inmótica y edificio inteligente. Protocolo KNX, X10, EIB, LON, DALI, DMX, Zigbee, Powerline…
por
#279330
Buenas. Me gustaría saber cuál es la mejor estrategia para calcular la frecuencia de los pulsos obtenidos desde un encoder incremental de 100 pulsos/vuelta (y a partir de ahí obtener la velocidad del eje). La salida del encoder la llevo al módulo CJ2M-MD212 de OMRON. La instrucción PRV2(883) ya da la velocidad pero por lo que he entendido sólo vale para uno de los contadores de la tarjeta, y yo tengo dos encoders. Así que tengo que calcularlo por mi cuenta, al menos para uno de los dos.
Uso interrupciones y veo el tiempo en el inicio y la parada del contador, defino un temporizador y leo el valor del contador en cada instante, etc...
¿qué me aconsejais?
Gracias.
por
#280257
Bueno, comento lo que he estado probando y los resultados, a ver si me aclaráis un poco lo que puede estar pasando.
Alternativa 1:
Configuro el contador rápido para que cuente en modo anillo, y así evito resetearlo. En el programa principal configuro un temporizador para que se autoresetee, cuando su salida está a 1 leo el valor del contador con PRV y lo guardo en un canal de memoria, cuando el PV del temporizador es cero leo el valor del contador con PRV y lo almaceno en otro canal, cuando la salida del temporizador está a 1 resto las dos posiciones y divido por el tiempo al que he configurado el temporizador y obtengo la velocidad del eje. Colocando las instrucciones de manera que siempre haga el cálculo con los valores del contador correspondientes al mismo ciclo del temporizador.
Esta versión me funciona quitando una parte de código que se encargaba del caso en que un ciclo del temporizador ocupaba dos ciclos del contador rápido, es decir que el valor en t=0 es mayor que en t=T porque el contador vuelve a 0 durante ese tiempo (me acabo de dar cuenta de que puede pasar que el contador se resetee durante el temporizado pero que aún así el valor de t=0 sea menor que el de t=T y no lo he tenido en cuenta).
Alternativa 2:
Configuro el contador rápido para que cuente en modo lineal. En el programa principal tengo el mismo temporizador anterior con autoreset y uso CTBL para crear una tabla de comparación para el contador rápido de manera que cuando alcance el valor 800 me lance una interrupción. En la subrutina de interrupción divido 800 por el valor que tiene en ese momento el temporizador y obtengo la velocidad. A continuación en la misma subrutina activo el bit de reset del contador rápido y un bit que también resetea el temporizador. La primera vez no va a dar un valor correcto porque el temporizador y el contador no tienen por qué arrancar al mismo tiempo, pero una vez que se ejecuta una vez la rutina de interrupción se resetean los dos a la vez y ya se obtiene un valor coherente.
Esta versión funciona bien al principio pero llega un momento en que el contador rápido no se resetea y el PV sigue subiendo por encima de 800. Lo que se me ocurre es que como la rutina de interrupción se ejecuta en cualquier momento, puede pasar que yo active el bit de reseteo de contador y en el programa principal lo vuelva a poner a cero antes de que realmente se resetee el contador.
Lamento el rollazo pero espero haberme explicado con suficiente claridad y que alguno me pueda dar alguna pista de lo que ocurre.
por
#280293
Gracias por la respuesta.
Te refieres a conectar la salida del encoder a una entrada de interrupción y calcular el tiempo entre cada pulso? Lo que pasa es que el encoder da 100 pulsos por revolución y la velocidad nominal del eje son 480 rpm con lo que son 48000 pulsos por minuto (800 pulsos por segundo). Se ejecutaría una interrupción cada 1ms y no se si se estarían ejecutando continuamente interrupciones elevando el tiempo de ejecución del programa principal.
por
#280295
fabriziomoretti escribió:Gracias por la respuesta.
Te refieres a conectar la salida del encoder a una entrada de interrupción y calcular el tiempo entre cada pulso? Lo que pasa es que el encoder da 100 pulsos por revolución y la velocidad nominal del eje son 480 rpm con lo que son 48000 pulsos por minuto (800 pulsos por segundo). Se ejecutaría una interrupción cada 1ms y no se si se estarían ejecutando continuamente interrupciones elevando el tiempo de ejecución del programa principal.


Si , a eso me referia , sabiendo el tiempo entre pulsos puedes calcular la velocidad .Dado que no puedes medir la frecuencia directamente en dos entradas solo se me ocurre medir el tiempo entre pulsos para calcular la velocidad .He visto que este modulo puede medir revoluciones directamente con PRV2 ( solo es valido ambien con in 0 ) .
por
#280304
Como comentaba en el primer post la razón de hacer éste cálculo es que tengo dos encoders conectados a las entradas de contaje rápido pero la instrucción PRV2 sólo funciona con el contador 0, por tanto necesito programar yo el cálculo de la velocidad del otro encoder. Puedo probar a hacer lo que me aconsejas pero me parece una frecuencia muy elevada de ejecución de interrupciones.
por
#280306
fabriziomoretti escribió:Como comentaba en el primer post la razón de hacer éste cálculo es que tengo dos encoders conectados a las entradas de contaje rápido pero la instrucción PRV2 sólo funciona con el contador 0, por tanto necesito programar yo el cálculo de la velocidad del otro encoder. Puedo probar a hacer lo que me aconsejas pero me parece una frecuencia muy elevada de ejecución de interrupciones.



Otra opcion podria ser usar HSC y una interrupcion temporizada cuando arranque el motor pongas a cero el HSC y muevas su valor a una memoria ( memo valor actual ) y restas "valor_ actual" menos " memo_valor _actual " ( 0 en la primera interrupcion ) .En la siguiente interrupcion restas "valor actual " menos "memo valor actual" = "pulsos_ entre_ interrupciones".

Conociendo la variable " pulsos entre interrupciones" y como conoces el tiempo entre ellas podras calcular la velocidad no ?
Palabras clave
Temas similares

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

Permisos de mensaje

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro