9
votes

Algorithme pour déterminer la "différence de phase" efficace entre deux signaux avec des fréquences différentes?

La version rapide: strong>

Quel algorithme pourrais-je utiliser pour déterminer la "différence de phase" entre deux signaux d'onde carrée avec différents em> fréquences, si la seule information J'ai est le moment où chaque front montant p>

la version détaillée: strong> p>

Je travaille sur un projet de logiciel embarqué, et j'ai courir à travers un problème intéressant. Je collecte les données de deux capteurs de vitesse à effet Hall , qui sont chacun vise à l'un des deux engrenages maillés, comme illustré dans le schéma suivant: p>

« P>

Note: strong> Comme sur Jaime , les signaux dans ce diagramme seraient en fait des fréquences identiques. Le matériel réel comporte plusieurs étapes plus d'engrenage entre les deux engrenages cible, dont certains sont reliés par des arbres à la place des dents engrenées, de sorte que I do em> finir avec deux ondes carrées qui ont des fréquences différentes, et le rapport entre eux est toujours une constante. Je voulais simplifier le diagramme pour arriver à la viande de la matière, mais il semble que j'ai simplifié trop!
/ note strong> p>

La sortie de la vitesse, un signal d'onde carrée dont la fréquence est directement proportionnelle à la vitesse de rotation de chaque engrenage. Le montant (et la chute) des bords de l'onde carrée se produisent lorsque le premier (et arrière) bords d'une passe de dent d'engrenage unique par le capteur. P>

Je sais combien de dents sont sur chaque rapport, et sur la base cette information je suis capable de mesurer avec précision la vitesse de rotation de chaque roue en fonction de la fréquence des signaux d'onde carrée. p>

pour mesurer les fréquences, je chaque signal de capteur de vitesse connecté à une horloge de capture à grande vitesse la broche sur le contrôleur embarqué. Les temporisateurs de capture détectent automatiquement les fronts montants du signal d'onde carrée, de charger un registre avec une valeur qui représente le moment où la transition a eu lieu, et de déclencher une interruption. Les points de capture pour chaque signal sont indiqués en jaune sur le schéma. La routine de service d'interruption ressemble à quelque chose comme ceci: p>

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;
}


7 commentaires

puisque les 2 cogs sont verrouillés. Comment suggéreriez-vous qu'ils peuvent courir «hors de phase»?


Stress sur les pièces, porter sur les dents d'engrenages, petits effets du monde réel. Ceci est (bien sûr) un exemple simplifié. Le système réel peut avoir d'autres stades d'engrenage entre les deux sur lesquels les capteurs sont montés. Toutes les petites tolérances entre les jeux de dents peuvent s'ajouter à une quantité de jeu juste. Vous avez raison de dire que les engrenages ne peuvent pas obtenir sensiblement «hors de phase» sans une panne majeure dans le système physique. Ce que j'essaie de mesurer sont de légères variations de la norme.


Si vous "étirer" un signal, vous avez besoin d'une origine (t = 0). C'est arbitraire, mais ce choix déterminerait votre différence de phase. Par conséquent, même si vous créez une différence de phase «vraie» de cette façon, sa valeur serait arbitraire en raison de votre choix de T = 0


Hmmm ... vous vous rendez compte que les signaux provenant des flancs montantes des deux capteurs de votre diagramme auraient la même fréquence , n'est-ce pas?


@Jamie: Oups. Oui, oui ils le feraient. Bon oeil! C'est ce que je reçois trop la simplification du problème. Le matériel réel a plusieurs autres engrenages entre deux, dont certains sont reliés par des arbres, par opposition aux dents maillées, ce qui conduit à la différence de fréquence. Je vais éditer la question pour essayer de clarifier le problème. Merci d'avoir souligné mon erreur.


C'est important, car cela apporte une certaine complication à ce que je pense, c'est la bonne façon d'y aller, ce qui serait le long de la réponse du Reiner. Il y aura deux chiffres potentiellement volumineux, qui impliqueront des produits de multiples de dents les moins courants, qui vous donneront une fois de chiffres du premier capteur, et après combien de tiques du deuxième capteur, vous fermez efficacement un cycle, C'est-à-dire que les deux mêmes dents sont engagées à la même position à chaque équipement.


