9

クイックバージョン:

持っている情報が各立ち上がりエッジが発生する時間だけである場合、異なる周波数を持つ 2 つの方形波信号間の「位相差」を決定するためにどのアルゴリズムを使用できますか?

詳細版:

私は組み込みソフトウェア プロジェクトに取り組んでおり、興味深い問題に遭遇しました。次の図に示すように、2 つのホール効果速度センサーからデータを収集しています。

歯車のかみ合いとパルス信号

注:ハイメが指摘したように、この図の信号は実際には同一の周波数を持っています
。実際のハードウェアには、2 つのターゲット ギア間にさらにいくつかのギアリング ステージがあり、その一部は噛み合った歯ではなくシャフトで接続されているため異なる周波数を持つ 2 つの方形波になり、それらの間の比率は依然として一定です。要点をつかむために図を単純化したかったのですが、単純化しすぎたようです。/ノート

速度センサーは、周波数が各ギアの回転速度に正比例する方形波信号を出力します。方形波の立ち上がり (および立ち下がり) エッジは、単一の歯車の歯のリーディング (およびトレーリング) エッジがセンサーを通過するときに発生します。

各歯車の歯の数を知っており、この情報に基づいて、方形波信号の周波数に基づいて各歯車の回転速度を正確に測定できます。

周波数を測定するために、組み込みコントローラーの高速キャプチャ タイマー ピンに各速度センサー信号を接続しました。キャプチャ タイマーは、方形波信号の立ち上がりエッジを自動的に検出し、遷移が発生した時間を表す値をレジスタにロードし、割り込みをトリガーします。各信号のキャプチャ ポイントは、図に黄色で示されています。割り込みサービス ルーチンは次のようになります。

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

私がしたいこと:

これら 2 つの方形波信号の相対的なタイミングの小さな違いを検出できるようにしたいと考えています。より適切な用語がないため、これを「位相差」と呼んでいます。2 つの信号の周波数がまったく同じである場合、これは簡単で、位相差という用語を使用するのが適切です。

ここに私が得ているものがあります: 2 つの信号を長期間にわたって記録し、高速 (青) 信号を 16/9 の係数で人為的に遅くする (または「伸ばす」) 場合、それは低速 (赤) 信号とまったく同じ周波数を持ち、2 つの信号には測定可能な位相差、つまり赤信号割り込みと青信号割り込みの間の時間差があります。長期間にわたって信号を記録することなく、この同じ時間差 (または同等のもの) を計算したいと思います。組み込みコントローラーのリソースは限られているため、過去の遷移時間の大規模な配列を格納することはできません。

誰もこれに遭遇したことがありますか?実際のプロジェクトには、そのようなギアとセンサーの配置がいくつかあるため、再利用できる洗練されたアルゴリズムを探しています。前もって感謝します!

4

6 に答える 6

2

全体の信号、つまり赤と青を足したときに得られる信号は、青の 16 倍、赤の信号の 9 倍の位相長を持っています。16 番目の青と 9 番目の赤のライジング フランクの間の時間差を測定できます。

あなたが測定したいのはギアの摩耗だと思います。均一な牽引力がない場合、この測定値はギアの公差によって影響を受ける (ノイズが発生する) 可能性があると思います。

于 2009-07-21T08:14:49.720 に答える
2

「位相」について話しているので、2 つの波形が互いに補強し合うときに発生する「うなり」を測定するのが妥当と思われます。

おそらく、次のようなものです。

void cog_phase_monitor2( int cog, int t )
{
    static int last_a, last_b, last_beat, last_beat_delta = 0;;
    int beat = 0;
    if( cog == 1 ) {
        if( t - last_b < 1 )
            beat = 1;
        last_a = t;
    }
    if( cog == 2 ) {
        if( t - last_a < 1 )
            beat = 1;
        last_b = t;
    }
    if( beat ) {
        printf("**** delta beat %d \n",t-last_beat);
        if( last_beat_delta ) {
            if( last_beat_delta != t-last_beat ) {
                printf("!!!Warning beat just changed !!!\n");
                last_beat_delta = 0;
            }
        } else {
            last_beat_delta = t-last_beat;
        }
        last_beat = t;
    }

}

これを 2 つの歯車のシミュレーションに差し込むと、1 つは 9 つの歯のうちの 1 つ、もう 1 つは 16 の歯のうちの 1 つで、どちらも毎秒 10 回転で回転します。

