La versione breve:Algoritmo per determinare l'effettiva "differenza di fase" tra due segnali con frequenze diverse?
Nei algoritmo ho potuto usare per determinare la "differenza di fase" tra due segnali ad onda quadra con diverse frequenze, se l'unica informazione che ho è il momento in cui ogni fronte di salita si verifica?
La versione dettagliata:
Sto lavorando su un progetto di software embedded, e mi sono imbattuto in un problema interessante. Sto raccogliendo dati da due hall-effect speed sensors, ciascuno dei quali è rivolto a una delle due maglie ingranaggi, come mostrato nello schema seguente:
meshed gears and pulse signals http://img291.imageshack.us/img291/4905/gears.png
nota:
Come Jaime indicate, i segnali in questo diagramma avrebbe in realtà le stesse frequenze. Il vero hardware ha diverse fasi di cambio tra i due ingranaggi di destinazione, alcuni dei quali sono collegati da alberi invece di denti a maglie, quindi io do finiscono con due onde quadre che hanno frequenze diverse, e il rapporto tra loro è ancora un costante. Volevo semplificare il diagramma per arrivare alla carne della questione, ma sembra che l'abbia semplificato troppo!
/nota
L'uscita sensori di velocità di un segnale ad onda quadra la cui frequenza è direttamente proporzionale alla velocità di rotazione di ciascuna ruota dentata. I bordi ascendenti (e discendenti) dell'onda quadra si verificano quando i bordi iniziali (e finali) di un singolo ingranaggio passano accanto al sensore.
So quanti denti ci sono su ciascuna marcia e sulla base di queste informazioni sono in grado di misurare con precisione la velocità di rotazione di ogni ingranaggio in base alla frequenza dei segnali a onda quadra.
Per misurare le frequenze, ogni segnale del sensore di velocità è collegato a un pin del timer di acquisizione ad alta velocità sul controller incorporato. I timer di acquisizione rilevano automaticamente i fronti di salita del segnale a onda quadra, caricano un registro con un valore che rappresenta il momento in cui si è verificata la transizione e attivano un interrupt. I punti di cattura per ciascun segnale sono indicati in giallo sul diagramma. La routine di servizio simile a questa:
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;
}
Quello che vorrei fare:
Mi piacerebbe essere in grado di rilevare piccole differenze nella relativa tempistica di questi due un'onda quadra segnali. La chiamo "differenza di fase" per mancanza di un termine migliore. Se i due segnali avessero la stessa identica frequenza, ciò sarebbe semplice e phase difference sarebbe il termine corretto da utilizzare.
Ecco cosa voglio dire: Se dovessi registrare i due segnali per un lungo periodo di tempo, e poi rallentare artificialmente verso il basso (o "allungare") il segnale ad alta velocità (blu) di un fattore 16/9, avrebbe la stessa frequenza del segnale a bassa velocità (rosso), e i due segnali avrebbero una differenza di fase misurabile, cioè la differenza di tempo tra un interrupt di segnale rosso e un interrupt di segnale blu.Vorrei calcolare la stessa differenza di tempo (o qualcosa di equivalente) senza dover registrare i segnali per un lungo periodo di tempo. Le risorse sono limitate sul controller incorporato, quindi la memorizzazione di array di grandi dimensioni con tempi di transizione passati non è un'opzione.
Qualcuno si è imbattuto in questo prima? Il progetto attuale ha diverse configurazioni di ingranaggi e sensori, quindi sto cercando un algoritmo elegante che possa riutilizzare. Grazie in anticipo!
poiché i 2 ingranaggi sono interbloccati. Come suggeriresti che possano essere "fuori fase"? – Toad
stress sulle parti, usura sui denti degli ingranaggi, piccoli effetti del mondo reale. Questo è (ovviamente) un esempio semplificato. Il sistema reale può avere altri stadi di ingranaggi tra i due su cui sono montati i sensori. Tutte le piccole tolleranze tra i denti possono sommarsi a una buona dose di gioco. Hai ragione nel senso che gli ingranaggi non possono ottenere * sostanzialmente * "fuori fase" senza un grave guasto nel sistema fisico. Quello che sto cercando di misurare sono lievi variazioni rispetto alla norma. –
Se si "allunga" un segnale, è necessaria un'origine (t = 0). Questo è arbitrario, ma quella scelta determinerebbe la differenza di fase. Quindi, anche se dovessi creare una differenza di fase "vera" in questo modo, il suo valore sarebbe arbitrario a causa della tua scelta di t = 0 – MSalters