@Jaime: Je sais que c'était il y a longtemps, mais je suis désolé d'avoir orthographié votre nom faux.


6 Réponses :


2
votes

Le signal global, c'est-à-dire le signal que vous obtenez lorsque vous ajoutez le rouge et le bleu, a une longueur de phase de 16 fois le signal bleu et 9 fois le signal rouge. Vous pourriez mesurer la différence de temps entre tous les 16èmes bleu et chaque 9ème flanc rouge rouge.

Je suppose que ce que vous voulez mesurer est l'usure des engrenages. Je pense que cette mesure pourrait être influencée (introduction du bruit) par la tolérance des engrenages, s'il n'y a pas de traction uniforme.


0 commentaires

0
votes

Je pense que la meilleure chose à faire serait de créer un diagramme X-Y de tous les horaires de paire de dents . Vous choisiriez arbitrairement une dent sur chaque cog comme t = 0 ..


1 commentaires

Cela semble prometteur, ferait une jolie image si rien d'autre :)



1
votes

Je pense que c'est encore plus simple que ça.

toutes les échantillons de 16 * 9 (du grand cog) Les roues sont exactes dans le même endroit qu'ils ont commencé.

Alors, ce que vous faites est ce que vous faites:

  • Choisissez n'importe quel point à temps avec un échantillonnage sur le gros cog. Mesurez la quantité de temps avant de goûter à la petite cog aussi. Rappelez-vous cette valeur.

  • Tous les échantillons de 16 * 9 du gros cog (pourquoi ce son est-il douteux?) Faites-le à nouveau la même mesure et comparez-la à votre valeur de base. Lorsque le timing commence à changer, vous avez un problème.

    r


1 commentaires

Avec les réserves de mes commentaires à la question de l'OP, je pense qu'il ne suffit pas de faire une mesure chaque cycle: si l'un des engrenages impliqués perd une dent qui ne fonctionne pas au moment de la mesure, vous ne remarqueriez jamais. Je pense que vous avez besoin d'une comparaison entre les signaux entiers , qui n'est pas modifié par les échecs locaux, c'est-à-dire que vous ne voulez pas que les variations de vitesse instantanées de l'arbre d'entraînement vous donnent une fausse alarme. J'essayerais avec quelque chose dans le sens de la corrélation croisée entre l'entrée et la sortie, qui est probablement irréalisable avec les contraintes de stockage ...



1
votes

J'ai eu quelques problèmes de visualisation de votre configuration matérielle. Et le comportement que vous essayez de détecter. Un arbre glissant? Les dents portant?

Dans tous les cas, j'écrirais une simulation de la situation afin que je puisse obtenir certains, peut-être exagéré, des résultats sans bruit pour tester des algorithmes contre.

Les algorithmes que je voudrais tester être des variations des éléments suivants: xxx


1 commentaires

Cela mérite un uvot, mais j'ai frappé la limite pour aujourd'hui. Je vais uppoter dans 5 heures environ.



2
votes

Puisque nous parlons de "phase", il semble que cela semble raisonnable de mesurer le "battement" qui se produit lorsque les deux formes d'onde se renforcent mutuellement.

Quelque chose comme ça, peut-être: xxx < / Pré>

Maintenant si nous branchons cela dans une simulation de deux cogs, l'une des 9 dents et l'une des 16 dents, toutes deux tournant à 10 revents par seconde par seconde xxx

Et maintenant, si nous ajoutons un retard de 1 msec à l'un des cogs: xxx

Cela ressemble à un début optimiste: -)


0 commentaires

0
votes

Je voudrais implémenter deux boucles verrouillées par deux phases dans des logiciels. Supposons que les révolutions de l'engrenage A correspondent à B révolutions de Gear B. Compute le multiple le moins courant de A et B m: = LCM (A, B). Verrouillage de phase Plla avec engrenage A (avec un facteur de m / a) et PLLB avec un engrenage B (avec un facteur de m / b). Ensuite, les deux PLLS devraient avoir la même fréquence. Par conséquent, les différences de phase doivent être faciles à détecter. Depuis que vous avez un contrôleur, vous consciez simplement la convolution des signaux verrouillés à deux phases. Le maximum de la fonction de convolution vous indique ensuite la différence de phase.


0 commentaires