Inhaltsverzeichnis:

Dual-Trace-Oszilloskop - Gunook
Dual-Trace-Oszilloskop - Gunook

Video: Dual-Trace-Oszilloskop - Gunook

Video: Dual-Trace-Oszilloskop - Gunook
Video: Dual trace oscilloscope | Electrical Instruments ( EIM ) | Lec - 34 2024, Juli
Anonim
Oszilloskop mit zwei Spuren
Oszilloskop mit zwei Spuren

Als ich mein vorheriges Mini-Oszilloskop baute, wollte ich sehen, wie gut ich meinen kleinsten ARM-Mikrocontroller zu einem STM32F030 (F030) machen kann, und er hat gute Arbeit geleistet.

In einem der Kommentare wurde vorgeschlagen, dass eine "Blue Pill" mit einem STM32F103 (F103) besser, kleiner als das Entwicklungsboard mit dem F030 und möglicherweise sogar billiger sein könnte. Aber für das Mini-Oszilloskop habe ich nicht das Entwicklungsboard verwendet sondern das F030 auf einem noch kleineren SMD-DIP-Board, da wäre eine Blue Pill sicher nicht kleiner und ich bezweifle, dass sie auch billiger wäre.

Code ist jetzt auf Gitlab verfügbar:

gitlab.com/WilkoL/dual-trace-oszilloskop

Lieferungen

Stückliste: - Kunststoffbox - Perfboard (doppelseitiges Prototypenboard 8x12cm) - Blue Pill - ST7735s TFT-Display - Lithium-Ionen-Akku - HT7333 3.3V Low-Dropout-Regler - MCP6L92 Dual Opamp - TSSOP8 zu DIP8 Board - 12 MHz Quarz (nicht erforderlich.)) - Drehgeber plus Drehknopf (2x) - Netzschalter - Bananenklemmen (4x) - Lithium-Ionen-Ladeplatine - mehrere Widerstände und Kondensatoren - Nylon-Abstandshalter, Muttern und Schrauben

Werkzeuge:

- Lötstation - Löten 0,7mm - etwas Draht - Seitenschneider - Brille und Lupe - Bohrmaschine - Multimeter - Oszilloskop - STLink-V2

Software:

- STM32IDE - STM32CubeMX - STLink Utility - LowLayer-Bibliothek - angepasste Bibliothek für ST7735s - Notepad++ - Kicad

Schritt 1: Interleave oder Simultaneous Mode

Interleave- oder Simultaneous-Modus
Interleave- oder Simultaneous-Modus
Interleave- oder Simultaneous-Modus
Interleave- oder Simultaneous-Modus

Blaue Pille

Aber die Idee war da, und ich wusste, dass der F103 zwei ADCs hat! Was wäre, wenn ich diese beiden ADCs zusammen im "Interleave" -Modus verwende, was ich zuvor mit dem STM32F407 (F407) getan habe. Die Abtastgeschwindigkeit würde sich verdoppeln. Kombinieren Sie das mit einem schnelleren Mikrocontroller und es wäre ein großartiger Nachfolger des Mini-Oszilloskops.

Interleave-Modus Seltsamerweise sind die ADCs des F103 weniger fortschrittlich als der des F030 (und des F407), Sie können die Auflösung nicht auswählen. Wichtiger ist, dass Sie auch das Timing zwischen den beiden ADCs nicht ändern können. Wenn Sie nun den Interleave-Modus verwenden, möchten Sie normalerweise die Abtastung so schnell wie möglich mit der kürzesten Zeit zwischen den Abtastungen durchführen, aber bei einem Oszilloskop ist es notwendig, das Timing zu ändern. Vielleicht ist es noch machbar, ich bin kein professioneller Oszilloskop-Designer, aber ich habe den Plan, den Interleave-Modus zu verwenden, fallengelassen.

Simultanmodus

Da zwei ADCs jedoch viel mehr Optionen bieten, können die beiden ADCs auch in den "regulär-simultanen" Modus versetzt werden. Wie wäre es mit einem Dual-Trace-Oszilloskop?

