# Filtro digital para 1 Hz



## Jerkox (Abr 3, 2008)

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


----------



## Ardogan (Abr 3, 2008)

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


----------



## Jerkox (Abr 4, 2008)

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


----------



## Ardogan (Abr 4, 2008)

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_


----------



## Eduardo (Abr 4, 2008)

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.


----------



## SigmaOrion (Abr 4, 2008)

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


----------



## Jerkox (Abr 5, 2008)

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


----------



## Eduardo (Abr 5, 2008)

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


----------



## pepechip (Abr 5, 2008)

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.


----------



## SigmaOrion (Abr 5, 2008)

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


----------



## Jerkox (Abr 5, 2008)

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


----------



## macraig (Abr 5, 2008)

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


----------



## pepechip (Abr 5, 2008)

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.


----------



## Jerkox (Abr 5, 2008)

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


----------



## SigmaOrion (Abr 5, 2008)

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

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

donde y 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... y así.
x 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]


----------



## macraig (Abr 6, 2008)

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.


----------



## Eduardo (Abr 6, 2008)

Macraiq,  un encoder tiene dos salidas defasadas, de acuerdo a cual cambie de estado primero se conoce la direccion y con eso de decide entre cuenta ascendente o descendente.
http://en.wikipedia.org/wiki/Rotary_encoder

Ah, y todo 'buen' encoder dispone de una tercera salida como indice que da un pulso por vueelta.


----------



## Jerkox (Abr 6, 2008)

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


----------



## SigmaOrion (Abr 6, 2008)

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.


----------



## Jerkox (Abr 6, 2008)

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


----------



## SigmaOrion (Abr 6, 2008)

Ningún problema, helo aquí.

Lo que vas a ver son dos funciones principales:
1) [B,A]=butter(......): en base a los que definas en (....) te devuelve los coeficientes en B y A.
2) y=filter(B,A,x): toma como función de entrada 'x' y le aplica el filtro 'B,A'. Lo guarda en y. Yo hize que x sea un impulso para tener en y la respuesta al impulso del filtro.

Slds...

Mariano

PD: renombrá el archivo a '.m' para usarlo en MATLAB, no sé porqué no me dejaba adjuntarlo con esa extensión.


----------



## macraig (Abr 6, 2008)

_Eduardo_ dijo:
			
		

> Macraiq,  un encoder tiene dos salidas defasadas, de acuerdo a cual cambie de estado primero se conoce la direccion y con eso de decide entre cuenta ascendente o descendente.
> http://en.wikipedia.org/wiki/Rotary_encoder
> 
> Ah, y todo 'buen' encoder dispone de una tercera salida como indice que da un pulso por vueelta.



Conozco como funciona el encoder, pero gracias por la información adicional . Es por eso que me ha sorprendido que en su post anterior me dijera que no puede determinar el maximo.

Sin embargo, gracias a la explicacion de jerkox entiendo mejor su problema. El problema no consiste en no poder determinar el maximo. Sino en que como se trata de un sistema en movimiento continuo, no sabe cual es el maximo.

Jerkox, tienes razon, no habia considerado el movimiento constante, o que la variacion puede ser tan rapida. Es un problema interesante, dejame lo consulto con la almoada y veo que se me ocurre manana.

Salu2.

PD: Una pregunta, ?un pendulo de 25 cm no estorba demasiado en la conduccion?


----------



## Jerkox (Abr 6, 2008)

Gracias SigmaOrion, lo dicho me pondre a ello.

A macraiq, lo pienso colocar en la barra de la bicicleta y creo q no dificultara mucho, aujn no lo tengo emplazado realmente pero creo q servira.


----------



## Jerkox (Abr 8, 2008)

He estado probando con la senal que me sale del pendulo y es inestable, te mando el programa que he hecho con una posible entrada senoidal de frecuencia 1 Hz. Tambien he estado probando con un filtro pasa alta pues puede que sea mas facil ya que creo que no habra ninguna senal debajo de 1 Hz que me moleste. Te mando el paso alto y las senales de salida. (Esta en .txt cambialo a .m)

Saludos


----------



## SigmaOrion (Abr 8, 2008)

Jerkox, hay varios problemas con lo que hiciste.

