一部の信号が「震える」(ジッターがある)のはなぜですか?


9

2 MHzのSPIバスがありますが、信号の一部がしばしば「震え」ていることに気づきました。はい、トリガーは正しく設定されているので、問題はそこにあるとは思いません。

ここで私が何を意味するかを見ることができます(これは永続モードがオンの場合)。これは私のSPIバスのクロックです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

SPIは正常に動作します。私は複数のボードで数百メガバイトを転送しましたが、今のところ問題は見ていません。しかし、私はまだここで問題になる可能性があることを知りたいと思っています。また、機能しても問題を修正する必要がありますか?

測定は、非常に小さなグランドクリップを使用してソースで直接行われました。

これは私の回路の簡略化した回路図です。もちろん、ボードにはより多くのSPIデバイスがありますが、uCとSDカード以外にはまだボードにはんだ付けされていないため、この質問の目的にはこれは正確です。

ここに画像の説明を入力してください

マスター(AVR Mega 128)は、内蔵のRCオシレーターで実行されています。これが関連するかどうかはわかりませんが、信号が時間内にシフトするため、RCオシレーターのジッターもSPIバスで発生する可能性があります。私はそれについて言及すると思いました。また、これらの測定中にコントローラーを無限ループで実行していることにも気付きました。これがコードです:

while(1)
{
    setFirstBitOnDriver(driver); // this sends a 8-bit command on the SPI bus.
    GLCD_SetCursorAddress(40); // Change cursor position on the display.
    GLCD_WriteText("LED: "); 
    for(wire=0;wire<72;wire++)
    {
        itoa(wire+1,str,10);
        GLCD_WriteText(str);
        GLCD_SetCursorAddress(44);
        _delay_ms(10);
        shiftVectorOnDriver(driver); // another command on SPI. 8-bit wide.
    }
}

内部が72回実行されて終了すると、ジッター/震えが発生する可能性があります。最初の3行を実行するには追加の時間がかかるため、追加の処理時間のために、73番目ごとの波形がわずかに異なる時間に到着する可能性があります。私が賭けなければならなかった場合、私はこれが私の問題の原因であると推測しています(可能であれば、私はこの瞬間にそれを確認しますが、私のボードは仕事中で、翌週はオフです!)しかし、私はまだ意見を望んでいます/この問題に関するSEの回答。

しかし、uCが8 Mhzで実行されていることを考えると、ソフトウェアが原因でジッターが発生しないのは、ナノ秒単位ではなくマイクロ秒単位であるためです。しかし、2番目の図では、平らな線が見えています。これは、波形全体が時間とともにシフトし、画面に表示されない非常に短い1秒間発生します。これはループによるもので、最初の画像のジッタはRC発振器によるものだと思います。


2
あなたのトリガーは何ですか?
2012

@markragesトリガーは、CH1の立ち上がりエッジで1.48Vに設定されます。
Saad

2
推測の1つは、SPIクロック信号を生成するuC(私の仮定)が、いくつかのクロックサイクルを短縮または延長することによって機能するPLLを使用して、それ自体をリファレンスにロックしたままにしていることです。これらの短いクロックサイクルまたは長いクロックサイクルが発生すると、スコープトレースにジッターが発生します。これは、見ているエッジが、トリガーしたエッジよりも早く/遅くなるためです。
フォトン

1
または、SPIはメインループで生成されますが、メインループの実行を遅延させる割り込みが発生する場合があるため、ループの周期に違いが見られます。
フォトン

2
言葉は「ジッター」ですが、「震え」と言うかもしれません;-)
stevenvh 2012

回答:


6

スコープが示すのは、ジッターの典型的な例です。これは、信号に電圧ノイズがあるかどうかに関係なく、イベントのタイミングのエラー(立ち上がりエッジまたは立ち下がりエッジ)を意味します。

しかし、システムにジッタを引き起こす原因は何でしょうか?

  • ご想像のとおり、uCメインクロックにジッタがある場合、そのジッタはSPIペリフェラルからのクロック出力に直接転送される可能性が高いです。

    バイパスが不十分であると(描画した2つの100 nFコンデンサに加えて、ボード上に追加のバルクバイパスが必要です)、uCクロック回路でジッターが発生する可能性があります。

    ボード上の他の回路によって導入される電源ノイズもこの影響を与える可能性があります(ただし、バイパスを増やすことで低減できます)。

  • ジッタは、uCのSPIペリフェラルのパフォーマンスに固有のものである可能性があります。システムクロックを参照してSPIクロックを生成する必要があります。単純な分周器(8 MHzのシステムクロックと2 MHzのSPIクロックの場合は4対1)を使用する場合、追加のジッターはまったく発生しないと予想されます(システムクロックのジッターはそのまま通過します)。しかし、PLLなどのより複雑な方式を使用している場合、その回路はSPIクロックのパルス幅を変化させてシステムクロックと同期を保つ可能性があり、ジッタとして認識されます。また、PLL回路は特に電源ノイズに敏感です。