Nachdem ich beschlossen hatte, ein Dual-Trace-Oszilloskop herzustellen, wollte ich auch eine variable Eingangsempfindlichkeit haben, eine Option, die ich beim Mini-Oszilloskop nicht hatte. Das bedeutet ein Dämpfungsglied (und Verstärker) an den Eingängen. Und vielleicht wollte ich noch mehr? Also habe ich eine kleine Liste mit "nice-to-haves" erstellt.

WUNSCHZETTEL

zwei Kanäle

variable Empfindlichkeit auf beiden Kanälen

Triggerung auf beiden Kanälen

variabler Triggerpegel auf beiden Kanälen

variabler Offset

Einzelbatterieleistung

passen in dieselbe Box wie das Mini-Oszilloskop

Schritt 2: Prototyping

Prototyp entwickeln
Prototyp entwickeln
Prototyp entwickeln
Prototyp entwickeln

Wie üblich habe ich diese Projekte auf einem Steckbrett begonnen. (Siehe Bild) Und bevor ich alles auf das Perfboard löte, versuche ich herauszufinden, ob und wie es in die gewählte Projektbox passt. Es passt, aber nur knapp. Einige Teile sind unter dem Bildschirm versteckt, andere unter der Blauen Pille. Und wieder, wie bei den meisten meiner Projekte ist dies ein einmaliges Projekt und ich werde keine Leiterplatte dafür entwerfen.

Schritt 3: Dämpfungsglieder

Dämpfungsglieder
Dämpfungsglieder

In normalen Oszilloskopen sind die Eingangsdämpfungsglieder Schaltungen, die Dämpfung und Verstärkung durch Ein- und Ausschalten von Widerständen mit Kleinsignalrelais ändern. Obwohl ich einige dieser Relais habe, weiß ich, dass sie nicht unter 4 Volt schalten, das heißt, sie funktionieren nur mit einem voll geladenen Lithium-Ionen-Akku (4,2 V). Also brauchte ich eine andere Möglichkeit, diese Widerstände zu schalten. Natürlich könnte ich auch nur mechanische Schalter einbauen, aber das würde sicher nicht mehr in die Projektbox passen, wenn ich im Hinterkopf hatte, vielleicht könnte ich es nochmal mit einem besseren digitalen Potentiometer versuchen (der, den ich habe, ist viel zu laut).

Dann dachte ich an "analoge Schalter", mit denen ich mir selbst ein digitales Potentiometer bauen kann. In meiner Teilesammlung fand ich den CD4066 mit vier analogen Schaltern. Die Idee ist, den Rückkopplungswiderstand eines Operationsverstärkers variabel zu machen, indem Widerstände parallel zum Rückkopplungswiderstand ein- und ausgeschaltet werden.

Es funktioniert sehr gut, aber mit nur 4 Schaltern im 4066 und 2 Kanälen war es nicht möglich, mehr als drei Empfindlichkeitsstufen einzustellen. Ich habe 500 mV, 1 V und 2 V pro Division gewählt, da dies die Spannungspegel sind, die ich am häufigsten verwende. Der Bildschirm ist in 6 Bereiche unterteilt, so dass die Bereiche -1,5V bis +1,5V, -3V bis +3V und -6V bis 6V möglich sind.

Mit dem "virtual-ground" können Sie diese Bereiche nach oben und unten verschieben, so dass sogar 0V bis +12V möglich sind.

Schritt 4: Virtueller Boden

Virtueller Boden
Virtueller Boden
Virtueller Boden
Virtueller Boden

Da das Oszilloskop eine einzelne Stromschiene (3,3 V) verwendet, benötigen die Operationsverstärker eine virtuelle Masse, sonst funktionieren sie nicht. Dieser virtuelle Massepegel wird mit PWM auf einem Ausgangskanal von TIM4 erzeugt, dessen Tastverhältnis von wenigen Prozent auf fast hundert Prozent ändert. Ein Tiefpassfilter mit einem 1k-Widerstand und einem 10uF-Kondensator wandelt das in eine Spannung von (fast) 0V bis (fast) 3,3V um. Die Frequenz der Rechteckwelle liegt knapp unter 100 kHz, daher reicht der einfache Tiefpassfilter aus.

