Ich habe einen 2-MHz-SPI-Bus, aber eines ist mir aufgefallen: Einige meiner Signale zittern oft. Ja, mein Trigger ist richtig eingerichtet, daher glaube ich nicht, dass das Problem dort liegt.
Sie können hier sehen, was ich meine: (Dies ist mit aktiviertem Persistenzmodus). Dies ist die Uhr meines SPI-Busses.
Das SPI funktioniert einwandfrei. Ich habe Hunderte von Megabyte auf mehrere Boards übertragen und bisher kein Problem festgestellt. Aber ich bin immer noch daran interessiert zu wissen, was hier das Problem sein könnte. Sollte ich mir auch die Mühe machen, das Problem zu beheben, auch wenn es funktioniert?
Die Messungen wurden direkt an der Quelle mit einem SEHR kleinen Bodenclip durchgeführt.
Dies ist ein vereinfachtes Schema meiner Schaltung. Natürlich verfügt die Karte über mehr SPI-Geräte, aber für die Zwecke dieser Frage ist dies korrekt, da auf der Karte noch nichts außer der uC und der SD-Karte angelötet ist.
Der Master (AVR Mega 128) läuft von seinem internen RC-Oszillator ab - ich weiß nicht, ob dies relevant wäre, aber da sich die Signale mit der Zeit verschieben, ist es möglich, dass der Jitter des RC-Oszillators auch im SPI-Bus landet. Ich dachte nur, ich würde es erwähnen. Mir ist auch aufgefallen, dass ich während dieser Messungen den Controller in einer Endlosschleife betrieben habe. Hier ist der Code:
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.
}
}
Der Jitter / Shiver kann auftreten, wenn der interne 72-mal ausgeführt wird und dann beendet wird. Da die Ausführung der ersten drei Zeilen eine zusätzliche Zeit benötigt, kann es sein, dass jede 73. Wellenform aufgrund der zusätzlichen Verarbeitungszeit zu einer etwas anderen Zeit ankommt. Wenn ich wetten müsste, denke ich, dass dies die Ursache für mein Problem ist (wenn ich könnte, würde ich es sofort bestätigen, aber meine Boards arbeiten und die nächste Woche ist aus!) Aber ich hätte immer noch gerne Meinungen / Antworten von SE zu diesem Thema.
Aber wenn man bedenkt, dass die uC mit 8 MHz läuft, zittere ich nicht aufgrund von Software, weil in Nanosekunden, sondern in Mikrosekunden. In der 2. Abbildung ist jedoch eine flache Linie sichtbar. Dies geschieht für eine sehr kurze Sekunde, in der sich die gesamten Wellenformen zeitlich verschieben und auf dem Bildschirm unsichtbar sind. Ich vermute, dass dies an der Schleife liegt und der Jitter im ersten Bild am RC-Oszillator.
quelle
Antworten:
Was Ihr Oszilloskop zeigt, ist ein klassisches Beispiel für Jitter , was einen Fehler im Timing eines Ereignisses (steigende oder fallende Flanke) bedeutet, unabhängig davon, ob das Signal Spannungsrauschen aufweist.
Aber was kann den Jitter in Ihrem System verursachen?
Wenn der uC-Haupttakt nervös ist, wird dieser Jitter höchstwahrscheinlich direkt auf den vom SPI-Peripheriegerät ausgegebenen Takt übertragen.
Eine unzureichende Umgehung (zusätzlich zu den beiden von Ihnen gezeichneten 100-nF-Kondensatoren sollte auf Ihrer Platine eine zusätzliche Massenumgehung vorhanden sein) kann zu Jitter im uC-Taktkreis führen.
Stromversorgungsgeräusche, die von anderen Schaltkreisen auf Ihrer Platine verursacht werden, können ebenfalls diesen Effekt haben (würden jedoch durch mehr Umgehen verringert).
Der Jitter könnte der Leistung des SPI-Peripheriegeräts des uC inhärent sein. Es muss die SPI-Uhr in Bezug auf die Systemuhr generieren. Wenn ein einfacher Teiler verwendet wird (4 zu 1 im Fall eines 8-MHz-Systemtakts und eines 2-MHz-SPI-Takts), würden Sie nicht erwarten, dass überhaupt viel zusätzlicher Jitter auftritt (obwohl der Systemtakt-Jitter direkt durchlaufen würde). Wenn jedoch ein komplexeres Schema wie eine PLL verwendet wird, kann diese Schaltung die SPI-Taktimpulsbreiten variieren, um mit dem Systemtakt synchron zu bleiben, und Sie würden dies als Jitter betrachten. Eine PLL-Schaltung kann auch besonders empfindlich gegenüber Stromversorgungsrauschen sein.
Wenn die Jitteramplitude auf einen kleinen Bruchteil der Taktperiode begrenzt ist, wie es hier zu sein scheint, gibt es keinen Grund, warum dieser Jitter Fehler auf dem SPI-Bus verursacht (in Übereinstimmung mit Ihrer Beobachtung, dass der SPI-Bus wie erwartet zu funktionieren scheint). .
quelle
Das sieht für mich nach Signaljitter aus. Die Taktperiode variiert geringfügig, so dass die Kante durch die Beständigkeit des Oszilloskops "verschmiert" aussieht.
Ich weiß nicht, ob Ihr Rigol-Bereich in der Lage ist, Statistiken zu berechnen, wenn er misst. In diesem Fall können Sie Ihren Triggerpunkt so einstellen, dass Ihre Triggerkante am linken Bildschirmrand angezeigt wird. Passen Sie die Zeitbasis an, um einen vollständigen Zeitraum anzuzeigen, und messen Sie die Frequenzänderung über die Zeit, um ein Gefühl für die Änderung zu bekommen. (Jitter kann schlechter aussehen als wenn die Triggerflanke außerhalb des Bildschirms liegt.)
Wenn Sie die Jitterquellen eingrenzen möchten, würde ich mit dem RC-Oszillator beginnen. Prüfen Sie, ob Sie eine andere Taktmethode (wie einen Kristall) verwenden können, implementieren Sie diese und messen Sie den Jitter erneut.
quelle
Bereichsbilder können irreführend sein, und Sie müssen alle Parameter überprüfen, um die Daten korrekt zu interpretieren. Das erste Bild zeigt einen 10-ns-Jitter, und das wäre nicht so schön, wenn der Auslöser nur links vom Bildschirm wäre. Aber unten rechts steht Trigger + 1,78 µs, so dass 10 ns tatsächlich nur 0,5% des Zeitintervalls sind. Dieser Jitterpegel kann durchaus auf den RC-Oszillator zurückzuführen sein. Erwarten Sie, dass der Jitter mit einem Quarzoszillator um mindestens eine Größenordnung reduziert wird.
Sie sagen, Sie haben noch keine Probleme bei der SPI-Datenübertragung festgestellt. Das liegt an der Relativität der 0,5%. Wenn Sie 1 µs vor dem CLK-Impuls MOSI verwenden würden, würde der Jitter von 0,5% einen Jitter von 5 ns verursachen. Dies würde die Setup- und Haltezeiten nicht verletzen.
Wenn Sie eine Bestätigung benötigen, stellen Sie einfach die Zeitbasis so ein, dass Sie eine vollständige Bitzeit sehen können, sowohl den MOSI- als auch den CLK-Kanal. Sie werden feststellen, dass der Jitter kaum sichtbar ist und die aufeinanderfolgenden Kanten gut voneinander getrennt bleiben.
quelle
Jitter ist eine Form von Lärm. Wenn Sie die Zwischenankunftszeiten zwischen den Impulsflanken als eine Art Signal betrachten, bedeutet dies, dass Ihr System ein rauschfreies Signal aufweist, wenn diese Flanken überhaupt nicht zittern!
Rechteckwellen werden häufig durch Schwellenwertbildung auf einer kontinuierlicheren Welle mit einer Schmidt-Trigger-Schaltung erzeugt, die ein Hystereseverhalten aufweist. Kristall- oder RC-Oszillatoren erzeugen keine "nativen" Rechteckwellen.
Wenn diese Eingangswelle ein Spannungsrauschen aufweist, führt dieses Rauschen zu geringfügigen Verschiebungen der Triggerung, da die Spannung manchmal früher und manchmal später einen der beiden Schwellenwerte erreicht.
Und so wird Rauschen einer Art (Spannungsrauschen) zu Rauschen einer anderen Art (Zeitrauschen).
quelle