1) La variable "t" no estaba calibrada a la escala de tiempo real, o sea que la función "sin(2*pi*t)" no genera una señal de 1Hz, sino una de 100Hz que está completamente fuera del rango de frecuencias para esa velocidad de muestreo, entonces el contenido de "x" y de "y" carecen de sentido. Para poder hacer lo que quisiste hacer el paso de t tiene que ser de 0.01s (100Hz de muestreo).
2) La frecuencia de corte del flitro la acomodaste en 0.75Hz (50Hz*0.015) con lo que el filtro pasa alto te deja pasar tu señal supuestamente indeseada de 1Hz. En ese caso te recomiendo que uses como frecuencia de corte 1.5Hz ó mayor, digamos una frecuencia normalizada de 1.5/50=0.03 ó mayor.
3) Aunque acomodes lo que te digo en el punto 1) los gráficos carecen de utilidad porque si tu variable de entrada al filtro es simplemente un seno entonces el filtro va a actuar sólo sobre esa frecuencia ya que es la única que existe en tu señal, por lo tanto cuando transformadorrmás por fourier la variable de salida "y" sólo va a contener esta componente de frecuencia y no vas a ver el comportamiento del filtro en todo el espectro. Por eso yo hice un delta de kronequer como variable de entrada, la cual contiene todas las componentes de frecuencia, desde 0Hz (dc) hasta 50Hz (máximo para 100Hz de muestreo).

Yo no sé bien qué frecuencias querés rechazar y cuáles querés que entren a tu sistema porque no sé cuál es la finalidad. Tenés dos opciones:
1) Nos contás con detalle cuál es la finalidad práctica de tu circuito y con eso entre todos podemos determinar y ayudarte a ver si realmente necesitás un filtro o hay otra alternativa más sencilla (es lo que planteaba Macraiq si no me equivoco).
2) Me decís qué frecuencias querés rechazar y cuales querés que entren al sistema y yo te diseño el filtro, te paso la formulita que tenés que aplicar y después implementás el algoritmo. Si se complica eso lo vemos después.

Slds...

Mariano


----------



## Javier Rambaldo (Abr 8, 2008)

En realidad sí se puede conocer el máximo.
Al tomar una muestra en el tiempo, obtienes una porción del movimiento, o sea en un intervalo de tiempo. El máximo en un intervalo se puede conocer.

Me parece interesante el desafío....

Yo haría lo siguiente:
Tomaría las muestras en un intervalo de tiempo significativo, haciendo un promedio ponderado de estas muestras, en tiempo real. 
Si haces el promedio ponderado *con signo*, o sea con el sentido del péndulo, la resultante estaría muy cercana al eje de la oscilación.

_...y todos los caminos conducen a Roma..._
Sería lo mismo que hacer un pasabajos, o poner el péndulo en aceite o un filtro digital...


----------



## SigmaOrion (Abr 8, 2008)

Javier, te hago una pregunta porque no entendí bien (y el tema está bueno). Cuando hablás de ponderación, cómo las ponderarías a las muestras? digo, sería algo así como x[n] = SUMA(x[n-m]/m), o cómo? no sé, no me lo imagino, je.
Habría que ver cómo es la respuesta del sistema en cuanto a fase, me da la sensación de que eso genera un retardo muy grande (como dijo alguien en algún lugar del hilo).

Bueno, igual todo depende de las necesidades de Jerkox.

Slds...

Mariano


----------



## Jerkox (Abr 8, 2008)

Muy buenas a todos, bien os explicare con detenimeinto lo que yo quiero realizar.
Objetivo: Medir la inclinación de una bicicleta con la ayuda de un encoder y un pendulo.
Instrumentación: poseo el encoder HEDS-9100 y una barra sujeta al rotor del encoder
Parte ralizada: poseo el codigo que cuenta las cuentas del encoder al girar de un lado al otro, es decir, los grados lo calcula. El PIC es el 16C74 y esta programado en ensamblador.
Problema: como ustedes saben el pendulo oscila, es decir no queda fijo cuando la bicicleta se inclina hacia un lado o al otro. Esta oscilación esta medida y es en torno 1 Hz de oscilación. Les adjunto una foto de una muestra tomada.
Que necesito: Eliminar esta oscilación y que solo el PIC cuente las cuentas que sean de la verdadera inclinación de la bicicleta.