Erst spät beim Bau dieses Oszilloskops wurde mir klar, dass man nicht zwei separate Offsets für die Kanäle haben kann. Dies liegt daran, dass bei einer einzigen Stromversorgung der Eingangs-Massepegel vom realen Massepegel der Operationsverstärker getrennt sein muss. Beide Kanäle bewegen sich also gleich, wenn Sie die GND-Einstellung ändern.

Schritt 5: Drehgeber und Debugging

Drehgeber und Debugging
Drehgeber und Debugging
Drehgeber und Debugging
Drehgeber und Debugging

Beim Mini-Oszilloskop habe ich nur einen Drehgeber für alle Funktionen verwendet. Das würde die Verwendung eines Dual-Oszilloskops sehr schwierig machen, also brauche ich hier zwei. Ein Encoder für die Abschwächer und virtuellen Massepegel und der andere Encoder für die Zeitbasis und Triggerung. Leider sind diese Drehgeber, genau wie in meinem anderen Projekt, sehr "geräuschvoll". Sie sind so schlecht, dass sie mit Timern im "Encoder-Modus", der Standard-Lesemethode, einfach nicht funktionieren würden. Ich musste einen Entprellmechanismus mit dem Timer TIM2 machen, der die Encoder alle 100us überprüft. Dieser Timer wiederum wird (nur) bei Aktivität an den Encodern gestartet, dies wird mit der EXTI-Funktionalität an den Eingangsports überprüft. Jetzt funktionieren die Encoder gut.

Und wie Sie sehen, kann ein Display auch sehr praktisch sein, um Debugging-Informationen anzuzeigen.

Schritt 6: Anzeige und Zeitbasis

Anzeige und Zeitbasis
Anzeige und Zeitbasis

Das Display hat eine Auflösung von 160 x 128 Pixel, also werden 160 Samples für einen Screenfull benötigt, ich habe es geschafft, die ADCs auf 1,6 Millionen Samples pro Sekunde zu beschleunigen und das mit dem stark übertakteten Mikrocontroller (dazu später mehr) eine minimale Zeitbasis von 20us pro Division (100us pro Bildschirm). Somit füllt eine Wellenform von 10kHz den gesamten Bildschirm aus.

Das ist nur doppelt so schnell wie das Mini-Oszilloskop, das ich zuvor gebaut habe. Naja, jetzt ist es mit zwei Kanälen:-).

Wie gesagt, das Display ist 160 Pixel breit, sodass nur 160 Werte pro Bildschirm benötigt werden. Aber alle Puffer enthalten tatsächlich 320 Samples. Der DMA speichert also 320 Werte, bevor er eine Unterbrechung der Übertragung (TC) auslöst. Dies liegt daran, dass die Triggerung in Software erfolgt. Die Abtastung beginnt zu einem zufälligen Zeitpunkt, daher ist es sehr unwahrscheinlich, dass der erste Wert im Puffer die Stelle ist, an der sich der Triggerpunkt befinden sollte.

Daher wird der Triggerpunkt durch Lesen des trace_x_buffer gefunden, wenn der Wert auf dem gewünschten Triggerwert liegt und wenn der vorherige Wert knapp darunter liegt, wird der Triggerpunkt gefunden. Das funktioniert ganz gut, aber Sie benötigen einen größeren Puffer, als die tatsächliche Displaygröße ist.

Dies ist auch der Grund dafür, dass die Aktualisierungsrate bei den niedrigeren Zeitbasiseinstellungen langsamer ist, als Sie vielleicht erwarten. Wenn Sie die 200ms/div-Einstellung verwenden, ist ein Bildschirm voller Daten 1 Sekunde lang, aber da die doppelte Menge an Konvertierungen durchgeführt wird, dauert dies 2 Sekunden. Bei den schnelleren Zeitbasiseinstellungen werden Sie es nicht so sehr bemerken.

TIM3 wird verwendet, um die Zeitbasis zu generieren. Er triggert die ADCs mit der Geschwindigkeit, die von der ausgewählten Zeitbasiseinstellung erforderlich ist. Sein Takt von TIM3 beträgt 120MHz (siehe OVERCLOCKING), die maximale Anzahl, bis zu der er zählt (ARR), bestimmt, wie er überläuft oder in der Sprache ST aktualisiert. Über TRGO triggern diese Update-Impulse die ADCs. Die niedrigste erzeugte Frequenz beträgt 160 Hz, die höchste 1,6 MHz.

