Filtro digital para 1 Hz

Muy buenas,
Mi caso es el siguiente, tengo un encoder optico incremental, el cual su salida es digital.Necesito filtrar la salida de manera que quite la frecuencia de 1 Hz. Con que circuito puedo realizarlo? Me han hablado algo sobre Laplace etc. pero no lo tengo muy claro.
Alguien sabe como es?

Un saludo y muchas gracias
 
Hola, que querés medir con el encoder?, posición?, velocidad?, o ambas cosas?. En cuanto a lo de filtrar, si usas la señal de un canal de cuadratura el objetivo del filtrado es solo quitar las componentes de alta frecuencia, y 1 Hz es una frecuencia muy baja....
La pregunta principal creo que es: para que querés filtrar la señal del encoder?.
Ahora que lo pienso bien puede ser que quieras obtener una señal de continua a partir del tren de pulsos del encoder con un convertidor frecuencia a tensión, pero eso serviría solo para velocidad, no para posición.
Saludos
 
Voy a usar el encoder para medir la inclinación de una bicicleta, es decir tengo que contar el número de pulsos para conocer el número de grados el cual se ha inclinado, para esto utilizaré un PIC el 16c74 concretamente. Entonces, el problema radica que el péndulo oscilará cuando la bicicleta esté en movimiento, he medido esta frecuancia de oscilación del péndulo por sí solo y oscila 1 Hz. Necesito que le llegue todas las frecuencias excepto 1 Hz, es decir un paso alto de 1 Hz. Para así conseguir que el PIC no vea los pulsos a esta frecuencia.
Saben como realizarlo?

Saludos
 
No entiendo lo del péndulo.... a ver, ahora que lo pienso si es para medir inclinación se trataría de algún pequeño peso colgado de la bici y eso ligado al eje del encoder que está fijo a la bici....
Bueno, de ser así creo que podrías poner un lazo histéresis si la oscilación no es muy amplificadora, es decir, de muchos pulsos en los canales del encoder. Y sino hacer un promedio móvil de unas cuantas muestras en el intervalo de 1 segundo (la oscilación es tan precisa?), es decir, que posición=suma de N posiciones anteriores / N. Habría un retardo de al menos 1 segundo en la indicación también.
Hacer un filtro notch en forma analógica para 1 Hz para un señal de encoder, no tengo idea, y no sé si sea realizable.
En forma digital.... no recuerdo mucho de filtros digitales. Con eso tampoco puedo ayudar.
En fin, algún colega del foro tal vez nos dé una idea.
Saludos
 
Lo que queres hacer esta bien claro, pero esta mal 'como' lo queres hacer.

Un encoder incremental te entrega dos señales 'cuadradas' en cuadratura (defasadas 90°), lo que se filtra en este tipo de señales es la alta frecuencia para minimizar el riesgo de error debido a un falso conteo por ruido.
Lo que queres hacer, que la señal pase por un filtro pasa alto antes de entrar al PIC es absurdo.
Si fuera un filtro analogico distorsionaria la señal y contarias cualquier cosa, y si fuera un filtro digital como parece sugerir el titulo del hilo, es ridiculo poner un microcontrolador para acondicionarle la señal a otro microcontrolador.

El filtro deberia ser digital y calculado por el mismo PIC, y si queres la posicion tiene que ser pasa bajo.

De cualquier manera, no creo que te sirva, porque cualquier filtrado implica un retardo en la respuesta.
Si la frecuencia molesta es de 1Hz -> la frecuencia de corte del filtro deberia ser de 0.5Hz por lo menos -> el retardo sera del orden de los 2 segundos.
 
Jerkox, podés implementar un filtro digital, es bastante sencillo y más en tu caso que la velocidad de muestreo debe ser bastante baja (<100Hz) y tenés mucho tiempo para sacar las cuentas.
Podés implementar un filtro notch IIR que incluso atenue altas frecuencias, el MATLAB te da los coeficientes y después se los das de comer a un algoritmo muy sencillo. Te recomiendo que programes el PIC en C así te ahorrás la parte de las operaciones con punto fijo.
Si no sabés cómo hacerlo pasame la frecuencia de muestreo que estás usando y lo vamos viendo.

Slds...

PD: Todo tiene sus costos y como bien dice Eduardo vas a tener un retardo, tenés que analizar si este retardo influye sobre el control que quieras implementar.

Edición: Hice una prueba en MATLAB de un notch de 1er orden suponiendo que la frecuencia de muestreo es 100Hz y el retardo era de 250ms máximo en 1Hz, a los 2Hz ya era despresiable. El filtro son 5 multiplicaciones y 6 sumas.

Mariano
 
Muchisimas gracias por las respuestas.