Por lo tanto,creo que se podria incluso hacer un paso alto pues las frecuencias menores a 1 Hz creo que no entrarian en conflicto verdad?. Es decir mas lento no va ir el pendulo que a 1 Hz.

Tengan en cuenta que la bicicleta e sun sitema dinamico y por tanto no se si se podria llegar a conocer el centro de la oscilación. Pues pienses, el pendulo irá oscilando respecto al eje central de la bicicleta, pero a su vez existirá otra oscilación del pendulo en si mismo.

Perdonen si les estoy mareando pero sobretodo de matlab ando verde...

Un saludo y gracias


----------



## Jerkox (Abr 9, 2008)

Creo que ya he encontrado el error del sample os cuento lo que voy averiguando


----------



## SigmaOrion (Abr 9, 2008)

Jerkox, está clarísima la idea. Yo en tu lugar implementaría el filtro notch por distintas razones:

1) Un pasa-altos te elimina la componente de DC, entonces si la bicicleta está constantemente inclinada vos no te vas a enterar. Por otro lado no estoy de acuerdo con que el péndulo no va a producir frecuencias por debajo de 1Hz: suponete que el péndulo está oscilando pero a su vez la bicicleta si inclina muy lentamente. Lo que vas a tener es una rampa muy lenta (inclinación real de la bicicleta) con una oscilación de 1Hz montada. Con el pasa-altos estás eliminando todo eso y no lo vas a ver.
2) Implementar el pasa alto tiene la misma complejidad que implementar el notch.
3) Usaría el filtro porque es muy sencillo de implementar, no tanto como un promedio o detectar máximos y mínimos, pero con muchísimas ventajas y más precisión.

Además de eso el PIC que tenés alcanza perfectamente para sacar las cuentas, eso sí, intentá ponerle un cristal para trabajar a 20MHz.

Slds...

Mariano


----------



## Jerkox (Abr 10, 2008)

Si, usare un cristal de 20 MHz mira te envio la respuesta usando el filtro, creo que filtra muy bien. Te adjunto una foto, en azul la señal a filtrar y en rojo despues del filtro. He usado unas frecuencias de [0.095 0.4] de fstart y fstop tambien ten en cuenta que al final he cambiado la frecuencia de muestreo (sample rate) a 10 Hz, (no necesitaba tantos puntos). Ahora ver como lo pongo en el PIC.

Un saludo y muchas gracias SigmaOrion


----------



## SigmaOrion (Abr 10, 2008)

Buenísimo Jerkox, se ve muy bien. Si querés probá el filtro también montando la señal de 1Hz sobre otra señal de 0.2Hz ó algo por el estilo para ver si a la salida del filtro realmente desaparece la de 1Hz y la otra permanece. Respecto de las frecuencias a mi me da la sensación de que fstop=0.4 es un poquito alta y que con 0.2 alcanzaba, pero bueno, eso es cuestión de ir probando y de las necesidades, total una vez que está implementado cambiar los coeficientes es cosa de 5 minutos.

Slds...


----------



## Ardogan (Abr 10, 2008)

Saliendo un poco del tema específico y yendo al objetivo de medir la inclinación de la bicicleta... es un buen método para medirla?. Lo digo porque imagino que los ángulos medidos van a ser pequeños. Es cierto que usando engranajes se puede solucionar...

En fin, quería proponer otro método, a ver que les parece. El dibujo que sigue lo hizo mi sobrino de 6 años apurado, no yo, jaja:


Bueno, ese circulo es la rueda, rayos no había ganas de dibujar más de 8, el soporte de la rueda es lo que está delimitado por las dos líneas que salen del círculo interior.

La barra iría colgada de donde se agarra la rueda, se le podría poner un peso para que haya menos oscilaciones y no la mueva el viento.
Lo que quise simbolizar con los cuadraditos es un par de sensores de efecto Hall, que se activarían a detectar el paso de imanes puestos en algunos de los rayos.

Entonces habría dos sensores de efecto Hall, uno fijo al extremo de la barra, y otro al sostén de la rueda (en la parte de arriba).
La idea sería medir el tiempo en que cada imán pasa por los sensores de efecto Hall. Y en base a ese tiempo sacar el ángulo entre los sensores de efecto Hall.
Claro, para eso hace falta conocer la velocidad a que gira la rueda, que se puede sacar de esos mismos sensores de efecto Hall.