Schritt 7: ADCs und DMA

ADCs und DMA
ADCs und DMA

Die beiden ADCs wandeln die Spannung an ihren Eingängen gleichzeitig um, sie speichern diese beiden 12-Bit-Werte in einer einzigen 32-Bit-Variablen. Der DMA muss also nur eine Variable pro (doppelter) Konvertierung übertragen.

Um diese Werte zu verwenden, müssen sie daher in die beiden Werte aufgeteilt werden, damit sie zur Anzeige der beiden Kurven verwendet werden können. Wie gesagt, ADCs im F103 können nicht auf andere Auflösungen als 12 Bit eingestellt werden. Sie befinden sich immer im 12-Bit-Modus, sodass Umwandlungen immer die gleiche Anzahl von Taktimpulsen benötigen. Mit der Übertaktung der ADCs sind dennoch 1,6 MSamples pro Sekunde möglich (siehe Extra: Übertakten).

Die Referenz der ADCs ist Vdd, die 3.3V-Schiene. Um das in bequemere Werte (pro Division) umzuwandeln, habe ich die Werte der Dämpfungsglieder berechnet, da ich nicht die genauen Widerstandswerte habe, die aus diesen Berechnungen stammen, werden einige Korrekturen in der Software vorgenommen.

In diesem Projekt verwende ich DMA im "regulären Modus". In diesem Modus stoppt der DMA die Übertragung von Daten (von den ADCs zum Speicher), wenn die Anzahl der Wörter (oder Halbwörter oder Bytes) alle übertragen sind. Im anderen möglichen Modus, dem "zirkularen Modus", setzt sich der DMA selbst zurück und setzt die Datenübertragung ununterbrochen fort. Das hat mit dem F103 nicht funktioniert, er ist so schnell, dass er die Daten im adc_buffer überschreibt, bevor der Rest des Programms sie lesen konnte. Der Ablauf ist nun also wie folgt:

- DMA auf die Anzahl der zu übertragenden Daten einstellen und DMA aktivieren

- die Triggerung der ADCs starten, diese werden nach jeder (Doppel-)Konvertierung DMA-Transfers anfordern

- Nachdem die eingestellte Anzahl von Konvertierungen übertragen wurde, stoppt DMA

- sofort auch die Triggerung der ADCs stoppen

- alle erforderlichen Manipulationen an den Daten im Speicher vornehmen

- Spuren auf dem Bildschirm anzeigen

- Starten Sie den Vorgang erneut

Schritt 8: Benutzeroberfläche

Benutzeroberfläche
Benutzeroberfläche

Ein 160 x 128 Pixel Bildschirm ist nicht sehr groß und ich möchte so viel wie möglich davon nutzen. Es ist also kein Teil davon für die Stromeinstellungen reserviert. In den letzten Zeilen werden vertikale Empfindlichkeit, Zeitbasis, Triggerpegel und Triggerkanal angezeigt, aber wenn die Signale groß genug sind, erscheinen sie im gleichen Bereich. Die aktive Option wird gelb dargestellt, der Rest wird weiß dargestellt.

Schritt 9: Aufbau und mögliche Verbesserungen

Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen
Gebäude und mögliche Verbesserungen

Ich bin ziemlich glücklich über dieses Projekt. Es funktioniert gut und macht den Job, aber es könnte besser sein.

Die Projektbox ist zu klein, um alles bequem unterzubringen, dies führt dazu, dass Komponenten unter die Blue Pill gelegt werden müssen. Um dies zu ermöglichen, konnte die Blue Pill nicht direkt auf das "Mainboard" gelötet werden. Und weil das alles zu hoch wurde, musste ich viele Teile von der Blue Pill entfernen, wie zum Beispiel die Jumper für die Auswahl von BOOT0 und BOOT1 (was ich sowieso nie benutze) und ich musste sogar den Kristall von oben nach unten verschieben die Platine.

Ich habe mir das Leben erschwert, indem ich Bananenstecker anstelle von BNC- oder SMA-Steckern verwendet habe, das bedeutete, dass ein großer Teil des Perfboards eine "No-Go-Area" war, um mir das klar zu machen, habe ich Kaptonband darüber geklebt, um mich zu verhindern davon, Teile darauf zu legen.