ここにあるように、ジッター振幅がクロック周期のごく一部に制限されている場合、このジッターがSPIバスでエラーを引き起こす理由はありません(SPIバスが期待どおりに動作しているように見えるという観察と一致) 。


100nFのバイパスキャップがあります。すべてのチップのすべてのvcc / gndペア。それでも提案しますか?もしそうなら、追加の100nFまたは1uFキャップ?
Saad

このジッターがボードで最悪のパフォーマンスの「問題」である場合、何も変更する必要はありません。システム内の他の回路の数とその機能に応じて、ボードの周囲に広がる1、10、または100 uFのバイパスキャップをいくつか追加するのが一般的な設計手法です。これらは特定のチップにローカライズされておらず、ボード全体に「バルク」バイパスを提供します。
フォトン

はい、私はこの目的のためにボード上に2つの47uタンタルを持っています。だから私はバイパス部分で大丈夫なはずです。
Saad 2012

2
SPIは完全に同期しています。ジッタ量が多ければSPIは失敗しません。
2012

@ markrages、OPの状況では、それは本当です。ただし、原則として、極端な量の周期ジッターは、たとえば、立ち上がりエッジと立ち下がりエッジの間隔を短くして、スレーブパーツのセットアップ時間に違反し、インターフェイスに障害が発生する可能性があります。ただし、これが発生するには、ジッターがクロック周期のほぼ半分に等しい必要があります。
フォトン

6

これは私にとって信号ジッタのように見えます。クロック周期は微妙に変化し、スコープの持続性によりエッジが「不鮮明」に見えます。

あなたのリゴールスコープが測定時に統計を計算する機能を持っているかどうかはわかりません。その場合は、トリガーエッジを調整してトリガーエッジを画面の左端に表示し、タイムベースを調整して完全な期間を表示し、時間の経過に伴う周波数変動を測定して変動の感触をつかむことができます。(トリガーのエッジが画面外にある場合よりもジッターが悪く見える場合があります。)

ジッタの原因を絞り込む場合は、RCオシレータから始めます。別のクロック方法(水晶など)を使用するオプションがあるかどうかを確認し、それを実装してジッターを再測定します。


仕事が始まったらすぐに外部発振器で試してみます!
Saad

6

スコープ画像は誤解を招く可能性があり、データを正しく解釈するにはすべてのパラメーターを調べる必要があります。最初の画像は10 nsのジッターを示していますが、トリガーが画面の左にある場合はそれほど良くありません。しかし、右下にはトリガー+ 1.78 µsとあり、10 nsは実際には時間間隔のわずか0.5%です。そのレベルのジッタは、RCオシレータが原因である可能性があります。水晶発振器を使用すると、ジッタが少なくとも1桁減少することを期待してください。

あなたは、SPIデータ転送でまだ問題に遭遇していないと言います。それは0.5%の相対性のおかげです。CLKパルスの1 µsの前にMOSIする場合、0.5%のジッターにより5 nsのジッターが発生しますが、これはセットアップおよびホールドタイムに違反しません。

再確認が必要な場合は、MOSIチャネルとCLKチャネルの両方で完全なビット時間を確認できるようにタイムベースを設定するだけです。ジッターがほとんど見えず、連続するエッジが十分に分離されたままであることがわかります。


スティーブン、トリガーの位置が重要な理由を説明できますか?どのようにして0.5%の数値を取得しましたか?
Saad

2
@Saad-トリガーポイントは時間= 0です。ディスプレイに表示される内容は1.78 us = 1780 ns後に発生します。また、10 nsジッタ(多かれ少なかれ)はその1780 nsの変動であるため、10 ns / 1780 ns = 0.56%です。立ち下がりエッジでズームインしているため、見た目は悪くなりますが、参照エッジ(トリガー)は数十メートル左になります。したがって、ズームアウトして完全なパルスを表示すると、ジッターははるかに小さく見えます。トリガーポイントがディスプレイのすぐ左、たとえば-100 nsにある場合、10 nsのジッターは10%になります。
stevenvh 2012

1

ジッタはノイズの一種です。パルスのエッジ間の到着時間を一種の信号と見なす場合、それらのエッジがまったくジッターしない場合、システムにノイズのない信号があることを意味します。

方形波は、ヒステリシス動作を行う一部のシュミットトリガータイプの回路で、より連続的な波のしきい値処理によって生成されることがよくあります。水晶発振器またはRC発振器は、「自然に」方形波を出力しません。

したがって、その入力波に電圧ノイズが含まれている場合、電圧に達すると、どちらか一方のしきい値に達することがあるため、そのノイズがトリガーのわずかなシフトに変換されます。

したがって、ある種類のノイズ(電圧ノイズ)が別の種類のノイズ(タイミングノイズ)に変わります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.