w=velocidad angular = angulo/tiempo

angulo = w x tiempo = (velocidad tangencial / radio) x tiempo

suponemos que velocidad tangencial la medimos:

angulo sensor efecto Hall soporte - angulo efecto Hall barra = (velocidad tangencial / radio) x (tiempo efecto Hall soporte - tiempo efecto Hall barra).

Si la bici no estuviera inclinada ese ángulo es.... iba a decir 180º pero eso depende de la construcción de la bici, digamos que es igual a ángulo_fábrica.

Entonces sería:

inclinación = (angulo sensor efecto Hall soporte - ángulo efecto Hall barra)_medido - ángulo_fábrica.

Bueno, eso sería, ojalá se entienda. También pondría más de un imán en los rayos, para que la medición de velocidad y ángulo no se estropee a baja velocidad

Dije sensores de efecto Hall e imanes porque fué lo primero en lo que pensé, podrían ser leds y fotoreceptor y espejos en los rayos (servirá un CD para reflejar?).

Lo bueno es que nos ahorramos un encoder y terminamos midiendo tiempo, que se puede medir con muy buena resolución (los pics pueden usar una entrada capture para medir ese tiempo, y pueden medir desde unos cientos de nanosegundos hasta el tiempo que uno quiera usando la interrupción de desordamiento del temporizador asociado, el tipo va a tener que pedalear muy rápido para que se pierda resolución midiendo el tiempo).

Que es justo lo que me preocupaba del método de barra ligada a encoder, que no se usa toda la resolución del encoder porque se mide en un rango de posiciones del eje limitado (cierto, el reductor... pero ya es más engorroso no?).

A ver que opinan....


----------



## SigmaOrion (Abr 10, 2008)

Ardogan, la idea parece muy buena porque es sencilla, pero... todo tiene un pero, me cacho! lo que ahí vas a medir es el ángulo que forma (ummm, cómo decirlo?) el vector que une el eje de una rueda con el de la otra (horizontal, ha no ser que hagamos wili, güili o como sea, o que "colguemos la bici" como dicen otros) con respecto al plano de la tierra (del nivel de agua).
Bueno, después de tanto decir, creo que lo que quiere medir nuestro complañero Jerkox es otro ángulo, o sea, con el eje de giro justamente en la dirección en que se avanza. Sería algo así como el ladeo de la bicicleta cuando uno dobla, o algo por el estilo.

Ummm, qué matete, jaja, Jerkox, si el ángulo que vas a medir es el que dice Ardogan entonces yo voto por sacar el encoder también!

Slds...


----------



## Ardogan (Abr 10, 2008)

Aaaah bien, claro, lo que yo decía es para medir la pendiente del terreno, y no el ángulo entre el plano de la bici y el terreno.
Interpreté mal, sorry


----------



## Jerkox (Abr 11, 2008)

No no el angulo es la bici con respecto al terreno, es decir como tu bien dices SigmaOrion el "ladeo" de la bicicleta. Aun asi muchas gracias Ardogan.
Sigo trabajando con el filtro voy a probar metiendo dos señales aver si es verdad que la elimina, y despues queda una aprte engorrosa...el programarlo en el PIC en ensamblador. 


PD. Probe el ponerlo a 0.2 SigmaOrion pero no me filtra nada (vease dibujo), el 1Hz se queda fuera del filtraje.La verdad que usando [0.095 0.2] elimino bastante banda, existe alguna forma de poder afinarlo mejor? puede que usando el filtro de mayor rango no? pero esto significa mas coeficientes, mas carga computacional etc..

Saludos.


----------



## Javier Rambaldo (Abr 11, 2008)

Mariano (SigmaOrion), un ejemplo de promedio ponderado:


```
X[n] = X[n]+ (X[n-1]/2) + (X[n-2]/4) + (X[n-3]/8) + ...
```

y puedes seguir pero mas de 4 niveles no tiene sentido porque son despreciables.

Asi logras una muestra, mas la mitad anterior, mas la mitad de la mitad de la anterior...and so on...


----------