B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B at 102 msecs
B at 108 msecs
A at 110 msecs
B at 114 msecs
B at 120 msecs
A at 121 msecs
B at 126 msecs
A at 132 msecs
B at 132 msecs
**** delta beat 66
B at 138 msecs
A at 143 msecs
B at 144 msecs
B at 150 msecs
A at 154 msecs
B at 156 msecs
B at 162 msecs
A at 165 msecs
B at 168 msecs
B at 174 msecs
A at 176 msecs
B at 180 msecs
B at 186 msecs
A at 187 msecs
B at 192 msecs
A at 198 msecs
B at 198 msecs
**** delta beat 66

そして、歯車の 1 つに 1 ミリ秒の遅延を追加すると、次のようになります。

B at 6 msecs
A at 11 msecs
B at 12 msecs
B at 18 msecs
A at 22 msecs
B at 24 msecs
B at 30 msecs
A at 33 msecs
B at 36 msecs
B at 42 msecs
A at 44 msecs
B at 48 msecs
B at 54 msecs
A at 55 msecs
B at 60 msecs
A at 66 msecs
B at 66 msecs
**** delta beat 66
B at 72 msecs
A at 77 msecs
B at 78 msecs
B at 84 msecs
A at 88 msecs
B at 90 msecs
B at 96 msecs
A at 99 msecs
B delayed at 102 msecs
B at 103 msecs
B at 109 msecs
A at 110 msecs
B at 115 msecs
A at 121 msecs
B at 121 msecs
**** delta beat 55
!!!Warning beat just changed !!!
B at 127 msecs
A at 132 msecs
B at 133 msecs
B at 139 msecs
A at 143 msecs
B at 145 msecs
B at 151 msecs
A at 154 msecs
B at 157 msecs
B at 163 msecs
A at 165 msecs
B at 169 msecs
B at 175 msecs
A at 176 msecs
B at 181 msecs
A at 187 msecs
B at 187 msecs
**** delta beat 66
B at 193 msecs
A at 198 msecs
B at 199 msecs
B at 205 msecs

これは希望に満ちた始まりのようです:-)

于 2009-07-22T19:52:37.430 に答える
1

ハードウェアのセットアップを視覚化するのに問題があります。そして、あなたが検出しようとしている行動。シャフトの滑り?歯の装着?

いずれにせよ、アルゴリズムをテストするためのノイズなしで、おそらく誇張された結果を得ることができるように、状況のシミュレーションを作成します。

私がテストするアルゴリズムは、次のバリエーションになります。

Assign signal with lowest frequency to A

Time A’s rising edge. =>  Ta1

Time the next B rising edge . =>  Tb1

Calculate time Tb1 – Ta1    =>  dT1

Time next A’s rising edge. => Ta2

Time the next B rising edge. =>  Tb2

Calculate time Tb2 – Ta2    =>  dT2

Calculate second order difference  dT2 – dT1  => d2T1

Repeat precious steps to get another second order difference  => d2T2

If sign of d2T1 and d2T2 are different, 

repeat previous steps

else sign of d2T1 and d2T1 are same

    calculate third order difference  d2T2 – d2T2  =>  d3T1

Repeat previous steps to get another 3rd order difference  =>  d3T2

If d3T2 – d3T1 > max noise

    Raise alarm
于 2009-07-21T16:01:56.240 に答える
1

それよりもさらに簡単だと思います。

(大きな歯車の) 16*9 回のサンプリングごとに、車輪は開始した場所とまったく同じ場所にあります。

だからあなたがすることは次のとおりです:

  • 大きな歯車のサンプリングで任意の時点を選択します。小さな歯車もサンプリングするまでの時間を測定します。この値を覚えておいてください。

  • 大きな歯車の 16*9 サンプリングごとに (なぜこれは疑わしく聞こえるのですか?) 同じ測定を再度行い、それを基本値と比較します。タイミングがずれ始めると、問題が発生します。

R

于 2009-07-21T13:57:03.103 に答える
0

最善の方法は、すべての歯のペアのタイミングのXY図を作成することだと思います。T = 0として、各歯車の1つの歯を任意に選択します。

于 2009-07-21T08:41:58.057 に答える
0

ソフトウェアで 2 つのフェーズ ロック ループを実装します。歯車 A の a 回転が歯車 B の b 回転に対応するとします。a と bm の最小公倍数を計算します:= lcm(a,b)。ギア A (係数 m/a) で PLLa を位相ロックし、ギア B (係数 m/b) で PLLb を位相ロックします。次に、両方の PLL の周波数が同じである必要があります。したがって、位相差は簡単に検出できるはずです。コントローラーがあるので、2 つの位相ロック信号の畳み込みを計算するだけです。畳み込み関数の最大値は、位相差を示します。

于 2013-08-12T04:49:06.103 に答える