Ein weiteres Problem bei der Unterbringung in einer so kleinen Projektbox besteht darin, dass die analogen und digitalen Schaltkreise sehr nahe beieinander liegen. Sie können sehen, dass auf beiden Spuren ziemlich viel Rauschen sichtbar ist. Das hatte ich nicht mal auf dem Steckbrett! Indem die Stromleitungen für analoge und digitale Schaltungen so weit wie möglich auseinander verlegt wurden, wurde eine kleine Verbesserung erzielt, die für meinen Geschmack jedoch nicht ausreichend war. Alle Widerstandswerte in den analogen Schaltungen noch weiter zu reduzieren als ich (der Eingangswiderstand beträgt 100kOhm statt 1MOhm) hat nicht geholfen. Ich vermute, dass das Triggern auf der schnellsten Zeitbasiseinstellung (20us/div), was nicht großartig ist, auch mit weniger Rauschen auf den Signalen verbessert wird.

Wenn Sie dieses Design auf einer "echten" Platine erstellen, mit allen SMD-Teilen und separaten Layern für Analog, Digital und Power (das sind 4 Layer!), wird es wahrscheinlich sehr gut funktionieren. Es wird viel kleiner sein, es wird keine komplette Blue Pill verwenden, sondern nur das F103, und das wird es ermöglichen, es mit einem separaten (sauberen) analogen Vdda für die ADCs zu versorgen.

Als letzten Schliff habe ich mich entschieden, die Box schwarz zu sprühen, es ist eine Abwechslung zu all den beigen Boxen, die sie hat.

Schritt 10: Der Code und ein kurzes Video

Schritt 11: EXTRA: Übertakten

EXTRA: Übertaktung
EXTRA: Übertaktung

Genau wie beim F03 wollte ich sehen, wie gut sich ein F103 übertakten lässt. Die Spezifikationen für diesen Mikrocontroller behaupten, dass die maximale Taktrate 72 MHz nicht überschreiten sollte (was natürlich schon schneller ist als der F030), aber ich hatte in mehreren Blogs gelesen, dass das Übertakten einfach ist, also warum nicht?

Die Blue Pill ist mit einem 8MHz Quarz ausgestattet, die PLL multipliziert das mit einem Faktor von 9 auf 72MHz. Die PLL kann auf bis zu 16 erhöht werden, was einen Takt von 128 MHz ergibt. Für meine Blue Pill war das überhaupt kein Problem, tatsächlich funktionieren alle meine Blue Pills problemlos auf 128MHz.

Aber jetzt wollte ich herausfinden, was die wirkliche Grenze ist. Also habe ich den 8MHz Quarz entfernt und durch einen mit 12MHz ersetzt. Wieder erhöhte ich den PLL-Multiplikator, bis der Mikrocontroller schließlich aufgab. Das war bei 168MHz! Auf 156MHz hat es noch gut funktioniert. Ich habe es stundenlang mit dieser Geschwindigkeit laufen lassen und nie einen Absturz gesehen. Bei diesem Oszilloskop habe ich mich für 120MHz entschieden, eine Geschwindigkeit die mit einem 12MHz Quarz und PLL auf 10 sowie mit einem 8MHz Quarz und der PLL auf 15 gewählt werden kann (siehe SystemClock_Config in main.c)

Die ADCs arbeiten jetzt auch schneller, ich habe sie mit 30MHz (statt 14) laufen lassen, sie funktionierten immer noch gut auf 60MHz, STMicroelectronics macht schöne Hardware!

STMicroelectronics setzt diese Grenzen aus gutem Grund in das Datenblatt, sie garantieren, dass der Mikrocontroller unter allen Bedingungen mit den angegebenen 72 MHz arbeitet.

Da ich den Mikrocontroller aber nicht bei -40 Grad Celsius, +85 Grad Celsius, nur bei 2,0 Volt oder 3,6 Volt verwende, denke ich, dass es sicher ist, ihn zu übertakten. Tun Sie dies NICHT, wenn Sie beabsichtigen, ein Gerät mit seinen Mikrocontrollern zu verkaufen, Sie wissen nie, wo sie verwendet werden.