Le explicaré detalladamente cual es mi caso, se trata como bien dice Ardogan de un péndulo enganchado a un encoder de manera que cuando la bicicleta se ladee el péndulo también y así obtener los grados dependiendo de cuantas cuentas cuente el PIC.
Como ustedes saben el problema viene en la oscilación del péndulo el cual oscilará respecto al punto que yo quiero. Esta oscilación es de entorno a 1 Hz, pero claro ¿entonces los pulsos que de el encoder también serán de 1 Hz?

SIgmaOrion no tengo mucha idea de como hacerlo si me puedes decir o enviar como realizarlo e implementarlo te estria muy agradecido. Te explico que la máxima frecuencia que el péndulo puede oscilar en la bicicleta según he leido está en torno al 1.5 Hz. Por tanto creo que 100 Hz estría bien como velocidad de muestreo También les comento que el PIC está programado en ensamblador y tiene que calcular además de la inclinación de la bicicleta, la velocidad, distancia y giro del manillar. Entonces tendría que filtrar también la señal del encoder con el PIC?.

Saludos
 
Jerkox, porque insistis en saltarte pasos?.
Porque no empezas leyendo COMO es un encoder y QUE tipo de señal da, antes de usar un elemento que no tenes la mas remota idea de como trabaja?.
 
Hola
No tienes necesidad de crear ningun filtro. Un encoder tiene dos salidas las cuales se activan simultameamente, la salida que primero se active dependera del sentido de giro.

Tu estas dos salidas tienes que aplicarlas al pic, de modo que este te sume los pulsos o bien te los reste. De esta forma aunque el pendulo oscile los pulsos a contar se mantendran dentro de un margen.
 
Corrijanme si estoy equivocado, pero lo que yo interpreté de Jerkox es que él ya sabe cómo funciona el encoder y ya pasó la etapa de hacer el algoritmo para generar un valor proporcional al ángulo de la bicicleta. El problema es que quiere rechazar el balanceo normal de la bicicleta al andar sin perder la habilidad de medir tanto un ángulo fijo o cambios bruscos y no sabe cómo hacer el filtro.
Jerkox, si lo que digo arriba no es cierto entonces seguí los consejos de pepechip y Eduardo y cuando esté eso listo vemos el tema del filtro.
Por otro lado, te aconsejo que para tu aplicación programes el PIC en C, sino vas a tener muchos dolores de cabeza y vas a tardar mucho tiempo en hacerlo andar.

Slds...

Mariano
 
El programa ya esta hecho, el algoritmo, en ensamblador, ya he conseguido que el PIC cuente los pulsos que sepa derecha o izquierda (dependiendo de cual vaya antes canal A o B) y ya tengo el ángulo. Eso ya esta hecho. Simplemente les habia explicado todo para qu entiendan todo en general, perdonen si me han mal interpretado.
Efectivamente SIgmaOrion necesito eliminar ese balanceo (ruido) del pendulo de manera que el PIC esos conteos los rechace sin perder los conteos reales. Entonces, no entiendo muy bien lo que me dices con el MATLAB. Si bien me los puedes mostrar y decirme que podria hacer.

Saludos y gracias
 
Hola Jerkox. Te tengo unas preguntas.

1. Por que en lugar del filtro, no tomas simplemente el valor maximo de la desviacion para calcular el angulo de inclinacion?

2. Cual es el tiempo de respuesta que esperas del sistema?.

3. como afecta la fuerza centrifuga a tu sistema?

Salu2
 
El pendulo al balancearse en el aire es muy inestable y balancea continuamente, sin embargo si este lo sumerges en un recipiente con aceite el movimiento sera mas lento.
 
A Macraiq, voy a usar un encoder optico incremental y tienes que ir contando progresivamente los pulsos para conocer el ángulo de desviación, asi pues no puedes conocer el valor maximo. A lo siguiente que me preguntas no te entiendo muy bien, pues voy a usar un PIC conectado al encoder el cual tiene que ir guardando los resultados obtenidos, creo que usare una frecuencia de muestreo de unos 100 Hz.

A pepechip creo que es inviable colocar en una bici un tanque lleno de aceite para que se mueva mas lento.

Saludos
 
Jerkox, el algoritmo que tenés que hacer tiene que sacar las siguientes cuentas:

y(n) = b(1)*x(n) + b(2)*x(n-1) + b(3)*x(n-2) - a(2)*y(n-1) - a(3)*y(n-2)

donde y(n) es el valor actual de la salida del filtro, y(n-1) es la muestra anterior de salida del filtro (vas a tener que ir guardandolas) e y(n-2) es la anterior a y(n)... y así.
x(n) es la última muestra de tu señal de entrada al filtro (de la señal original, sin filtrar, también tenés que guardar 3 muestras), x(n-1) es la musetra anterior de la entrada y x(n-2) es la anterior.
Acá abajo te paso el valor de los coeficientes a y b.

b(1)=0.9845, b(2)=-1.9654, b(3)=0.9845
a(2)=-1.9654, a(3)=0.9691

