La versión rápida:Algoritmo para determinar la "diferencia de fase" efectiva entre dos señales con diferentes frecuencias?
Qué algoritmo podría utilizar para determinar la "diferencia de fase" entre dos señales de onda cuadrada con diferentes frecuencias, si la única información que tengo es el tiempo en el que cada flanco de subida ¿ocurre?
La versión detallada:
Estoy trabajando en un proyecto de software embebido, y me he encontrado con un problema interesante. Estoy recogiendo datos de dos hall-effect speed sensors, que están cada uno dirigido a una de las dos engranado engranajes, como se muestra en el siguiente diagrama:
meshed gears and pulse signals http://img291.imageshack.us/img291/4905/gears.png
nota:
Como Jaime señalado, las señales en este el diagrama en realidad tendría frecuencias idénticas. El hardware real tiene varias etapas de engranaje más entre los dos engranajes objetivo, algunos de los cuales están conectados por ejes en lugar de dientes engranados, por lo que I do terminan con dos ondas cuadradas que tienen diferentes frecuencias, y la relación entre ellas sigue siendo una constante. Quería simplificar el diagrama para llegar a la esencia del asunto, pero parece que lo simplifiqué demasiado.
/nota
La salida sensores de velocidad de una señal de onda cuadrada cuya frecuencia es directamente proporcional a la velocidad de rotación de cada engranaje. Los bordes ascendentes (y descendentes) de la onda cuadrada se producen cuando los bordes anteriores (y posteriores) de un solo diente del engranaje pasan por el sensor.
Sé cuántos dientes hay en cada engranaje, y de acuerdo con esta información, puedo medir con precisión la velocidad de rotación de cada engranaje según la frecuencia de las señales de onda cuadrada.
Para medir las frecuencias, tengo cada señal del sensor de velocidad conectada a un pin del temporizador de captura de alta velocidad en el controlador incrustado. Los temporizadores de captura detectan automáticamente los bordes ascendentes de la señal de onda cuadrada, cargan un registro con un valor que representa el momento en que se produjo la transición y desencadenan una interrupción. Los puntos de captura para cada señal se indican en amarillo en el diagrama. La rutina de servicio de interrupción es como la siguiente:
struct
{
long previousTime;
int frequency;
}
sensors[2];
void CaptureTimer_Interrupt(int channel, long transitionTime)
{
long timeDifference = transitionTime - sensors[channel].previousTime;
sensors[channel].frequency = CONVERSION_FACTOR/timeDifference;
sensors[channel].previousTime = transitionTime;
}
Lo que me gustaría hacer:
Me gustaría ser capaz de detectar pequeñas diferencias en el relativa momento de estos dos onda cuadrada señales. Yo llamo a esto la "diferencia de fase" por falta de un término mejor. Si las dos señales tuvieran exactamente la misma frecuencia, esto sería sencillo, y phase difference sería el término correcto para usar.
Esto es lo que quiero decir: si tuviera que grabar las dos señales durante un largo período de tiempo, y luego artificialmente reducir (o "estirar") la señal de alta velocidad (azul) por un factor de 16/9, tendría la misma frecuencia que la señal de menor velocidad (roja), y las dos señales tendrían alguna diferencia de fase medible, es decir, la diferencia de tiempo entre una interrupción de señal roja y una interrupción de señal azul.Me gustaría calcular esta misma diferencia de tiempo (o algo equivalente) sin tener que registrar las señales durante un largo período de tiempo. Los recursos están limitados en el controlador integrado, por lo que no es una opción guardar grandes matrices de tiempos de transición pasados.
¿Alguien ha topado con esto antes? El proyecto real tiene varios arreglos de engranajes y sensores, por lo que estoy buscando un algoritmo elegante que pueda reutilizar. ¡Gracias por adelantado!
ya que los 2 engranajes están interbloqueados. ¿Cómo sugerirías que pueden correr "fuera de fase"? – Toad
tensión en las piezas, desgaste en los dientes del engranaje, pequeños efectos en el mundo real. Esto es (por supuesto) un ejemplo simplificado. El sistema real puede tener otras etapas de engranaje entre los dos en los que están montados los sensores. Todas las pequeñas tolerancias entre juegos de dientes pueden sumar una buena cantidad de juego. Tiene razón en que los engranajes no pueden "sustancialmente" "desfasar" sin una avería importante en el sistema físico. Lo que intento medir son pequeñas variaciones de la norma. –
Si "estira" una señal, necesita un origen (t = 0). Eso es arbitrario, pero esa elección determinaría su diferencia de fase. Por lo tanto, incluso si creara una diferencia de fase "verdadera" de esa manera, su valor sería arbitrario debido a su elección de t = 0 – MSalters