## SigmaOrion (Abr 11, 2008)

Gracias Javier por la aclaración. Se podría hacer una simulación en MATLAB o algo, eso sería un filtro FIR, no? voy a ver si puedo simularlo, el único inconveniente que creo que podría tener es que es pasabajos y para eliminar la señal de 1Hz va a tener mucho retardo (eso ya lo dijo Eduardo por la primera o segunda página).

Volviendo al filtro notch, disculpame, 0.2 corresponde justamente a 1Hz, quise decir 0.3 que es 1.5Hz. Acá te adjunto el resultado de filtrar la señal:

x = sin(2*pi*1*t) + sin(2*pi*0.2*t)

con dos filtros notch centrados en 1Hz pero con distintos anchos de banda. Usando 10Hz de frecuencia de muestreo como dijiste arriba.

1) filtro [0.133 .3].jpg es el filtro con cortes en 0.665Hz y 1.5Hz
2) filtro [0.167 .24].jpg es el filtro con cortes en 0.835Hz y 1.2Hz

Fijate que los resultados de los dos son muy bueno, la línea roja es la filtrada. Se ve que la de 1Hz se rechazó bien y la de 0.2Hz pasó perfectamente.

Slds...


----------



## Jerkox (Abr 12, 2008)

Se ve fenomeno SigmaOrion, probaré con el pendulo si realmente lo rechaza en la practica. En cuanto tenga algo nuevo os lo digo.

Saludos y muchas gracias.


----------



## gitanoloco (Ago 8, 2008)

SigmaOrion dijo:
			
		

> Ningún problema, helo aquí.
> 
> Lo que vas a ver son dos funciones principales:
> 1) [B,A]=butter(......): en base a los que definas en (....) te devuelve los coeficientes en B y A.
> ...



Te hago una consulta... estoy implementando tambien un filtro digital en un PIC16F877 a 20mhz.
Es un filtro de butterworth pasa bajos, de orden 5 con frecuencia de sampleo de 10Hz y frecuencia de corte de 0,5Hz...
Como hace 2 dias que uso el matlab mucho no caso, pero mi pregunta es la siguiente:
no deberias aplicar la instruccion bilinear para que te de los coeficientes de acuerdo a la frecuencia digital? por ejemplo en mi caso [C,D]=bilinear(A,B,10) ?

Muchas Gracias.


----------



## FueraDeLugar (Nov 24, 2008)

Un saludo a todos, he visto como se ha intentado dar solución algo que parece simple (medir el angulo de inclinación de un bicicleta) pero fijense en todas las cosas complejas que se han manejado hasta ahora (filtros notch, MATLAB, filtros butterworth). Quiero opinar que me parece que todas estas cosas son muy sofisticadas para la aplicación que se le dará, esto no es un equipo médico que requiera tal grado de exactitud, se nota el alto de nivel de conocimiento de las personas que han agregados posts a este hilo, yo talvez no poseea el mismo grado de conocimiento que ustedes pero si me gustaría dar mi aporte; algo que se me ocurrió mientras leía todo el thread... ¿Por que no copiar el sistema de los Joysticks de consolas antiguas? Digo, un potenciometro atado a un sistema de péndulo, se mide la variación del voltaje del divisor resitivo que forma el POT y con un PIC se la pasa por el ADC, tendrás valores suficientes y en digital de la lectura y en cuanto a la Histéresis puedes solventarlo con el PIC (un programita hecho por ti para desechar dos valores cercanos en magnitud por unidad de tiempo) el ADC de un PIC te dará menos latencia que los filtros con operacionales (tal y como lo sugieren posts atrás y les doy absoluta razón, recordemos el Teorema de Nyquist). Ahí dejo la idea y espero se ajuste a las necesidades de tu aplicación. Hasta luego.


----------



## crooin (Ene 26, 2012)

Hola, alguien puede responder las siguientes dudas, yo quiero implementar un filtro notch 50HZ y muestreo a 600Hz, vi que implementan un algoritmo con la siguiente ecuación:

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

-¿esta ecuación es solo para un notch, no? ¿como sería para un pasabajo y un pasaalto?
-¿de que orden es el filtro resultante?
-¿Como hago para calcular en matlab y como obengo los coeficientes?

muchas gracias


----------