Eso te genera un notch en 1Hz únicamente si tu velocidad de muestreo es 100Hz, sino se te va a correr.
Si querés implementar también un pasabajo con frecuencia de corte 10Hz (creo que te sería conveniente) usá TAMBIÉN los siguientes coeficientes (es decir, sacá las cuentas en cascada):

b(1)=0.2452, b(2)=0.2452, b(3)=0
a(2)=-0.5095, a(3)=0

Las cuentas son multiplicaciones y sumas con punto fijo, por eso te dije que te conviene programar en C. Si programás en C esto sale facilísimo y anda muy bien, yo lo he usado.

Te adjunto la respuesta en amplitud y fase de los filtros en cascada.

Cualquier duda preguntá.

Slds...

Mariano[/img]
 

Adjuntos

  • amplitud_293.jpg
    amplitud_293.jpg
    34.8 KB · Visitas: 458
  • fase_286.jpg
    fase_286.jpg
    32.2 KB · Visitas: 470
Jerkox dijo:
A Macraiq, voy a usar un encoder optico incremental y tienes que ir contando progresivamente los pulsos para conocer el ángulo de desviación, asi pues no puedes conocer el valor maximo. A lo siguiente que me preguntas no te entiendo muy bien, pues voy a usar un PIC conectado al encoder el cual tiene que ir guardando los resultados obtenidos, creo que usare una frecuencia de muestreo de unos 100 Hz.

A pepechip creo que es inviable colocar en una bici un tanque lleno de aceite para que se mueva mas lento.

Saludos

Pues entonces no entiendo la relacion entre el tren de pulsos que obtienes y el angulo de desviacion. El pendulo que tienes es un sistema dinamico, que, por las caracteristicas fisicas del pendulo, siempre oscilara con un periodo constante. Puedes, por favor, explicarme la relacion entre el tren de pulsos y el angulo de inclinacion? por q a mi juicio, si cuentas los pulsos en un sentido, hasta que el sentido de giro cambia, tienes un maximo!. Si sabes la separacion, en pulsos entre maximos, conoces entonces donde se encuentra el eje de oscilacion! ( y no necesitas filtro).

Perdoname si me equivoco, pero no entiendo como puedes determinar cual es el angulo de inclinacion sin conocer donde se encuentra el eje de oscilacion del pendulo. Podrias explicarmelo, pues me parece casi magico.

Salu2.
 
A macraiq. El pendulo esta conectado al encoder el cual a inclinarse genera en el encoder un tren de pulsos, dependiendo de como se incline la bicicleta asi se inclinara el pendulo y de etsa manera conocere el numero de pulsos. Ahora efectivamente es un sistema dinamico, esto significa que el pendulo oscilará mientras se mueve al lugar deseado. Esta oscilacion no la quiero y es de aproximadamente 1 Hz de frecuencia. La opcion que em propones es ir viendo el centro de la oscilación pero no se como podria realizarlo pues si en ese momento no oscila si no que se inclina realmente hacia el otro lado, no sabrias en que punto para el maximo. Puede que no te haya entendido muy bien pero si lo ves mas sencillo y me lo podiras explicar te estaria muy agradecido.

A SigmaOrion, muchisimas gracias por molestarte en los coeficientes y demás, lo unico que como tu dices puede que sea realmente complejo implmentarlo en ensamblador, el programa ya esta realizado en ensamblador y seria ahora mismo imposible cambiarlo a C, entonces deberia ir usando subrutinas multiplicacion division.... Lo que no entiendo es que despues del filtro como interpreto la salida del filtro para contar las cuentas.Perdona por la ignorancia pero es la primera vez que hago algo asi.

De nuevo un saludo y gracias
 
Jerkox, de nada, no es molestia, el que calcula los coeficientes es el MATLAB, no yo, jeje. Si estás obligado a trabajar en assembler buscá en www.microchip.com en las notas de aplicación, buscá multiplicación y suma con punto fijo. División no necesitás.
Respecto de la salida del filtro: Es lo mismo que la entrada pero con la oscilación de 1Hz atenuada, es decir, si tu péndulo quedó oscilando en su frecuencia natural (1Hz) y a la vez inclinaron la bicicleta entonces X va a ser una rampa que representa la inclinación de la bicicleta con una onda de 1Hz montada. Y va a ser simplemente la rampa de la inclinación, que es lo que te interesa, y la oscilación de 1Hz va a ser muy suave.

Mirá un poco por acá http://es.wikipedia.org/wiki/Filtro_digital, el filtro que te pasé es tipo IIR. Googleleá "filtro IIR" que sale mucho, vas a encontrar ejemplos.

Slds...

*** EDICION ***

En www.microchip.com buscá la nota de aplicación AN616, implementan un filtro notch de 60Hz con un PIC16C74, te va a venir MUY bien leerla.
 
Pefecto me pondre a estudiarlo SigmaOrion, te importaria pasarme el archivo de matlab que calcula los coeficientes?
Si me surge alguna duda te preguntaré

Nuevamente muchas gracias y un saludo
 
Atrás
Arriba