Ich habe einen 2-MHz-SPI-Bus, aber eine Sache, die mir aufgefallen ist, ist, dass einige meiner Signale oft "zittern". Ja, mein Trigger ist richtig eingerichtet, also glaube ich nicht, dass das Problem dort liegt.
Sie können sehen, was ich hier meine: (Dies ist mit aktiviertem Persistenzmodus). Dies ist die Uhr meines SPI-Busses.
Der SPI funktioniert einwandfrei. Ich habe Hunderte von Megabyte auf mehrere Boards übertragen und bisher kein Problem gesehen. Aber mich würde trotzdem interessieren, woran es hier liegen könnte. Sollte ich mir auch die Mühe machen, es zu reparieren, obwohl es funktioniert?
Die Messungen wurden direkt an der Quelle mit einer SEHR kleinen Masseklemme durchgeführt.
Dies ist ein vereinfachtes Schema meiner Schaltung. Natürlich verfügt die Platine über mehr SPI-Geräte, aber für die Zwecke dieser Frage ist dies korrekt, da auf der Platine außer dem uC und der SD-Karte noch nichts gelötet ist.
Der Master (AVR Mega 128) läuft über seinen internen RC-Oszillator - ich weiß nicht, ob dies relevant wäre, aber da sich die Signale zeitlich verschieben, ist es möglich, dass der Jitter des RC-Oszillators auch im SPI-Bus landet. Ich dachte nur, ich erwähne es. Mir ist auch aufgefallen, dass ich bei diesen Messungen den Regler in einer Endlosschleife laufen ließ. 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.
}
}
Das Zittern/Zittern kann auftreten, wenn das interne 72 Mal ausgeführt wird und dann beendet wird. Da die Ausführung der ersten drei Zeilen eine zusätzliche Zeit in Anspruch nimmt, kann es sein, dass jede 73. Wellenform aufgrund der zusätzlichen Verarbeitungszeit zu einer etwas anderen Zeit ankommt. Wenn ich wetten müsste, schätze ich, dass dies die Ursache meines Problems ist (wenn ich könnte, würde ich es sofort bestätigen, aber meine Boards arbeiten und die nächste Woche ist frei!) Aber ich hätte trotzdem gerne Meinungen/ Antworten von SE zu diesem Thema.
Aber wenn man bedenkt, dass das uC mit 8 MHz läuft, zittere ich nicht aufgrund von Software, weil es in Nanosekunden, sondern eher in Mikrosekunden wäre. Aber in der 2. Abbildung ist 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 auf die Schleife zurückzuführen ist und der Jitter im ersten Bild auf den RC-Oszillator zurückzuführen ist.
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 enthält.
Aber was kann den Jitter in Ihrem System verursachen?
Wie Sie spekulieren, wird dieser Jitter höchstwahrscheinlich direkt auf den Taktausgang des SPI-Peripheriegeräts übertragen, wenn die uC-Hauptuhr zittert.
Eine unzureichende Umgehung (zusätzlich zu den beiden 100-nF-Kondensatoren, die Sie gezeichnet haben, sollte auf Ihrer Platine eine zusätzliche Bulk-Umgehung vorhanden sein) könnte zu Jitter in der uC-Taktschaltung führen.
Netzteilrauschen, das von anderen Schaltungen auf Ihrer Platine eingeführt wird, könnte ebenfalls diesen Effekt haben (würde aber durch mehr Umgehung reduziert).
Der Jitter könnte in der Leistung des SPI-Peripheriegeräts des uC liegen. Es muss den SPI-Takt in Bezug auf den Systemtakt erzeugen. Wenn es einen einfachen Teiler verwendet (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 zu sehen ist (obwohl Systemtakt-Jitter direkt durchgehen würde). Wenn jedoch ein komplexeres Schema wie eine PLL verwendet wird, könnte diese Schaltung die SPI-Taktimpulsbreiten variieren, um mit der Systemuhr synchron zu bleiben, und Sie würden dies als Jitter sehen. Eine PLL-Schaltung könnte auch besonders empfindlich auf Stromversorgungsrauschen reagieren.
Wenn die Jitter-Amplitude auf einen kleinen Bruchteil der Taktperiode begrenzt ist, wie es hier 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). .
Das sieht für mich nach Signal-Jitter aus. Die Taktperiode variiert geringfügig, genug, dass die Persistenz des Oszilloskops die Kante „verschmiert“ aussehen lässt.
Ich weiß nicht, ob Ihr Rigol-Oszilloskop die Fähigkeit hat, Statistiken zu berechnen, wenn es misst. Wenn dies der Fall ist, können Sie Ihren Triggerpunkt so anpassen, dass Ihre Triggerflanke am linken Rand des Bildschirms erscheint, die Zeitbasis anpassen, um eine vollständige Periode anzuzeigen, und die Frequenzänderung über die Zeit messen, um ein Gefühl für die Änderung zu bekommen. (Jitter kann schlimmer 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 die Möglichkeit haben, eine andere Taktmethode (wie einen Kristall) zu verwenden, implementieren Sie sie und messen Sie den Jitter erneut.
Oszilloskopbilder können irreführend sein, und Sie müssen sich alle Parameter ansehen, um die Daten richtig zu interpretieren. Das erste Bild zeigt einen Jitter von 10 ns, und das wäre nicht so schön, wenn der Trigger nur links neben dem Bildschirm wäre. Aber unten rechts steht Trigger + 1,78 µs, also sind 10 ns eigentlich nur 0,5 % des Zeitintervalls. 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 machen würden, würde der Jitter von 0,5 % einen Jitter von 5 ns verursachen, was die Setup- und Hold-Zeiten nicht verletzen würde.
Wenn Sie Sicherheit brauchen, 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 dass die aufeinanderfolgenden Kanten gut getrennt bleiben.
Jitter ist eine Form von Rauschen. Wenn Sie die Zwischenankunftszeiten zwischen den Flanken von Impulsen als eine Art Signal betrachten, dann bedeutet dies, dass Ihr System ein rauschfreies Signal aufweist, wenn diese Flanken überhaupt nicht jittern!
Rechteckwellen werden häufig durch Schwellwertbildung auf einer kontinuierlicheren Welle erzeugt, mit einer Schaltung vom Typ Schmidt-Trigger, die ein Hystereseverhalten aufweist. Kristall- oder RC-Oszillatoren geben keine "nativen" Rechteckwellen aus.
Wenn diese Eingangswelle also ein gewisses Spannungsrauschen aufweist, führt dieses Rauschen zu leichten Verschiebungen in der Auslösung, da die Spannung manchmal früher und manchmal später einen der beiden Schwellenwerte erreicht.
Und so wird Rauschen der einen Art (Spannungsrauschen) zu Rauschen einer anderen Art (Timing-Rauschen).
Markierungen
Saad
Saad
Das Photon
Das Photon
Saad
Das Photon
Das Photon
Saad
Das Photon
Saad
Das Photon
dext0rb
Saad
stevenvh
gbarry