Gerade war ich mal wieder ein paar Wochen im Urlaub und zwar am Mittelmeer. Wenn man so die Schiffe beobachtet, kommt immer wieder die Frage auf, wie weit die eigentlich weg sind.
typische Szene am Meer: Schiffe am Horizont
Das ist unter den üblichen Vereinfachungen (Erde als Kugel, ruhige See etc.) eine einfache geometrische Aufgabe:
Der Horizontabstand mit dem Satz des Pythagoras berechnet
a ist der gesuchte Abstand zum Horizont, h die Beobachtungshöhe und r der Erdradius. Mit dem Satz des Pythagoras lässt sich der Horizontabstand also einfach bestimmen:
Durch Auflösen der Klammer ergibt sich
Wenn die Beobachtungshöhe sehr viel kleiner ist als der Erdradius, dann lässt sich diese Formel vereinfachen zu:
Durch Einsetzen des Erdradius von ungefähr 6371 km ergibt sich dann:
Damit kann man arbeiten. Als Faustformel ergibt sich der Horizontabstand in Kilometer damit zu 3,6 * der Quadratwurzel aus der Beobachtungshöhe in Meter.
Beispiel: im oben gezeigten Foto sei die Beobachtungshöhe etwa 10 m und damit der Abstand der Schiffe am Horizont etwa 11 km (Aufnahme ist gezoomt). Da das sowieso nur eine grobe Schätzung ist, muß man es mit den Zahlen nicht so genau nehmen. Nimmt man statt 3,6 den Faktor 4 und als Wurzel aus 10 eine 3, dann kommt man auf 12 km Abstand, was als Schätzung genauso gut ist, wie die 11 km. Anderes Beispiel: man steht als 2‑m-Mann mit den Füßen am Ufer ein paar Zentimeter über der Wasseroberfläche. Der Horizont ist dann 1,4 * 3,6 km entfernt, also 5 km im Rahmen der Schätzung.
Wozu ist das jetzt gut?
Soviele Schiffe kommen hier ja nicht vorbei. Auch für Funkwellen im UKW-Bereich und darüber gilt die quasi-optische Ausbreitung. Im ebenen Gelände mit einem Funkgerät in der Hand können wir also nicht viel mehr Reichweite als die 5 km des obigen Beispiels erwarten. Die verdoppelt sich, wenn die Gegenstation auch 2 m über dem Boden arbeitet. Mit einer Antennenhöhe von 16 m schaffen wir dann schon 15 km, bzw. das Doppelte, wenn die andere Antenne auch so hoch ist.
Glücklicherweise ist die Erde keine exakte Kugel sondern hat Abweichungen in Form von Hügeln und Bergen. Mein Wohnort liegt z.B. in gut 400 m Höhe, was eine Reichweite von 3,6 * 20 = 72 km verspricht. Das ist schon nicht schlecht, denn bekanntlich geht ja durch Reflexionen und Beugung auch immer ein bisschen mehr, zumindest wenn nicht weitere Berge dazwischen sind. Die Zugspitze ist ungefähr 3000 m hoch, so daß ihr Horizont 200 km weit weg ist. Das ergibt zusammen mit meinem Horizont also gut 270 km, aber tatsächlich ist sie Luftlinie etwa 360 km entfernt. Das ist aber immerhin nahe genug, um bei guten Bedingungen, wenn auch verrauscht, das Zugspitzrelais auf 2m zu hören. Beugung macht’s möglich.
Eine andere Anwendung dieser Faustformel ist die Sichtweite aus einem Flugzeug. Aus einem Airliner in 10 km Flughöhe kann man also 3,6 * 100 = 360 km Sichtweite erwarten, die in aller Regel wegen des Zustands der Atmosphäre nicht möglich ist. Ein Kleinflugzeug fliegt in Deutschland in maximal 10000 Fuß Höhe (mit kleinen Ausnahmen beispielsweise in der Gegend der Zugspitze), oft eher unter 3000 Fuß, also 1 km. Die Reichweite des Funkgeräts ist daher auf etwa 100 km begrenzt, liegt in der Praxis allerdings in der Regel eher bei einigen 10 km.
…und noch der militärische Aspekt
Dieselben Betrachtungen gelten natürlich auch für Radar. Bekanntlich üben Militärs gerne den Tiefflug „in Baumwipfelhöhe“. Nehmen wir hier mal eine Höhe von 100 m an, dann können sie vom Radar erst erfasst werden, wenn sie weniger als 36 km entfernt sind. Nehmen wir an, sie fliegen nahezu mit Schallgeschwindigkeit, dann ergibt sich daraus eine Vorwarnzeit von weniger als zwei Minuten.
Diese Tatsache führt zum Einsatz von Überhorizont-Radaren (OTH-Radare), die uns Funkamateuren mitunter das Leben auf Kurzwelle so schwer machen. Aber das ist ein anderes Thema…
Wie hier schon beschrieben habe ich eine weitere Variante eines Sontheimer-Frederick-Richtkopplers gebaut. Sie hat den passenden Abstand der SMA-Buchsen, um direkt an das Gamma-Messgerät angeschraubt zu werden. Beide Leiterplatten sind nun verfügbar und hier zunächst die Beschreibung und die Meßergebnisse zum Koppler.
Detailansicht
Hier nochmal die KiCad-3D-Ansicht und ein paar Detailfotos:
Antennenkoppler V1.7, OberseiteAntennenkoppler V1.7, UnterseiteAntennenkoppler V1.7 mit FT 50–43 Ringkernen und jeweils 20 Wdg 0,5mm CuL-DrahtAntennenkoppler V1.7, UnterseiteReflexionsmessgerät, Auswertung V1.3Antennen-/Richtkoppler V1.7 mit Auswertung V1.3
Diesmal wurden Ringkerne des Typs FT 50–43 mit einem AL-Wert von 440nH/Wdg² verwendet. Sie haben jeweils 20 Windungen und damit eine Eigeninduktivität von 176 µH. Sie transformieren die Leistung auf ein vierhundertstel, was rechnerisch einen Kopplungsverlust von 10*log(400)=26 dB erwarten lässt.
Als innere „Wicklung mit einer Windung“ wurde ein kurzes Stück RG400 Koaxkabel eingesetzt, das gegenüber RG58 den Vorteil hat, nicht so hitzeempfindlich zu sein. Man kann recht sorglos mit dem Lötkolben hantieren. Außerdem ist die Schirmung deutlich dichter, was der Isolation zugute kommt.
Messergebnisse
Hier die Meßergebnisse, die direkt mit den vorherigen hier und hier zu vergleichen wären:
Richtkoppler V1.7 mit jeweils 20 Windungen auf FT 50–43
Die Richtschärfe ist der wichtigste Parameter eines Richtkopplers. Sie gibt das Verhältnis der bei idealer Anpassung gemessenen Rücklaufspannung im Verhältnis zur Vorlaufspannung an. Die rücklaufende Spannung sollte unter idealen Verhältnissen null sein, was in der Praxis aber nicht erreichbar ist. Die hier vorgestellte Version 1.7 erreicht für den gesamten Kurzwellenbereich eine Richtschärfe von besser als ‑43 dB und selbst im 4‑m-Band noch knapp ‑34 dB. Das sind für den hier beabsichtigten Zweck mehr als gute Werte. Selbst für das 2‑m-Band werden noch ‑20 dB erreicht.
Der Kopplungsverlust liegt bis in das 4‑m-Band bei den errechneten 26 dB. Darüber fällt er etwas stärker ab, als bei dem vorherigen Versuchsaufbau mit FT50-61 Ringkernen. Zwei Dekaden abzudecken ist ja auch nicht ganz selbstverständlich.
Die Durchgangsdämpfung liegt mit 0,02~0,04 dB hart an der Grenze der Meßgenauigkeit des verwendeten Netzwerkanalysators. Idealerweise wären hier 0,01 dB zu erwarten (10*log(1–1/400)).
Der innere blaue Kreis im Smith-Diagramm kennzeichnet ein SWR von 1,25. Im gesamten Bereich zwischen 1,8 MHz und 150 MHz liegt das SWR bei 1,02 bis maximal 1,07
Der hier vorgestellte Richtkoppler ist für den vorgesehenen Einsatzzweck bis hinauf zum 4‑m-Band sehr gut geeignet. Wer bis in das 2‑m-Band arbeiten will, sollte eher den FT 50–61 Ringkern nehmen, was auf Kosten des 160-m-Bandes gehen könnte. Eventuell sind dann 22 bis 24 Windungen als Kompromiss angemessen.
Vorschau
Auch der oben schon gezeigte Koppler funktioniert nun sehr gut. Die Eingangssignale werden bis etwa ‑40 dBm erkannt und bis sind bis etwa ‑30 dBm gut messbar. Ich werde noch einige Meßreihen durchziehen und dann hier berichten. Vorab schonmal die Messungen der Eingangsreflexion:
Gammamessgerät V1.3, Eingangsreflexion am Port 1Gammamessgerät V1.3, Eingangsreflexion am Port 2
Nachdem der Prototyp nun zuverlässig funktioniert, habe ich das Design des ersten Releases fertiggestellt. Es übernimmt die Funktionen des Prototyps, verzichtet aber auf nicht notwendige Debug-Steckverbinder und ‑Schnittstellen. Das Tang Primer 25K Basis-Board wird nicht mehr unterstützt, sondern lediglich das Tang Primer 25K Core-Board. Dieses Core-Board muß dann extern auf einem Basis-Board programmiert und umgesteckt werden. Physikalische serielle Schnittstellen wie USB, Bluetooth und RS485 sind entfallen. Bei Bedarf müssen sie anderweitig angeschlossen werden. RxD und TxD werden als 3.3V-TTL-Signale zur Verfügung gestellt.
Der Fehler des Prototyps mit dem Leckstrom in den Komparatoren wurde mit einem Operationsverstärker (hoffentlich) ausgebügelt. Das Board geht in Kürze in Produktion.
Ansichten und Design-Dateien
Die 3D-Ansichten…
Gamma Messgerät, Oberseite mit aufgestecktem FPGA-BoardGamma Messgerät, Oberseite ohne FPGA-BoardGamma Messgerät, Unterseite
Die Dämpfungsglieder am Eingang sind jetzt für eine maximale Eingangsleistung von 27 dBm (500 mW) ausgelegt. Dem negativen Eingang der Komparatoren ist nun jeweils ein rauscharmer Präzisions-OpAmp vom Typ OPA376 als Spannungsfolger vorgeschaltet. Der sollte die Spannungsverschiebung durch den Eingangsleckstrom der Komparatoren kompensieren. Für OpAmp und Komparatoren wären auch jeweils Varianten mit zwei Einheiten in einem Gehäuse verfügbar. Um eine bestmögliche Entkopplung der beiden Kanäle zu erreichen, wurde auf deren Einsatz aber verzichtet.
J7 dient der Spannungsversorgung und der seriellen Kommunikation mit der Außenwelt. Hier kann zu Testzwecken ein USB-Seriell-Konverter direkt angesteckt werden. Um einen gewissen Schutz gegen Verpolung zu erreichen, sind in die Datenleitungen serielle Widerstände von 330 Ω eingefügt. Die Spannungsversorgung ist mit einer Thermosicherung und einer TVS-Diode gesichert. J3 und J6 stellen ein paar Signale des FPGAs zur Verfügung. Wenn alles auf Anhieb funktioniert, sind sie unnötig.
Die Kanäle wurden jetzt mit Port1 und Port2 bezeichnet. Sie sind ja gleichartig aufgebaut und die Software entscheidet, welcher Port die vorlaufende und welcher die rücklaufende Spannung aufnimmt.
Koppler V1.7
Anders als ursprünglich geplant wurde der Koppler nicht auf dieses Board integriert. Stattdessen habe ich einen passenden Koppler entworfen, nunmehr die Version 1.7, der den passenden Portabstand hat, so daß er direkt an das Messgerät angeschraubt werden kann. Hier die 3D-Ansicht:
Für J3 und J4 werden tatsächlich männliche SMA-Schraubverbinder montiert, die aber hier mangels 3D-Modell nicht dargestellt sind. Der Abstand ist passend zum Messgerät gewählt.
Für die Trafos wird hier RG400 Koaxkabel mit blauem Außenmantel eingesetzt. Es hat etwa den gleichen Außendurchmesser wie RG58, nutzt aber PTFE als Isolator und einen temperaturfesten Außenmantel. Es brutzelt daher beim Löten nicht gleich weg.
Erfahrungen zum Bau der Trafos
Zwischenzeitlich habe ich einige weitere Versuchsaufbauten mit den vorherigen Kopplervarianten gemacht. Die habe ich bisher nicht hier dokumentiert. Es sieht im Moment so aus, daß die Variante mit FT 50–61 Ringkern und nur 20 Windungen den besten Frequenzgang von 160m bis in den UKW-Bereich hat. Die Koppeldämpfung beträgt 26 dB (1:20²) was für ein stärkeres Signal am Messeingang sorgt und gleichzeitig den Verlust gering hält (250 mW Verlust bei 100 Watt Senderausgangsleistung). Der einzige kleine Nachteil ist der, daß aufgrund der relativ niedrigen Induktivität der induktive Widerstand der Spulen bei 1,8 MHz grenzwertig ist. Hier kann man weiter optimieren und entweder ein paar wenige Windungen mehr aufbringen (22~24) oder doch wieder auf den FT 50–43 Ringkern zurückgreifen. Höhere Windungszahlen würde ich in beiden Fällen vermeiden. Sie treiben die Induktivität hoch und verringern die Selbstresonanzfrequenz. Beides ist für die 4‑m- und 6‑m-Bänder ungünstig.
Hier die Meßergebnisse ohne weiteren Kommentar:
Der im vorigen Beitrag bereits angekündigte RTL-Code für das FPGA und die zugehörige Firmware sind jetzt funktionsfähig und soweit, daß man beides vorzeigen kann. Es ist noch der eine oder andere Testcode enthalten, daher ist beides noch nicht als „Release“ gekennzeichnet. Außerdem soll es noch ein paar Änderungen in der nächsten Revision der Leiterplatte geben.
Nach ein paar grundlegenden Bemerkungen zum Messprinzip wird nachfolgend zuerst der Verilog-Code beschrieben, anschließend die Software und zum Abschluss werden ein paar Beispielmessungen mit einem Signalgenerator gezeigt. Am Ende des Beitrags folgen noch ein paar Anmerkungen zum PicoRV32-Risc-V-Core.
Das verwendete Tool zum Erstellen des FPGAs ist der Gowin FPGA Designer V1.9.11.01. Für die Softwareerstellung wird GMD (Gowin for Embedded C/C++ Developers), Version: 2025.01 verwendet.
Als Referenz soll hier zunächst nochmal das Blockdiagramm aus dem vorigen Beitrag gezeigt werden, weil sich die nachfolgenden Erklärungen darauf beziehen:
Das Messprinzip
Die vor- und rücklaufenden Analogsignale werden in den Komparatoren digitalisiert und anschließend im FPGA digital ausgewertet. Hier ist exemplarisch ein Timingdiagramm für ein 10-MHz-Signal und eine Abtastung mit 200 MHz gezeigt:
Timing Diagramm der Phasenmessung
Oben wird das vorlaufende Signal und darunter das reflektierte und um 90° phasenverschobene rücklaufende Signal gezeigt. Die dritte und vierte Kurve zeigen jeweils das digitalisierte Signal und danach ist das exklusiv-veroderte Phasendifferenzsignal dargestellt, aus dem die Phasenverschiebung bestimmt wird. Das Abtastsignal hat eine deutlich höhere Frequenz, in diesem Fall 200 MHz.
Ein Messintervall dauert typischerweise zwischen 10 und 100 ms. Während dieses Intervalls werden verschiedene Zähler unter bestimmten Bedingungen mit dem Takt des Abtastsignals hochgezählt und am Ende des Messintervalls von der CPU ausgelesen und ausgewertet. Beim Start des nächsten Messintervalls werden diese Zähler automatisch wieder gelöscht und starten bei null.
Phase Difference Counter PDC
Alle Zähler sind im Modul „Reflection_Measurement“ in der Datei „RefMeas.v“ definiert. Der Phase Difference Counter PDC wird immer dann inkrementiert, wenn das Phasendifferenzsignal auf high liegt, wenn also beide Eingangssignale verschieden sind. Am Ende des Messintervalls zeigt das Verhältnis des PDC-Zählerstandes zur Gesamtanzahl der Takte während des Intervalls also die Phasenverschiebung zwischen den Eingangssignalen an.
Edge Counter EC
Die Phasenmessung mit dem Phase Difference Counter liefert ein zweideutiges Ergebnis, denn eine negative Phasenverschiebung führt zu demselben Zählerstand, wie eine positive Verschiebung. Diese Mehrdeutigkeit löst der Edge Counter EC auf. Dieser Zähler wird dann inkrementiert, wenn das rücklaufende Signal bei einer steigenden Flanke des vorlaufenden Signals low ist. Ein weiterer gleichartiger Zähler wird dann inkrementiert, wenn das vorlaufende Signal bei einer steigenden Flanke des rücklaufenden Signals low ist. Am Ende der Messung trifft die CPU eine Mehrheitsentscheidung und bestimmt so das Vorzeichen der Phasenverschiebung. Bei 0° und 180° kommt es hier zu Unsicherheiten, die aber im Rahmen der Messgenauigkeit liegen.
Frequency Counter FC1 und FC2
Die beiden Frequenzzähler FC1 und FC2 werden immer dann inkrementiert, wenn eine steigende Flanke auf dem jeweiligen Eingangssignal festgestellt wurde. Aus dem Zählerstand am Ende der Messung bestimmt die CPU dann die jeweilige Frequenz.
Diese Frequenzen sind naturgemäß gleich, weil das rücklaufende Signal ja vom vorlaufenden Signal abgeleitet ist. Bei nahezu idealer Anpassung geht aber der Pegel des reflektierten Signals immer weiter gegen null und die gemessene Frequenz genauso. Der Vergleich dieser Frequenzen ist daher ein Maß für die Zuverlässigkeit der Phasenmessung. Weichen sie (deutlich) voneinander ab, ist die Phasenmessung mit den oben genannten Registern ungültig.
High und Low Counter
Im unten vorgestellten Design sind noch vier weitere Zähler implementiert, die im Blockdiagramm nicht gezeigt sind und zukünftig entfallen sollen: F‑High, F‑Low, R‑High und R‑Low. Die High-Zähler werden inkrementiert, wenn das entsprechende Eingangssignal bei steigender Flanke des Abtasttaktes high ist, die (redundanten) Low-Zähler dann, wenn das Signal low ist. Wie im Beitrag „Gamma-Messgerät – Nachtrag zu den Messungen“ beschrieben wurde, gibt es beim Prototyp einen Offset in der Vergleichsspannung der Komparatoren. Das führt dazu, daß die Umschaltpegel der Komparatoren vom Nulldurchgang der Eingangssignale verschoben ist. Der Effekt ist nachfolgend etwas übertrieben dargestellt:
Timing Diagramm der Phasenmessung, Fehler in der Schaltschwelle (übertrieben dargestellt)
Als Folge davon sind die erkannten positiven Halbwellen kürzer als die negativen Halbwellen. Dieser Fehler ist bei hohen Eingangspegeln gering, wird aber immer höher, je weiter die Pegel sinken. Am Ende des Messintervalls zeigen die Zählerstände also die Dauer der high- und low-Phasen an, also die Qualität des jeweiligen Signals.
Weitere Funktionsblöcke im FPGA
Intervall Timer T1
T1 ist ein einfacher Intervall Timer, der automatisch nach einer einstellbaren Zeit einen CPU-Interrupt generiert. Er wird im Beispielcode auf 10 ms eingestellt. Anders als der in der CPU eingebaute Timer, muß er nach dem Auslösen eines Interrupts nicht wieder neu initialisiert werden. Damit wird also unabhängig von der Interrupt-Antwortzeit ein festes zeitliches Raster erzeugt, zumindest solange keine Interrupts verloren gehen.
Asynchroner Transmitter ATx
In der CPU können zwei verschiedene UARTs angelegt werden, ein „simple UART“ und ein „WB UART“. Keines davon ist besonders gut dokumentiert, so daß es mir nicht auf Anhieb gelungen ist, einen Interrupt auszulösen, wenn der Sendepuffer leer ist. Da zum Senden der Messwerte nur ein Transmitter nötig ist, schien es mir einfacher, einen eigenen asynchronen Sender zu schreiben. Ich habe ihn ATx genannt, nicht UART, weil er weder universell ist noch einen Empfänger beinhaltet. Immerhin ist er gepuffert und löst einen Interrupt aus, sobald der Puffer ins Schieberegister übertragen wird. Die Baudrate ist von der CPU einstellbar. Es wird ein Stoppbit generiert und Parity ist nicht unterstützt.
Der RTL Code
Die oben im Blockdiagramm gezeigten und anschließend erklärten Funktionen wurden in Verilog geschrieben und für das FPGA synthetisiert. Hier ist das gesamte komprimierte Gowin_V1.9.11.01 FPGA Designer Projekt inklusive der vom IP Core Generator erzeugten Module. Mit welchen Parametern diese Module erzeugt wurden steht in src/readme.txt.
Das Top-Level Design findet sich in der Datei „Antennenkoppler.v“. Hier werden die FPGA-Pins definiert, die auf dem Prototypenboard angeschlossen sind. Außer den generierten Modulen werden die Module „Reflection_Measurement“, „ATx“ und „IntervalTimer“ instanziiert. Deren Quellcode findet sich in den entsprechenden Dateien im selben Verzeichnis.
Das Top-Level-Modul generiert die Reset-Signale für die CPU und die Reflexionsmessung, sowie die Signale für das Wishbone-Memory-Interface. Es definiert auch die Signale für die Adress-Decodierung. Weitere Erläuterungen finden sich in den jeweiligen Quelltexten.
Außerdem instanziiert das Top-Level-Modul die PLL, die aus dem Eingangstakt von 50 MHz den Abtasttakt von 200 MHz und den CPU-Takt von 20 MHz erzeugt.
Der IP Core Generator
Exemplarisch soll hier die Erzeugung des Gowin PicoRV32 CPU-Cores mit dem IP Core Generator gezeigt werden. Der IP Core Generator wird entweder unter „Tools“-„IP Core Generator“ gestartet oder durch Anklicken des zugehörigen Icons mit den drei Würfeln auf der Tools-Leiste. Er meldet sich mit einem Angebot verschiedener Hard- und Soft-Module:
Der Gowin Core Generator
Hier wählt man unter Soft IP-Core den Gowin_PicoRV32 mit einem Doppelklick aus. Es wird eine Eingabemaske zu Konfiguration des gewünschten Funktionsumfangs gestartet:
PicoRV32 CPU Konfiguration
Durch Doppelklick auf die jeweilige Funktionsgruppe kann diese ausgewählt (grün hinterlegt) oder wieder entfernt werden. Bei konfigurierbaren Elementen öffnet sich ein entsprechendes Menü. Starten wir mit der Konfiguration der CPU:
Gowin PicoRV32 CORE
In diesem Dialog wird der CPU-Core konfiguriert.
Konfiguration des PicoRV32 CPU-Cores
Man kann zunächst in engen Grenzen den verwendeten Befehlssatz auswählen. Immer ausgewählt ist der RV32I Integer Befehlssatz, optional kann man die komprimierten Instruktionen (RV32C) und die Unterstützung für Integer-Multiplikation und Division (RV32M) zu- oder abwählen. Darüberhinaus sind einige Features wählbar, die den Funktionsumfang und die Performance beeinflussen, was jeweils zugunsten oder zuungunsten der Anzahl verwendeter Logikgatter führt. Da es bei dem hier vorgestellten System weder Einschränkungen bei den Logikgattern noch bei der Performance gibt, lassen wir alles auf den oben gezeigten Default-Einstellungen.
ITCM
Mit der etwas ungewöhnlichen Abkürzung ITCM wird der Befehlsspeicher für den Prozessor konfiguriert und sein Inhalt festgelegt.
Instruction Memory
Der Befehlsspeicher kann 8 kB, 16 kB, 32 kB oder 64 kB groß sein. Für dieses Projekt belassen wir es bei dem Default-Wert von 32 kB.
Als nächstes muß der Boot-Mode ausgewählt werden. Bei den ersten beiden Modi wird ein SPI-Interface generiert, über das das Programm beim Start aus dem externen Flash in das ITCM geladen wird. Damit ist die Softwareentwicklung quasi unabhängig von der Hardwareentwicklung. Hier ist es im Moment allerdings einfacher, die Software bereits in den FPGA-Bitstream einzumassieren. Dazu wählt man „MCU boot and run in ITCM“ und trägt den Namen der zu verwendenten Hex-Datei ein. Das hat allerdings den Nachteil, daß die Software bereits bei Generierung des Bitstreams vorhanden sein und dieser bei jeder Softwareänderung neu generiert werden muß.
DTCM
Die Konfiguration des Datenspeichers erfolgt analog zu der des Instruktionsspeichers.
Data Memory
Der Datenspeicher wird beim Starten durch die CPU initialisiert. Ein Hex-File wie beim Instruktionsspeicher entfällt daher.
WB UART
Das Wishbone UART wird tatsächlich in dem hier vorgestellten Projekt nicht mehr verwendet, aber aus historischen Gründen sind die Signale noch definiert. Daher muß es enabled werden, um Fehlermeldungen zu vermeiden. Es wird in einer zukünftigen Version entweder wieder benutzt oder ganz entfernt.
WB SPI Master
Das SPI Master Interface wird zur Kommunikation mit dem externen AD-Wandler ADS1118 benötigt. Es wird enabled und folgendermaßen konfiguriert:
Wishbone SPI Master
Das SPI-Interface wird mit dem CPU-Takt von 20 MHz betrieben und der AD-Wandler darf mit höchstens 4 MHz getaktet werden. Um genügend Marge zu haben, wird er tatsächlich mit 2 MHz betrieben, was einem CLOCK_SEL=4 entspricht (SPICLK = CPUCLK/(2*(CLOCK_SEL+1))). Shift-Richtung, Clock Phase und Polarität sind vom ADC vorgegeben und müssen wie hier gezeigt gewählt werden, die Kommunikation erfolgt mit einer Datenlänge von 32 Bit. Die anderen Parameter bleiben auf ihren Default-Werten.
Open WB Interface
Abschließend wird noch das Open Wishbone Interface enabled. Es wird für das Lesen und Schreiben der Register in den oben genannten Funktionsblöcken benötigt.
Andere CPU Funktionsblöcke
Simple UART, Open AHB Interface, WB I2C Master, WB SPI Slave, WB GPIO und ADV SPI-Flash werden hier nicht benutzt und dementsprechend disabled.
Generieren der konfigurierten CPU
Nachdem nun alle Blöcke wie gewünscht konfiguriert sind, kann nun die CPU generiert werden. Vor dem Klicken auf „ok“ sollte aber noch der Haken bei „Use Gowin PicoRV32 as top module“ abgewählt werden, denn die CPU ist hier ein Sub-Modul.
PicoRV32 CPU Konfiguration – fertig konfiguriert
Nach dem Klicken auf „ok“ wird noch nachgefragt, ob das existierende Verzeichnis überschrieben werden darf, falls es aus vorherigen Durchgängen bereits existiert. Wir klicken auf „yes“ und nun hat er erstmal 30 Sekunden zu tun. Dann wird nachgefragt, ob die neu generierten Dateien zum Projekt hinzugefügt werden sollen. Das sollte man beim ersten mal mit „yes“ beantworten, sonst muß man sie anschließend manuell hinzufügen. Bei weiteren Durchgängen ist die Antwort egal, denn sie sind ja schon Teil des Projekts.
Synthese, Placement & Routing
Jetzt ist das Projekt bereit zur Synthese. Dabei werden die Logikfunktionen aufgelöst und das gesamte Projekt in Logikgatter umgewandelt. Wenn das fehlerfrei durchläuft, folgt anschließend das Placement & Routing. Dabei werden die Pins und Gatter an die berechneten Positionen platziert und elektrisch miteinander verbunden.
Wenn die Synthese für ein definiertes Projekt verwendet werden soll, dann muß man vor dem Placement zumindest die angeschlossenen Pins im Floorplanner zuweisen. Nicht angeschlossene Pins bekommen eine Default-Konfiguration (meist Input mit pull-up Widerständen). Nicht im Floorplanner zugewiesene Signale werden irgendwohin gelegt, wo es dem Placement genehm ist. Das kann man bei ersten Versuchen machen, wenn es noch keine Leiterplatte gibt. Das automatische Placement kann sogar eine Hilfe bei der Pinauswahl für das Layout sein.
Synthese, Placement & Routing benötigen für dieses Projekt auf meinem PC etwa 2 Minuten. Im Verlauf werden mehrere Berichte erstellt, die man sich gelegentlich anschauen sollte. Sie können insbesondere bei Fehlern sehr hilfreich sein. Auch die Timing Analyse sollte man nicht ignorieren. Hier werden die maximal möglichen Taktfrequenzen angezeigt und zwar in rot, wenn die Vorgaben nicht getroffen werden. Gerade in der Entwicklungsphase kann man mal ein Auge zudrücken, wenn die Abweichungen gering sind und beispielsweise nur 195 MHz statt 200 MHz erreicht werden, wir arbeiten ja schließlich unter definierten Bedingungen und bei Zimmertemperatur. Sobald das Modul aber für den Außenbereich released wird und damit dem gesamten Temperaturbereich und womöglich Spannungsschwankungen ausgeliefert ist, würde ich keine roten Meldungen mehr tolerieren. Im ungünstigsten Moment fällt dann das Modul aus und man hat keinen Hinweis, was schiefgelaufen sein könnte.
Es müsste direkt übersetzbar sein, aber gegebenenfalls müssen Pfade angepasst werden.
Das eigentliche Hauptprogramm steht in der Datei „RiscV_Phasenmessung.c“. Im „library“ Verzeichnis befinden sich die Quellcodes, die von Gowin zur Verfügung gestellt wurden, einige von ihnen wurden für dieses Projekt adaptiert, insbesondere die Interrupt-Funktionen in irq.c und irq.h.
Das Hauptprogramm
Im Hauptprogramm werden nach der Initialisierung lokaler Variablen als erstes die verwendeten Peripherieelemente im FPGA initialisiert. Der asynchrone Sender wird auf 115,2 kBd eingestellt, der Intervalltimer auf 10 ms und ein Messzyklus wird gestartet. Anschließend werden die Interrupts freigegeben.
Der Intervalltimer
Der Intervalltimer erzeugt alle 10 ms einen Interrupt, der die Funktion user1_int() aufruft. Dort wird im wesentlichen der nächste ADC Messzyklus gestartet und das Ergebnis der vorherigen Messung gelesen. Der SPI-Transfer zum ADC läuft automatisch und die CPU muß nicht auf dessen Ergebnisse warten. Sie werden einfach bei der nächsten Gelegenheit nach 10 ms abgeholt. Um die Ausführungszeit des Interrupt-Handlers kurz zu halten, werden die Messergebnisse nicht konvertiert, sondern als Rohdaten abgespeichert.
Die Phasenmessung
Die Phasenmessung erfolgt wie oben beschrieben im FPGA. Sie wird durch Schreiben des Controlregisters gestartet und läuft dann automatisch ab. Der Status der Messung wird im Statusregister angezeigt, das hier der Einfachheit halber gepollt wird. Ist die Messung beendet, werden die Ergebnisse ausgelesen, formatiert und die serielle Übertragung wird gestartet. Der Datentransfer nach dem ersten Byte erfolgt interruptgesteuert. Direkt nach dem Start der Übertragung wird der nächste Messzyklus gestartet.
Die Formatierung der Ergebnisse ist im Moment in lesbarer Form gehalten, damit man sie direkt in einem Terminalprogramm beobachten kann. Daher wurde auch auf einen Zeilenvorschub verzichtet, es wird also jedesmal die vorherige Zeile überschrieben. Das wird in einem endgültigen System sicherlich adaptiert.
Beispielmessungen
Nachfolgend sollen einige Beispielmessungen z.Zt. noch mit reiner Textausgabe dokumentiert werden.
Messung ohne Eingangssignale
Dieser Block zeigt die gesamte Textausgabe nach einem Reset. Die folgenden Beispiele zeigen jeweils nur die Messung.
-------- Reflection Measurement, under development, date: Jan 8 2026, time: 12:39:23 -------- CPU clock: 20.000 MHz - Sampling clock: 200.000 MHz - Measurement interval: 25 ms Ff: 0.000 MHz, Fr: 0.000 MHz, Delta_P: +0.00°, High_f: 0.00%, High_r: 0.00%, ADC0=2 mV, ADC1=3303 mV, ADC2=398 mV, ADC3=381 mV, T=+23,750 °C
ADC1 zeigt die Versorgungsspannung in Millivolt, T die aktuelle Temperatur des AD-Wandlers. Es sind keine Eingangssignale angelegt, daher ist die Frequenz 0 Hz. An den Ausgängen der logarithmischen Verstärker liegen knapp 400 mV an.
Hier wurde absichtlich eine krumme Frequenz von 21.104 MHz gewählt, denn mitunter ergeben sich bei ausgesuchten Eingangswerten zufällig die gewünschten korrekten Ergebnisse. Die Frequenzen werden korrekt gemessen und es zeigt sich eine Phasenverschiebung von +0.99°, was im Rahmen der Messgenauigkeit liegt. Die an den LogAmps gemessenen Pegel liegen bei 1,87 V mit einer Abweichung von etwa 10 mV. High_f und High_r geben die relative High-Zeit des jeweiligen Signals während der Messperiode an. Sie liegen etwas unter 50%, wodurch die Messung bei diesem Eingangspegel schon unzuverlässig wird.
Wir bleiben bei der krummen Frequenz und erhöhen den Pegel des vorlaufenden Signals auf +20 dBm und die Phasenverschiebung auf 100°. Die Frequenzmessung bleibt korrekt und die Qualität der vorlaufenden Signals verbessert sich auf 49.78%, also nahezu auf den Idealwert.
Jetzt wird auch der Pegel des rücklaufenden Signals auf +20 dBm erhöht. Die Qualität beider Signale nähert sich dem Idealwert von 50% und die gemessene Phasenverschiebung liegt nun 2° neben dem tatsächlichen Wert. Beide LogAmps zeigen nun etwa 2,37 V Ausgangsspannung an.
Der Vorlauf-Pegel liegt nun wieder bei 0 dBm, der Rücklauf-Pegel bei ‑15 dBm und die Phasenverschiebung wurde am Signalgenerator auf ‑100° eingestellt. Die Frequenzmessungen sind nach wie vor korrekt, aber die Qualität des rücklaufenden Signals sinkt auf unter 30%. Es wird also ein erheblicher Teil der positiven Halbwelle abgeschnitten. Trotzdem weicht die gemessene Phasenverschiebung nur um gut 3° von der tatsächlichen Verschiebung ab.
Der Rücklauf-Pegel liegt jetzt bei ‑19 dBm. Die Frequenzmessungen sind nach wie vor korrekt, aber die Qualität des rücklaufenden Signals sinkt auf unter 16%.
Der Rücklauf-Pegel liegt jetzt bei ‑20 dBm, nur 1 dB weniger als bei der vorigen Messung. Das Signal wird nicht mehr erkannt, die Frequenz sinkt auf 0 Hz und die Qualität auf 0%. Kanal 3 des ADC zeigt noch 1,358 V, es liegt also noch ein hinreichend starkes Signal an.
Das ist genau das Problem, das einer Nachbesserung bedarf und im nächsten Redesign behoben werden soll.
Anmerkungen zur PicoRV32 CPU
Im FPGA wird eine PicoRV32 CPU synthetisiert. Das ist ein 32-bit-Mikroprozessor mit einer Risc-V-Architektur. Zum Erstellen des RTL-Codes wird der „IP Core Generator“ des Gowin FPGA Designers benutzt. Alternativ kann der gesamte Verilog-Code auch von GitHub heruntergeladen werden. Damit hat man alle Freiheiten, inklusive der Adaption des Codes, aber eben auch alle Last der korrekten Konfiguration. Weitere Informationen zur Risc-V-Architektur findet man auf deren Website.
PicoRV32 Designziele
PicoRV32 ist für die Synthese für ein FPGA optimiert. Dazu soll der Ressourcenverbrauch gering sein, die Rechenleistung ist von untergeordneter Bedeutung. Im hier verwendeten FPGA wird bei der Standardkonfiguration der CPU ungefähr ein drittel der vorhandenen Logikgatter benötigt.
PicoRV32 Performance
Fälschlicherweise wird der Begriff RISC oft mit „eine Instruktion pro Takt“ gleichsetzt, was zwar oft stimmt, aber nicht die eigentliche Bedeutung ist. RISC bedeutet nur, daß der Befehlssatz auf solche Operationen reduziert ist, die ohne zeitlich unbestimmte Pipeline-Locks ausgeführt werden können. Die Pipeline darf durchaus mehrere Takte für eine Instruktion benötigen, sie darf aber nicht beispielsweise durch Wait-States beim Zugriff auf andere Ressourcen auf unbestimmte Zeit blockiert werden. Es sind nur solche Instruktionen erlaubt, die das sicherstellen. Damit fallen insbesondere die Befehle weg, die Daten im Speicher direkt modifizieren, wie es bei CISC-Prozessoren üblich ist. Für Operationen dieser Art wird in einem RISC Prozessor zunächst der Speicherwert in ein Register gelesen, dort modifiziert und anschließend zurückgeschrieben (Load/Store-Architektur). Während des Lese- oder Schreibzugriffs kann die CPU prinzipiell weiterarbeiten, was eine höhere Rechenleistung ermöglicht. In einer einfach gehaltenen CPU darf man Optimierungen dieser Art allerdings nicht erwarten. Auch die etwas komplexeren mathematischen Operationen Multiplikation und Division benötigen einige Dutzend Taktzyklen.
Dhrystone Benchmark Ergebnisse
Die PicoRV32-CPU benötigt beim Dhrystone Benchmark 4,1 Takte pro Instruktion, was 0,516 DMIPS/MHz entspricht. Das ist für RISC-Verhältnisse nicht überwältigend, aber in Anbetracht des geringen Ressourcenverbrauch doch erstaunlich gut. Auf jeden Fall ist es für die typischen embedded-Anwendungen mehr als ausreichend. Eine Taktfrequenz von bis zu 50 MHz soll möglich sein, hier sind 20 MHz eingestellt und völlig ausreichend.
Interrupt Handling
Ein 32-bit RISC-Prozessor hat oft (aber nicht immer) 32 Register zur allgemeinen Verwendung. Das gilt auch für den PicoRV32. Das ist für viele Anwendungsfälle großzügig und bequem, hat aber für Interrupt-Handler den Nachteil, daß beim Start des Handlers alle Register außer R0 gesichert und am Ende wiederhergestellt werden müssen. Das dauert seine Zeit. Für die hier verwendete Variante RV32IMC wurden typischerweise 700 Takte zwischen dem Interrupt-Request und dem Interrupt-Acknowledge gemessen. In dieser Zeit ist der Interrupt-Handler gestartet, hat die Register gesichert und springt zum Interrupt-Code des Anwenders. Dessen Ausführungszeit, das Wiederherstellen der Register und der Rücksprung in das unterbrochene Programm kommt zur gesamten Ausführungszeit noch dazu.
Es gibt eine RV32E-Version, die dieses Problem verringert, indem sie nur 16 Register unterstützt. Sie wird allerdings vom „IP Core Generator“ nicht angeboten.
Der Betrieb mit einem 10-MHz-Takt konnte für den asynchronen seriellen Sender ATx interruptgesteuert keinen kontinuierlichen Datenstrom bei 115 kBd erreichen. Erst durch Takterhöhung auf 20 MHz wurde das möglich. Das liegt natürlich auch daran, daß in jedem Interrupt nur ein Byte in den Sender geschrieben wird. Mit einem Fifo aus mehreren Bytes ließe sich das beheben.
Probleme
Einen schwerwiegenden Fehler im Interrupt-Handling konnte ich lokalisieren, wenngleich noch nicht beheben. Zu Beginn der sprintf-Funktion und ihren Derivaten wird die variabel lange Parameterliste ausgewertet. Das wird mit va_start() bewerkstelligt und ist ungewöhnlich, weil bei fast allen anderen C‑Funktionen die Anzahl der Parameter beim Aufruf bekannt ist. Wenn zwischen dem Funktionsaufruf und va_start() ein Interrupt akzeptiert wird (z.B. der Timer-Interrupt), dann passieren schlimme Dinge. Als Workaround werden daher vor dem Aufruf alle Interrupts disabled und nach der Ausführung von va_start() wieder enabled. Das Problem muß natürlich zügig analysiert und behoben werden, aber für den Moment muß der Workaround reichen.
Nachtrag (07.02.2026)
Die Ursache des hier beschriebenen Problems ist gefunden und behoben. Es ist ein Fehler in dem von Gowin angepassten Startup code in der Datei start.S und betrifft den Interrupt Handler. Vor dem Rücksprung in das unterbrochene Programm wird der Inhalt des x31 (=t6) Registers überschrieben. Das ist ein temporäres Register, dessen Inhalt in vielen Fällen nicht relevant ist, daher geht es meist gut. Es hat auch nichts mit der printf-Funktion zu tun, außer daß es da schnell auffällt.
jal t6… springt unnötigerweise in eine C‑Funktion und speichert die Rücksprungadresse in t6. Ein Rücksprung erfolgt aber nicht, denn es ist kein Funktionsaufruf sondern die Rückkehr zum unterbrochenen Programm. Das erledigt die retirq Instruktion.
Sehr hilfreich bei der Fehlersuche war der Originalcode des PicoRV32 und das dazugehörige readme.md-File.
Next Steps…
Ich werde in den nächsten Wochen ein Redesign der Leiterplatte angehen. Dabei soll das Problem der Digitalisierung der Eingangssignale behoben und die Leiterplatte deutlich verkleinert werden, denn die vielen Testmöglichkeiten des Prototypen sind dann nicht mehr nötig.
Bis die Leiterplatte dann auf dem Tisch liegt, soll die PC-Software so angepasst werden, daß der Datenstrom analysiert und das Messergebnis im Smith-Diagramm dargestellt wird.
Dieser Beitrag beschreibt die Funktionsweise des Messgerätes etwas ausführlicher als bisher. Die Veröffentlichung des dazu implementierten Verilog-Codes und die Firmware für den im FPGA synthetisierten picoRV32 CPU-Core muß ich nochmal verschieben, obwohl beides gut und zuverlässig funktioniert. Es muss einfach noch etwas glattgezogen werden, es gibt zuviele quick-and-dirty Provisorien.
Das Blockdiagramm
Das nachfolgende Blockdiagramm zeigt den Aufbau des Boards und die wichtigsten Funktionen, die im FPGA implementiert sind. Das Board selbst wurde bereits vorher beschrieben: Gamma-Messgerät – Der echte erste Prototyp.
Principles of Operation
Die vor- und rücklaufenden Spannungen UF und UR werden vom Richtkoppler in das Gamma-Messgerät eingespeist. Die beiden Komparatoren erzeugen daraus jeweils ein Digitalsignal sig_F und sig_R, so dass idealerweise die positive Halbwelle „high“ und die negative Halbwelle „low“ generiert. Diese Signale werden im FPGA wie weiter unten beschrieben analysiert. Die logarithmischen Verstärker erzeugen eine pegelabhängige Spannung, die von dem 4‑Kanal 16-bit AD-Wandler digitalisiert wird. Die digitalen Werte werden über eine SPI-Schnittstelle in das FPGA eingelesen und dort von der CPU weiterverarbeitet.
Clock Domains
Die zur Messung notwendigen Taktfrequenzen werden von der PLL intern im FPGA erzeugt. Ihr Oszillator schwingt zwischen 800 MHz und 1,6 GHz. Durch Teilung kann daraus im Prinzip jede beliebige darunterliegende Arbeitsfrequenz erzeugt werden. Beim hier beschriebenen Prototypen läuft der Oszillator mit 800 MHz, aus dem durch Teilung die benötigten Taktfrequenzen generiert werden.
Die PLL wird mit clk_in stabilisiert, einem 50 MHz Quarzoszillator auf dem Tang Primer 25K Board. Die Abtastung und Auswertung der Eingangssignale erfolgt mit der steigenden Flanke von clk_s, dessen Frequenz fs im hier beschriebenen Prototypen auf 200 MHz eingestellt ist. Das reicht voll und ganz für Signale bis in das 4‑m-Band (~75 MHz), theoretisch sogar bis 100 MHz, aber nur, wenn die digitalisierten Signale symmetrisch sind. clk_cpu ist momentan auf fCPU = 40 MHz eingestellt, und wird wahrscheinlich in zukünftigen Versionen um Strom zu sparen deutlich reduziert, beispielsweise auf 10 MHz. clk_cpu taktet außer der CPU auch noch den Timer und die serielle Schnittstelle ATx inklusive dem eingebauten Baudrate Generator.
Messverfahren
Das Messverfahren ist im Grunde ziemlich trivial. Aus den gemessenen Pegeln der vorlaufenden und der reflektierten Spannung kann auf die bekannte klassische Art und Weise das Stehwellenverhältnis bestimmt werden. Für den komplexen Reflexionsfaktor Gamma (Γ) braucht es aber etwas mehr, nämlich die Kenntnis der Phasenverschiebung. Die wird digital im FPGA bestimmt.
Die Phasenmessung
sig_F und sig_R werden im Phasenkomparator PC exklusiv-verodert. Dessen Ausgang zeigt dann an, ob die Signale gleich (0) oder ungleich (1) sind. Dieses Ausgangssignal wird mit dem Takt clk_s abgetastet und ein Zähler wird inkrementiert, wenn es 1 ist, die Signale also ungleich sind. Am Ende des Messintervalls Tm wird dieser Zähler von der CPU ausgelesen. Wenn die Signale im gesamten Messintervall ungleich waren, ihre Phasenverschiebung also 180° beträgt, dann steht dieser Zähler auf z = fs * Tm, weil er bei jedem Takt von clk_s inkrementiert wurde. Bei exakt 0° Phasenverschiebung steht der Zähler auf null. Damit errechnet sich also die tatsächliche Phasenverschiebung ΔP zu:
[1]
Die Dauer des Messintervalls ist einstellbar und liegt typischerweise bei 10 ms bis 100 ms, was zwischen 100 und 10 Messungen pro Sekunde entspricht. Pro Messintervall werden also selbst auf dem 160-m-Band viele zehn- oder hunderttausend Zyklen des HF-Signals gemessen. Das HF-Signal ist nicht mit der Abtastfrequenz synchronisiert, daher beginnt und endet das Messintervall normalerweise an irgendeiner zufälligen Stelle des HF-Signals. Das führt zu einem Messfehler am Anfang und Ende des Zyklus, der aber wegen der großen Zahl gemessener HF-Zyklen vernachlässigbar ist. Zudem mittelt er sich über mehrere Messzyklen hinweg aus.
Der Flankendetektor
Die beschriebene Phasenmessung ist zweideutig, denn das Ergebnis ist bei positiver Phasenverschiebung gleich groß, wie bei negativer Verschiebung. Die Richtung der Phasenverschiebung muss also noch durch die Auswertung der Flanken der vor- und rücklaufenden Signale bestimmt werden. Dazu ist ein weiterer Zähler im FPGA implementiert, der inkrementiert wird, wenn das rücklaufende Signal sig_R bei steigender Flanke des vorlaufenden Signals sig_F 1 ist. Bei negativer Phasenverschiebung des rücklaufenden Signals steht dieser Zähler also idealerweise bei der Signalfrequenz fF, bei positiver Phasenverschiebung bei 0.
In der Nähe von 0° und 180° Phasenverschiebung ergeben sich Unsicherheiten bei dieser Messung, weil die eine Flanke mal vor und mal nach der anderen Flanke gemessen wird. Dadurch wird das Ergebnis aber nur wenig verfälscht, denn der Unterschied zwischen beispielsweise 178° und 182° oder 2° und 358° ist gering und liegt im Rahmen der Messgenauigkeit. Dennoch wurde ein weiterer Zähler gleichen Aufbaus implementiert, der inkrementiert wird, wenn das vorlaufende Signal sig_F bei steigender Flanke des rücklaufenden Signals sig_R 1 ist. Er hilft bei der Plausibilitätsprüfung der gefundenen Vorzeichens und er könnte zukünftig entfallen.
Die Frequenzzähler
Die bisher beschriebene Phasenmessung reicht, um die komplexe Impedanz der Last zu messen. Im Rahmen der Messgenauigkeit ist jeder Punkt im Smith-Diagramm bestimmbar. Das Ziel ist aber, ein passendes Anpassungsglied aus realen Spulen und Kondensatoren zu berechnen. Dazu wird die Frequenz benötigt.
Die Frequenzzähler sind trivial und bestehen nur aus jeweils einem 32-bit Zähler, mit dem die Anzahl der steigenden Flanken der Eingangssignale innerhalb des Messintervalls gezählt werden. Die CPU errechnet daraus die Signalfrequenz mit einer (unnötig hohen) Auflösung von 10 bis 100 Hz.
Die Frequenzmessung des rücklaufenden Signals erscheint zunächst unnötig, denn sie muss naturgemäß gleich der des vorlaufenden Signals sein. Je besser die Anpassung ist, je kleiner also das SWR ist, umso niedriger wird aber der Pegel der rücklaufenden Signals. Bei idealer Anpassung wird es null und die Frequenzmessung zeigt 0 Hz an. In der Firmware wird daher die Frequenz des rücklaufenden Signals mit der der vorlaufenden verglichen. Weicht sie signifikant ab, ist das ein Zeichen dafür, dass die Phasenmessung aufgrund unzureichender Rücklaufspannung ungenau oder unbrauchbar geworden ist.
Timer T1
Die RiscV CPU hat einen Timer, der aber leider zu simpel ist. Er generiert einen Interrupt nach einer einstellbaren Zeit und muss dann im Interrupt-Handler erneut gestartet werden. Das führt naturgemäß zu zeitlichen Abweichungen, die sich leider aufaddieren.
T1 ist ein einfacher zyklischer Timer, der Interrupts in einem einstellbaren Intervall generiert (z. Zt. 10 ms). Er startet automatisch ohne CPU-Aktion von vorne, wenn er abgelaufen ist. Die Interrupt-Antwortzeit ist daher unerheblich, alle Intervalle sind gleich lang.
Asynchroner Sender ATX
Die RiscV CPU hat bereits zwei eingebaute UARTs, eines am Wishbone-Bus und ein weiteres am Open-AHB-Bus. Beide sind leider unzureichend dokumentiert, insbesondere was das Generieren von Interrupts bei leerem Sendepuffer oder vollem Empfangspuffer angeht. Daher wurde hier ein eigenes kleines UART mit sehr reduzierter Funktionalität implementiert. Es kann nur senden und das auch nur mit 8‑bit, einem Stopbit und ohne Parität. Es ist also nur ein asynchroner Sender und wurde daher ATX (Asynchronous Transmitter; UART = Universal Asynchronous Receiver Transmitter) genannt. Aber er generiert einen Interrupt, wenn der Sendepuffer leer ist und so kann ein Datenstring ohne Pausen gesendet werden, ohne dass die CPU ständig des Zustand des Sendepuffers prüfen muss. Die Baudrate ist auf 115 kBd eingestellt.
Die ersten Messergebnisse der Digitalwandler waren zum Teil enttäuschend und konnten zumindest auf den ersten Blick nicht mit dem Datenblatt erklärt werden. Durch weitere genauere Messungen und intensivem Studium des Datenblattes habe ich nun die Ursache gefunden. Hier zunächst nochmal der beobachtete Effekt:
UFIP, UFIM und CLKUF bei 2 MHzUFIP, UFIM und CLKUF bei 2 MHz mit Cursoren
Beide Bilder zeigen die gleiche Messung, der Übersichtlichkeit halber einmal mit und einmal ohne Cursor. Die Messung erfolgte bei 2 MHz und sie zeigt die Komparatoreingänge UFIP (CH2, blau), UFIM (CH3, violett) und den Ausgang CLKUF (CH1, gelb). Es fällt auf, daß UFIM und damit die Referenz für die Umschaltung nach oben verschoben ist. UFIM sollte eigentlich auf der Mittellinie von UFIP liegen, also bei 1,7 V. Idealerweise sollte der Ausgang also bei steigendem UFIP bei 1,5 mV auf high gehen und auf der fallenden Seite bei ‑1,5 mV auf low. Wie die Messung zeigt, ist UFIM mit 1,732 V aber gut 30 mV zu hoch und auch die Hysterese ist mit 7 mV außerhalb der Spezifikation, die eigentlich maximal 5 mV erlaubt. Im Rahmen der Meßgenauigkeit würde ich die gemessene Hysterese aber im Moment nicht überbewerten.
Der vermaledeite Eingangsstrom
Als Ursache für den 30 mV Offset stellt sich der Input Bias Current von typisch 1 µA (max. 5 µA) heraus. Durch den 100 kΩ Vorwiderstand im Minus-Eingang des Komparators ergibt sich damit ein typischer Spannungsabfall von 100 mV. Figure 6–23 des Datenblatts ist sehr aufschlussreich:
TLV3601 Bias Current vs. Input Voltage, 3.3 V
Bei Zimmertemperatur und 1,7 V Eingangsspannung kann man nach dieser Grafik mit etwa 0,3 µA rechnen, was genau zu den beobachteten 30 mV Offset führt. Beim vorher verwendeten TLV3501 ist der typische input bias current übrigens mit typisch +/- 2 pA angegeben, also weniger als ein hunderttausenstel des jetzigen Wertes. Kein Wunder, daß das im ersten Board nicht aufgefallen ist.
Ist Abhilfe möglich?
Was kann man nun gegen diesen Bias Strom tun? Wenig, denn es ist eine spezifizierte Eigenschaft des Bausteins. Man kann aber die Auswirkung des Stromes begrenzen, indem man ihn kompensiert oder den Eingangswiderstand soweit verringert, daß der Fehler klein bleibt. Im beobachteten Fall bei Zimmertemperatur könnte man den Strom beispielsweise mit einem 4,7 MΩ Widerstand kompensieren, allerdings ändert sich der Strom mit der Temperatur und der Eingangsspannung.
Bleibt also eigentlich nur, den Eingangswiderstand zu verringern. Mit 10 kΩ Eingangswiderstand wäre der Offset schon auf 3 mV reduziert, was der Hysterese entspricht. Besser wäre allerdings eine weitere Reduktion möglichst nahe an 0 V, denn jeder Offset führt zu einer Asymmetrie im detektierten Ausgangssignal und damit zu einem Fehler in der Phasenmessung. Bei hohen Pegeln ist diese Asymmetrie vernachlässigbar, aber sie wird umso störender, je kleiner der Pegel wird.
Mit kleiner werdendem Eingangswiderstand steigt bei einem einfachen RC-Glied aber leider auch die Belastung des HF-Signals. Eigentlich bevorzuge ich für solche Anwendungen RC-Glieder, weil sie keine ungewollten Resonanzen aufzeigen. Vermutlich ist es in diesem Fall aber besser, einen geeigneten LC-Tiefpass zu verwenden, der bei Gleichspannung niederohmig ist und bei der Betriebsfrequenz hochohmig. Das sollte für den Kurzwellenbereich machbar sein.
Eine andere Lösung ist natürlich auch der Einsatz des TLV3501. Der ist nicht ganz so schnell, wie der TLV3601, aber für den geplanten Einsatzbereich völlig ausreichend.
Eine Nichtlinearität
Die Grafik aus dem Datenblatt zeigt noch ein weiteres mögliches Problem: bei 1,8 V Eingangsspannung passiert etwas Nichtlineares. Es ist daher wahrscheinlich angebracht, die Referenzsspannung etwas niedriger als die halbe Betriebsspannung zu legen. Im Moment sind zwei 100-kΩ-Widerstände implementiert, die die Referenzsspannung auf 3,3 V / 2 = 1,65 V festlegen. Bei einem Redesign werde ich da 100 bis 150 mV niedriger gehen.
Am Rande erwähnt sei noch, daß die gezeigte Messung mit einem Eingangspegel von ‑10 dBm durchgeführt wurde und die AC-Spannung an UFIP bei gerundet 48 mV liegt. Das sind knapp ‑13 dBm so daß die Dämpfung der aktuellen Eingangsbeschaltung also bei gut 3 dB liegt.
Die logarithmischen Verstärker
Die Spannungsversorgung der logarithmischen Verstärker habe ich nun per Drähtchen von 3,3 V auf 5,0 V erhöht. Außerdem habe ich die Dämpfung des Widerstandsnetzwerks am Eingang nochmal nachgerechnet: es sind 10,1 dB, nicht 6 dB wie im Schaltplan geschrieben. Der Fehler zieht sich schon lange durch, ich hab das leider nie in Frage gestellt. Einmal in einer schwachen Stunde falsch dimensioniert und nie geprüft, was ein Mist!
Jetzt stimmen auch die Messergebnisse mit dem Datenblatt überein:
Ausgangsspannung der logarithmischen Verstärker gegenüber dem Eingangspegel bei 10 MHz und 5 V Betriebsspannung
Da bewahrheitet sich wieder: kaum macht man’s richtig, schon geht’s!
Wie man sieht, ist der Betrieb zwischen ‑50 dBm bis 23 dBm problemlos möglich. Mit dem 10,1 dB Dämpfungsglied sollte es sogar bis 27 dBm funktionieren, aber mein Signalgenerator geht nur bis 23 dBm. Die Abweichung von der spezifizierten Ideallinie liegt jetzt auch innerhalb des erlaubten Bereichs. Kleine Abweichungen hinter dem Komma schiebe ich auf Messfehler meinerseits.
Wie geht’s weiter?
Die Hardware bleibt jetzt erst mal so. Manuelle Änderungen bei den eingesetzten 0402-Bauteilen machen keinen Spaß mehr. Zu beachten ist, daß die Phasenverschiebung mit dieser unveränderten Variante nur bei hoher Rücklaufleistung mit der gewünschten Präzision gemessen werden kann. Die vorherigen Messungen zeigen, daß bei 0 dBm die Welt noch einigermaßen in Ordnung ist. Bei einem Richtkoppler mit 30 dB Koppeldämpfung kommen bei 10 Watt (40 dBm) Abstimmleistung am Forward-Port noch 10 dBm an. Die Rücklaufleistung bleibt bei einem SWR über 2 bei mehr als 0 dBm. Die Phasenmessung sollte also bei 10 Watt und SWR > 2 hinreichend genau sein, darunter wird’s dann nach und nach schlechter. Die Messung des SWR mit den logarithmischen Verstärkern ist davon nicht betroffen.
Damit lässt sich erstmal weiterarbeiten, aber es soll natürlich nicht so bleiben.
Achja, nochwas
Bei den vielen Messungen, die ich gerade durchgeführt habe, musste ich immer wieder dBm in Leistung oder Spannung umrechnen. Das geht zwar inzwischen flott von der Hand, aber ich muß doch immer vom Basteltisch zum PC laufen, um die Werte zu berechnen (nutzt eigentlich noch jemand Taschenrechner?). Ich habe mir daher eine Tabelle angefertigt, sie doppelseitig auf DIN A4 ausgedruckt, laminiert und neben die Meßgeräte am Basteltisch gelegt. Bitteschön:
In einem Beitrag Anfang des Jahres hatte ich einen ersten Prototyp des Gamma-Messgerätes beschrieben. Das dort vorgestellte Board habe ich nie gefertigt, weil es mich selbst nicht richtig überzeugt hat. Ich bin inzwischen auf die Gowin FPGAs gestoßen, die auf den Tang Boards von Sipeed eingesetzt werden. Sie haben mich förmlich elektrisiert und das habe ich in einem ersten Beitrag auch schon beschrieben.
Der echte Prototyp
Das neue Design des Gamma-Messgerätes verwendet nun ein Tang Primer 25K Board mit einem Gowin GW5A-LV25MG121NC1/I0 FPGA. Fünf Leiterplatten, zwei davon bestückt, liegen seit einer Woche auf meinem Basteltisch und der einzige Fehler, den ich bisher gefunden habe ist, daß die grüne LED, die die Versorgungsspannung anzeigt, viel zu hell leuchtet. Damit kann man leben. In diesem Beitrag soll die Hardware und einige grundlegende Messungen beschrieben werden, ein weiterer Beitrag über die Software und den FPGA-RTL-Code wird folgen. Soviel schonmal hier: es läuft.
Tang Primer 25K
Nochmal zur Erinnerung: was ist ein Tang Primer 25K? Tang Primer 25K besteht aus einem Basis-Board und einem darauf aufgesteckten Core-Board.
Tang Primer 25K Core-Board
Das Tang Primer 25K Core-Board ist nur 23 mm x 18 mm groß und beinhaltet das oben genannte FPGA, einen seriellen FLASH-Speicher, einen 50 MHz Quarzoszillator und die notwendigen Spannungsregler.
Tang Primer 25K Core Board von oben, SMA-Buchse zum GrößenvergleichTang Primer 25K Core Board von unten, SMA-Buchse zum Größenvergleich
Beim Einschalten der Betriebsspannung wird automatisch die FPGA-Konfiguration und eventuell die Software für einen Mikroprozessor in das FPGA geladen. Dieses Core-Board wird über zwei jeweils 60-polige Subminiatur Steckverbinder aus der DF40-Serie von Hirose mit dem Tang 25K Basisboard oder einem selbst zu bauenden Applikationsboard verbunden.
Tang Primer 25K Basis-Board
Das Basis-Board stellt unter anderem eine USB-Schnittstelle zur Außenwelt und eine zweireihige 100-mil-Pfostenleiste zur Verfügung. Die Spannungsversorgung und die Kommunikation mit einem PC erfolgt über USB, mehr braucht man nicht für erste Versuche.
Tang Primer 25K Base Board mit aufgestecktem Core-Board
Leiterplatte zur Auswertung des Reflexionsfaktors Gamma von obenLeiterplatte zur Auswertung des Reflexionsfaktors Gamma von unten
Hier ist die Leiterplatte mit aufgestecktem Tang Primer 25K Core-Board zu sehen. Alternativ, bevorzugt zu Entwicklungszwecken, kann das Tang Primer 25K Basis-Board (hier nicht gezeigt) von unten in die Pfostenleiste eingesteckt werden. Auch die optionalen Bluetooth und USB-Module sind hier gezeigt. Statt BT oder USB kann auch die RS-485-Schnittstelle zur Kommunikation benutzt werden. Das komplette KiCad-Projekt kann hier zur freien Verfügung heruntergeladen werden:
Die vom Richtkoppler erfassten Vorlauf- und Rücklaufspannungen werden an die Ports J1 und J2 eingespeist. Das sind SMA Buchsen, die jeweils mit zwei parallelgeschalteten 105-Ω-Widerständen terminiert sind. Das ergibt nominal einen Widerstand von 52,5 Ω, aber mit den weiteren Eingangswiderständen sollten sich ziemlich genau die notwendigen 50 Ω ergeben. Die Messungen weiter unten zeigen, daß das nicht ganz hinkommt. Die beiden Widerstände haben die SMD Baugröße 2010 und können jeweils 500 mW vertragen, zusammen als 1 W. Damit kann ein Richtkoppler mit 30 dB Koppeldämpfung zumindest theoretisch an einen 1‑kW-Sender angeschlossen werden. Auf jeden Fall bleibt eine hinreichende Sicherheitsmarge zu den 100 W, die mein IC-7300 liefern kann.
Pegelwandlung
Zur Wandlung der Vorlauf- und Rücklaufpegel wird jeweils ein Klassiker eingesetzt, ein logarithmischer Verstärker vom Typ AD8307A (U1 und U2). Er liefert an seinem Ausgang eine Spannung, die den Eingangspegel logarithmisch abbildet, also proportional zum Eingangspegel in dBm ist. Den logarithmischen Verstärkern ist noch ein 6 dB Dämpfungsglied vorgeschaltet, das mit 3 dB Reserve für einen 100-W-Sender dimensioniert ist, denn der AD8307A verträgt maximal 17 dBm an seinem Eingang. Für größere Leistungen müssen diese Dämpfungsglieder also anders dimensioniert werden.
Analog-Digital Wandler ADS1118
Die Ausgänge der logarithmischen Verstärker sind über RC-Tiefpässe auf die Analogeingänge des 16-bit AD-Konverters ADS1118 U3 geschaltet. Der hat einen vierfachen Eingangsmultiplexer und kann zusätzlich als fünften Kanal noch die Temperatur messen. Er kann knapp 1000 Messungen pro Sekunde ausführen, was für die beabsichtige Messperiode von 10 ms mehr als ausreichend ist. Für die ersten Versuche habe ich ihn auf 128 SPS (samples per second) gedrosselt, was der Messgenauigkeit zugute kommt. Die Beschaltung ist einfach, weil die Referenzspannung intern erzeugt wird. Die Datenübertragung erfolgt seriell über eine SPI-Schnittstelle und so passt er bequem in ein kleines 10-Pin-Gehäuse. Wie im Datenblatt empfohlen, sind jeweils 33-Ω-Widerstände seriell in die Übertragungsleistungen geschaltet. Die ansonsten unbenutzten Analogeingänge AIN0 und AIN1 messen die Versorgungsspannung VIN und VDD033.
Digitalisierung der HF-Signale
Im FPGA soll die Phasenverschiebung zwischen vor- und rücklaufendem Signal gemessen werden, denn aus den Pegeln kann man nur das Stehwellenverhältnis, aber nicht den komplexen Reflexionsfaktor Gamma errechnen. Zur digitalen Weiterverarbeitung der HF-Signale im FPGA müssen sie also digitalisiert werden.
Wie im ersten PoC-Board werden dazu auch hier wieder schnelle Komparatoren benötigt. Statt der dort verwendeten TLV3501 wurde jetzt aber die schnellere Variante TLV3601 eingesetzt, die mit 325 MHz Schaltfrequenz und 2,5 ns Verzögerung spezifiziert ist. Die vorherige Schaltung wurde im wesentlichen beibehalten. Die Kapazität der Koppelkondensatoren C10 und C11 wurde von 1 nF auf 100 nF erhöht um ein besseres Verhalten bei niedrigen Frequenzen sicherzustellen. Außerdem wurden Doppelschottkydioden des Typs BAS70-04 zum Kappen eventueller Spannungsspitzen vorgesehen. Falls tatsächlich 1 W am Eingang anliegt, hat man eine Spitzenspannung von 10 V, die den zulässigen Eingangspegel der Komparatoren übersteigt. Diese Dioden wären übrigens laut Datenblatt verzichtbar, wenn der Eingangsstrom auf 10 mA limitiert wird. Dazu müssten aber die Widerstände R24 und R26 auf knapp 1 kΩ erhöht werden.
Das Prinzip der Digitalisierung ist übrigens ziemlich banal. Die Spannungsteiler aus zwei 100-kΩ-Widerständen ziehen den Gleichspannungspegel auf die Mitte der Versorgungsspannung. Dieser Pegel liegt über einem 100-kΩ/10-nF-Tiefpass am negativen Eingang des Komparators an. Damit wird der HF-Anteil der Eingangssignale weitgehend unterdrückt. Praktisch ungedämpft gelangt die HF aber an den positiven Eingang und schaltet den Ausgang des Komparators ein oder aus.
Die Eingangshysterese ist mit typisch 3 mV angegeben (min. 1,5 mV, max. 5 mV). Das bedeutet, daß das positive Signal mindestens um diese Hysterese vom negativen Eingangssignal abweichen muß, damit der Ausgang umschaltet. Das führt zu Messfehlern, die sich bei gleich großen vor- und rücklaufenden Signalpegeln und gleichen Eigenschaften der beiden Komparatoren aufheben. Der Fehler wird aber größer, wenn einer der Pegel sehr niedrig ist oder die Exemplarstreuung zwischen beiden Komparatoren groß ist. Gerade bei guter Anpassung, also geringer Rücklaufspannung, wird damit die Phasenverschiebung nur noch schwer oder überhaupt nicht mehr messbar.
Damit kann man eine Abschätzung über die zu erwartende Empfindlichkeit machen. Fällt Vp unter 5 mV, kann man keine sichere Erkennung des Signals mehr erwarten. Das ist eine Effektivspannung von etwa 3,5 mV, also etwa ‑36 dBm. Eine auch nur halbwegs präzise Messung der Phasenverschiebung benötigt ein stärkeres Signal.
Die Kommunikationsschnittstellen
Zur Kommunikation mit der Außenwelt sind drei alternative serielle Schnittstellen vorgesehen. Für meine Projekte im Außenbereich verwende ich sehr gerne eine RS-485-Schnittstelle mit Fernspeisung der Geräte über bis zu 40 V‑Gleichspannung (aktuell 32 V). Dieser Bus wird über J3 angeschlossen und die Versorgungsspannung mit U4 auf 5 V stabilisiert. U10 ist das zugehörige physikalische Interface. Alternativ kann auf den Sockel U9 ein Bluetooth-Modul aufgesteckt werden oder auf U8 ein RS232-USB-Konverter. In der aktuellen Entwicklungsphase am PC ist der RS232-USB-Konverter die ideale Wahl.
Das Tang Primer FPGA-Board
Auf die Buchsenleiste J16 auf der Unterseite kann das Tang Primer 25K Basis-Board direkt aufgesteckt werden. Für die Entwicklungsphase ist das sehr praktisch, denn es bringt die Programmierschnittstelle zum PC und die Spannungsversorgung direkt mit. Man kann in wenigen Sekunden den FPGA-Code per USB in den Prototypen laden.
Das Tang Primer 25K Core-Board kann alternativ (nicht gleichzeitig!) in J11 und J13 auf der Oberseite eingesteckt werden. Ein zukünftiges Applikationsboard wird nur noch ein Core-Board unterstützen, nicht das Basis-Board.
Die Spannungsversorgung
Alle Komponenten des Prototypen werden mit 3,3 V versorgt. Diese Spannung wird mit dem Linearregler U7 aus 5 V (VDD050) erzeugt. Als Quelle für VDD050 kann über einen Jumper auf der Stiftleiste J4 entweder das Basis-Board (VINDOCK), das USB-Modul (VINUSB) oder der eigene Spannungswandler ausgewählt werden.
Testpins
Der hier gezeigte Prototyp hat zu Mess- und Entwicklungszwecken einige Testpins, Taster und LEDs die auf einem späteren Applikationsboard entfallen werden. J12, J15 und J17 sind frei verwendbare Stiftleisten, die an FPGA-Pins angeschlossen sind. Bei ihnen ist jeweils der dem Signal gegenüberliegende Pin an GND angeschlossen. Da lässt sich jeweils sehr bequem ein Eingangskanal eines Logikanalysators anschließen. J12 war ursprünglich ein vierfach DIP-Schalter, daher die Bezeichnungen DSW[1..4]. Hier können Jumper aufgesteckt werden oder alternativ weitere Kanäle eines Logikanalysators.
MMCX Koax-Steckverbinder
Außer den genannten Testpins sind eine handvoll weibliche 50-Ω-MMCX-Sockel zum Anschluß eines Oszilloskops oder eines Spektrumanalysators vorgesehen. Sie bieten eine bessere Signalqualität als die üblichen Probes, die immer deutliche Überschwinger wegen der unvermeidlichen Induktivitäten des Masseanschlusses zeigen. Da sie allerdings mit 50-Ω-Koaxkabeln angeschlossen werden, müssen sie im Oszilloskop auch mit 50 Ω terminiert werden. Das ist in vielen Fällen zu niederohmig, so daß Serienwiderstände von 450 Ω oder 4950 Ω vorgeschaltet wurden. Zusammen mit der Terminierung ergibt sich damit ein Spannungsteiler von 10:1 oder 100:1. Auch im 100:1‑Fall bleibt eine mittelohmige Last von 5 kΩ, was für manche Fälle noch zu niedrig ist. Messergebnisse für das 10:1‑Port TO2 sind weiter unten gezeigt.
Die Werte der hier implementierten Widerstandsnetzwerke sind rein praktischer Natur: „basic parts“ beim Leiterplattenhersteller sind immer auf dem Bestückungsautomaten verfügbar und kosten nichts (einige „millicent“), „extended parts“, die manuell in den Automaten eingelegt werden müssen, kosten einmalig 3 €. Gerade bei geringen Leiterplatten-Stückzahlen nimmt man also am besten das, was ohnehin da ist.
Messergebnisse
In diesem Abschnitt werden die Messergebnisse gezeigt, die mit einem Netzwerkanalysator bzw. einem Signalgenerator an den HF-Eingängen erzielt wurden. Es soll der nutzbare Eingangsfrequenz- und Eingangsspannungsbereich ermittelt werden.
Messung der Eingangsimpedanzen
Zunächst soll die Eingangsimpedanz über den Betriebsfrequenzbereich und etwas darüber hinaus gemessen werden. Hier die beiden Messungen zwischen 100 kHz und 150 MHz:
Reflexion, reelle Impedanz und Stehwellenverhältnis am Forward-PortReflexion, reelle Impedanz und Stehwellenverhältnis am Reflected-Port
Das Verhalten beider Ports ist praktisch gleich. Sie verhalten sich erwartungsgemäß leicht kapazitiv. Am Ende des Kurzwellenbereichs bei 30 MHz wird der Realanteil der Impedanz ziemlich genau 50 Ω. Das SWR bleibt bis 50 MHz unter 1,2. Natürlich kann man immer bestrebt sein, die Werte weiter zu verbessern, aber für meine Amateurzwecke bin ich damit zufrieden.
Bei einem Redesign werde ich trotzdem noch etwas feilen. Da bieten sich zunächst die Eingangswiderstände an. Bei 1 MHz zeigt sich ziemlich genau die reelle Impedanz der parallelgeschalteten Widerstände von 2 * 105 Ω und 3.2 kΩ von etwa 51,5 Ω. Die beiden 6‑dB-Dämpfungsglieder sollten also besser auf nominal 1050 Ω reduziert werden. Die Messung zeigt außerdem, daß eine kapazitive Last von 10 bis 12 pF an den Ports anliegt. Sie wird sicherlich zum Teil von der Kapazität der Pads gegen die direkt darunterliegende Massefläche verursacht. Die kann man bei einem neuen Design an den Stellen weglassen und so ein paar pF gewinnen.
Messung der logarithmischen Verstärker
Diese Messungen sollen klären, in welchem Frequenz- und Eingangspegelbereich die Digitalwandlung zuverlässig funktioniert und innerhalb welcher Grenzen mit welchen Messfehlern gerechnet werden muß. Außerdem soll gezeigt werden, ob es eine Abweichung der Phasenlage beider Kanäle gibt und falls ja, wie groß sie ist.
Wie beim allerersten PoC-Board sollen die Messungen exemplarisch bei 10 MHz und Eingangspegeln zwischen ‑70 dBm und +23 dBm gemessen werden. Hier das Ergebnis:
Ausgangsspannung der logarithmischen Verstärker gegenüber dem Eingangspegel bei 10 MHz
Das sieht in einem weiten Bereich sehr schön linear aus und wie beim PoC-Board ist auch hier wieder eine konstante Abweichung von der Ideallinie um ‑2 bzw. ‑4 dB zu sehen. LOGUR überschreitet damit den im Datenblatt spezifizierten Bereich von 3 dB um etwa 1 dB. Die Ursache mag ein Fehler meinerseits beim Layout sein, er beunruhigt mich aber nicht, denn gerade weil die Kurven so schön linear sind, lässt sich der Fehler leicht per Software korrigieren.
Beunruhigend ist aber das Abknicken der Kurven bei Eingangspegeln über 0 dBm. Das ist ein krasser Unterschied zum PoC-Board und die Ursache kann nur der jetzige Betrieb mit 3,3 V sein, während das vorherige Board mit 5 V betrieben wurde. Irgendwas geht irgendwo in die Sättigung. Zwar ist der nutzbare Dynamikbereich immer noch etwa 50 dB, aber das soll ohne Not so nicht bleiben. Auch beim Betrieb mit 5 V steigt die Ausgangsspannung nicht über etwa 2,5 V an, was immer noch sehr deutlich im gesunden Betriebsbereich des AD-Wandlers liegt. Da ein zukünftiges Board wegen des Tang Core-Boards sowieso mit 5 V betrieben werden soll, gibt es überhaupt keinen Grund, die LogAmps nicht auch mit 5 V zu betreiben. Es sollte sogar relativ einfach sein, den jetzigen Prototypen entsprechend zu korrigieren.
Messung der Digitalwandler
Hier wird gemessen, wie genau die Ausgangsspannungen der logarithmischen Verstärker den Eingangspegel abbilden und wie sie voneinander abweichen. Auch hier soll zunächst nur bei 10 MHz gemessen werden, Messungen bei anderen Frequenzen müssen folgen.
Zur Erläuterung der Messmethode folgt die Darstellung einer Messung mit Eingangspegeln von jeweils 0 dBm und ohne Phasenverschiebung der beiden Signale:
CH1 zeigt CLKUF, die digitalisierte vorlaufende Spannung, CH2 zeigt CLKUR, die digitalisierte rücklaufende Spannung. CH3 und CH4 zeigen LOGUF und LOGUR, die Ausgangsspannungen der logarithmischen Verstärker. In der rechten „Result“-Spalte wird die gemessene Taktfrequenz von CH2/CLKUR angezeigt. Solange das Signal eindeutig erkannt wird, muß diese Frequenz identisch mit der von CLKUF sein, hier also 10 MHz. Die Felder darunter zeigen die aktuelle und gemittelte Ausgangsspannung der logarithmischen Verstärker an. Sie wurden für die im vorigen Abschnitt gezeigten Messungen verwendet. Das unterste Feld zeigt schließlich die Phasenverschiebung der beiden steigenden Flanken an.
Die folgenden Bilder zeigen weitere Messungen bei 180°, +90° und ‑90° Phasenverschiebung und Eingangspegeln von +10 dBm bzw. 0 dBm:
Jetzt kommen die spannendsten Messungen, nämlich die über den Dynamikbereich, die zeigen, bei welchem Pegel das Signal zuverlässig erfasst wird:
Kurz zusammengefasst: bei ‑19 dBm wird das Signal noch zuverlässig erkannt, bei ‑20 dBm nicht mehr. Das sieht man nicht nur am Signalverlauf, sondern sehr eindrücklich an der Frequenzanzeige. Der Frequenzzähler erkennt nicht mehr jeden Puls. Bei noch niedrigeren Pegeln wird UR überhaupt nicht mehr erkannt und eine Phasenmessung ist dann nicht mehr möglich. Das liegt leider deutlich über den oben abgeschätzten ‑36 dBm. Da muß ich nochmal nach dem Fehler suchen und vielleicht das Datenblatt nochmal studieren.
Schon bei ‑10 dBm wird das rücklaufende Signal deutlich asymmetrisch. Offensichtlich wird die positive Flanke erst deutlich nach dem Nulldurchgang erkannt und die negative Flanke bereits deutlich davor. Auch hier muß ich der Ursache noch auf den Grund gehen. Ich hoffe, daß sich das im FPGA oder in der Software kompensieren lässt.
MMCX Testport im Vergleich zu einfachen Testpins
Hier wird das Oszillogramm eines 50-Ω-MMCX-Testports dem eines klassischen hochohmigen Oszilloskop-Tastkopfes an einem Testpin gegenübergestellt.
Das Tang Core-Board hat einen 50 MHz Oszillator, der als Frequenzbasis für die im FPGA eingebaute PLL benutzt wird. In der jetzigen Entwicklungsphase werden intern 200 MHz für den Phasendetektor benötigt und 40 MHz für die RISC-V-CPU. Dazu wird der interne Oszillator mit 800 MHz betrieben, woraus durch Teilung die benötigten Frequenzen erzeugt werden.
In beiden Fällen wurde das aus der PLL abgeleitete CPUCLK Signal von 40 MHz ausgegeben. CH1 (oben in gelb) ist mit einem hochohmigen 10:1 Tastkopf an der Stiftleiste TB5 angeschlossen, CH4 (unten in blau) ist über ein 2 m langes RG316 Koaxkabel am MMCX Testport TO2 angeschlossen. CH2 ist im Oszilloskop mit 50 Ω terminiert und ebenfalls auf 10:1 eingestellt, denn der Quellwiderstand hat 450 Ω. Beide FPGA-Ausgänge sind auf 8 mA konfiguriert und die hochohmige Probe ist korrekt kompensiert. Hinweis: man beachte die unterschiedliche vertikale Auflösung von 1 V bzw. 2 V. Das Oszilloskop wurde im „infinite persistance“ Modus betrieben, das bedeutet, daß alle Messungen innerhalb des Messintervalls überlagert dargestellt werden. Es fällt auf, daß das MMCX-Signal um knapp 2 ns verzögert ist. Das ist mit dem etwa 50 cm längeren Messkabel an CH4 gut erklärbar.
Der MMCX-Port zeigt ein deutlich saubereres Signal. Die Kanten sind etwas abgeschliffen, was sicherlich an der relativ hohen Belastung von knapp 7 mA liegt. Das Signal an dem hochohmigen Tastkopf zeigt deutliche Überschwinger und langsamere Flanken. Außerdem variiert es stärker, es wird durch „infinite persistance“ verschwommener dargestellt. Das zeigt, daß es sich lohnen kann, bei kritischen Signalen einen Koax-Testanschluß vorzusehen, soweit die Belastung das zulässt.
Messung der PLL des FPGAs
Da die Messung für das MMCX-Port gerade aufgebaut ist, soll auch noch das erzeugte Frequenzspektrum mit einem Spektrumanalysator insbesondere auf seine Seitenbänder untersucht werden. TO2 wird also mit demselben Messkabel wie oben an einen Spektrumanalysator angeschlossen.
Breitbandspektrum des 40 MHz Oszillators bis 1 GHzSpektrum des 40 MHz Oszillators über 5 MHzSpektrum des 40 MHz Oszillators über 1 MHzSpektrum des 40 MHz Oszillators über 1 kHz
Im Breitbandspektrum sieht man erwartungsgemäß deutlich die ungeradzahligen Oberwellen, denn das gemessene Signal ist wie oben gezeigt ein Rechtecksignal. Die schmalbandigeren Messungen zeigen Seitenbandsignale im Abstand von etwa 120 kHz, die von der Phasenregelung der PLL erzeugt werden. Die Schmalbandmessung mit 1 kHz Spannbreite und 10 Hz RBW zeigt keine Auffälligkeiten. Im Rahmen dessen, was mein Spektrumanalysator an Seitenbandrauschen überhaupt messen kann, sieht das gut aus.
Das Spektrum des Oszillators kann optional mit einem Spread Spectrum Controller verbreitert werden. Die Versuche hebe ich mir für später auf.
Wie geht’s weiter?
In den nächsten Tagen muß ich die hier gefundenen Auffälligkeiten klären, besonders die Digitalisierung mit den Komparatoren. Die ist unbefriedigend. Ich werde berichten…
Außerdem muß ich den Verilog-Code für das FPGA und die Testsoftware noch etwas verfeinern. Das wird sich vermutlich bis in das nächste Jahr hinziehen.
Es geht langsam auf den Winter zu und meine Langdrahtantenne benötigt einen Update. Beim Aufbau vor zwei Jahren hatte ich den dummen Anfängerfehler begangen, zum Abspannen des Fiberglas-Mastes und des Antennendrahts die billigen Polypropylen Schnüre aus Discounter-Sonderangeboten zu verwenden. Sie werden zwar als wetterfest und UV-fest angepriesen, sind es aber nicht. Da ich auch mit den gefrästen Rollen und Mastklemmen nicht so vollends zufrieden bin, werden sie auch gleich durch neue 3D-gedruckte Varianten ersetzt. Die neuen Rollen verhindern zuverlässig das Entgleisen des Antennendrahtes und sie sind mit ihrem Halter horizontal drehbar, so daß sie der Richtung der Zugkraft der Antennenaufhängung folgen. Die neuen Mastklemmen mit ihren Flügelschrauben können nun ohne weiteres Werkzeug komplett vom Mastelement gelöst werden. Eine Beschreibung dieser neuen 3D-Teile findet sich hier.
Der Status quo ante
Die bisherige Antenne ist hier nochmal dargestellt:
Tatsächliche Dimensionierung der gefalteten Langdrahtantenne
Der linke Arm zeigt ziemlich genau nach Süden, der rechte nach Norden. Die nachfolgend beschriebenen Änderungen betreffen ausschließlich die Nordseite. Tuner und Balun sind am geerdeten Antennenmast befestigt und das Metallgehäuse des Tuners ist geerdet. Da der aktuelle Tuner nicht symmetrisch ist, ergab sich das Problem, daß der nördliche Teil des dezentral gespeisten Dipols nicht angeschlossen werden konnte. Er war also bislang unbenutzt und der südliche Arm ist damit zu einer endgespeisten Langdrahtantenne mit dem Antennenmast als Gegengewicht geworden. Die Umbaumaßnahmen habe ich genutzt, um nochmal die Impedanz gegenüber dem Antennenmast zu messen. Hier das SWR mal mit und der besseren Übersichtlichkeit halber mal ohne das Smith Diagramm:
SWR alt, 12,00m LängeSWR alt, 12,00m Länge
Man sieht, daß sich Resonanzen bei 6 MHz, 9,3 MHz, 18,5 MHz, 30,6 MHz und 55,1 MHz ergeben, bei denen das SWR besser als 3 oder zumindest nicht wesentlich schlechter ist. Die Resonanzen waren für die angrenzenden Amateurfunkbänder also etwas zu hoch.
Der Status quo
Ein etwas längerer Draht sollte Abhilfe schaffen. Daher habe ich den 12-m-Draht durch einen von 13 m Länge ersetzt, den ich dann sukzessive auf letztendlich 12,75 m gekürzt habe. Damit ergeben sich folgende Stehwellenverhältnisse:
SWR neu, 12,75m LängeSWR neu, 12,75m Länge
Die Marker zeigen die Grenzen für ein SWR kleiner als 3. Das ist der Bereich, den der eingebaute Tuner im IC7300 anpassen kann und das sind folgende Bereiche:
5,1 bis 6,2 MHz (60 m) 17,4 bis 17,9 MHz (17 m) 28,5 bis 28,9 MHz (10 m)
Dieser neue Antennendraht deckt damit das 60-m-Band, das 17-m-Band und einen Teil des 10-m-Bandes ab. Auf 60 m ist es ein λ/4‑Strahler, auf 17 m ein 3λ/4‑Strahler und auf 10 m ein 5λ/4‑Strahler. Bei 51,2 MHz (9λ/4) ist noch eine Resonanz zu erkennen, die mit einem SWR von 3,6 aber außerhalb des Abstimmbereichs des IC7300 liegt.
Bekanntlich verbessert sich das Stehwellenverhältnis, wenn man ein verlustbehaftetes Kabel (vornehmer ausgedrückt: ein Dämpfungsglied) zwischen Transceiver und Antenne anschließt. Also führe ich dieselbe Messung nochmal im Shack aus, von wo aus insgesamt ungefähr 15 m Koaxkabel (halb RG213 und halb RG58) und ein Antennenumschalter dazwischenliegen. Hier das Meßergebnis:
SWR zwischen 0,1 und 60 MHz gemessen im Shack60-m-SWR gemessen im Shack17-m-SWR gemessen im Shack10-m-SWR gemessen im Shack6‑m-SWR gemessen im Shack4‑m-SWR gemessen im Shack
Das SWR im 6‑m-Band ist nun auf 2,4 geschrumpft und so gelingt dem Tuner auch auf 6 m eine Anpassung. Nicht vergessen: dieses SWR ist dem zwischengeschalteten Dämpfungsglied geschuldet und daher kein uneingeschränkter Quell der Freude. Aber immerhin, man kann auf dem Band arbeiten. Außerdem sind die Stehwellenverhältnisse gezoomt auf die jeweiligen Bandgrenzen angezeigt. Das 10-m-Band wird nicht komplett abgedeckt, es fehlen die unteren 200 kHz und das 4‑m-Band leider garnicht.
Der praktische Aufbau
Zum Anschluß der Antenne habe ich ein wetterfestes und möglichst wasserdichtes Gehäuse entworfen und mit ASA-Filament gedruckt. Für den Antennendraht und den Erdanschluß sind M8er Kabelverschraubungen verwendet, die Drähte von 2 mm bis 3 mm wasserdicht in das Gehäuse führen können. Die SO239 Buchse ist zur Einschraubmontage vorgesehen und sie hat bereits eine Gummidichtung im Lieferumfang. Außerdem hat sie ein vormontiertes RG174 Koax-Kabel und auf der Gegenseite einen SMA-Stecker. Das Gehäusedesign ist hier beschrieben.
Zum Anschluß gibt es eine kleine gefräste und mit KiCad erstellte Leiterplatte. Die Schaltung ist trivial:
J1 ist die SMA-Eingangsbuchse und J2 ist eine Wago-Klemme Typ 2604–3102 mit zwei Anschlüssen für Drähte bis 3,5 mm². GD1 ist eine Gasentladungsröhre, die bei 600 V zündet und eventuelle Überspannungen z.B. durch nahende Gewitter kurzschließt. R1 ist ein hochohmiger Widerstand, der statische Aufladungen der Antenne verhindert.
R1 ist ein SMD-Widerstand im 2512er Gehäuse und er ist auf der Unterseite aufgelötet. Das 3D-Modell der Wago-Klemme ist zwar maßstabsgerecht, aber quick-and-dirty ohne Details gezeichnet. Hier das KiCad-Projekt:
Zum Schluß noch ein paar Fotos vom fertigen Aufbau:
Antennenanschlußdose
Die Anschlußdose ist mit den passend 3D-gedruckten Mastklemmen am Mast befestigt.
Antennenaufhängung
Dieses Foto zeigt rechts etwas unscharf, wie der Antennendraht befestigt ist. Ein Halteseil ist mit einer Seilklemme etwa 1 m vor dem Ende des Antennendrahtes angeschraubt. Dieses Halteseil trägt den Antennendraht, der dann ohne Zugkraft in der Antennendose angeklemmt ist. Eine gleichartige Konstruktion etwa 2 m tiefer hält das andere Ende der Antenne, dort aber mit einer Spannvorrichtung.
Antennenanschlußdose mit aufgeschraubtem Deckel
Anlässlich meiner Überlegungen zur Messung des komplexen Reflexionsfaktors oder allgemeiner eines Gamma-Messgerätes hatte ich mich auf die Suche nach aktuellen CPLDs oder FPGAs begeben, die heutzutage für Amateurbudgets in Einzelstückzahlen erhältlich sind. Da man dafür sowieso nicht besonders viele Pins braucht, wäre ein weiterer Wunsch, ein kleines QFP-Gehäuse, das man möglichst noch von Hand löten kann. Ein 44- oder 64-Pin QFP mit 0,65 mm Pin-Pitch, notfalls 0,5 mm, wäre also bevorzugt. Am nächsten kam dem ein 5M160ZE64 von Altera, die inzwischen wieder von Intel geschieden sind. Es hat aber 0,4 mm Pinabstand und das traue ich mir nicht mehr zu, von Hand zuverlässig zu löten.
Bei dieser Suche stieß ich auf FPGAs der chinesischen Firma Gowin, die mir sehr interessant erschienen. Die ebenfalls chinesische Firma Sipeed setzt diese FPGA auf ihren Tang-Boards ein, die zu sehr günstigen Preisen über die bekannten Plattformen gekauft werden können.
Die benötigten Entwicklungswerkzeuge für die Software- und FPGA-Entwicklung sind kostenlos von der Gowin-Website herunterzuladen. Sowohl diese Werkzeuge wie auch die Datenblätter der Bauteile sind absolut „State-of-the-Art“, geschrieben oder gegengelesen und korrigiert von englischen Muttersprachlern. Kein Vergleich zu dem, was vor 40 Jahren aus Japan kam. Die Software-Tools basieren auf Eclipse und die FPGA-Tools sind selbst geschrieben. Wer schonmal mit Quartus gearbeitet hat, wird sich schnell zurechtfinden.
Die SW-Tools setzen auf den GNU-Tools auf und unterstützen sowohl den ARM Cortex als auch die RISC‑V Architektur. Die FPGA-Tools unterstützen Verilog 95, Verilog 2001, System-Verilog 2017 und VHDL.
Ich habe mir die genannten Entwicklungswerkzeuge installiert und zwei Tang Nano 4K-Boards, ein Tang Primer 25K Dock Base Board (enthält ein Core Board) und dazu ein weiteres Core Board besorgt und damit ein paar Wochen herumgespielt.
Zum Einstieg will ich nachfolgend kurz meine Erfahrungen beschreiben. Wer selber einsteigen will, wird nicht an der Original-Dokumentation der oben verlinkten Seiten vorbeikommen. Zur Einarbeitung wird auch je nach Vorkenntnissen ein gewisser Zeitaufwand notwendig sein, den ich niemandem abnehmen kann.
Tang Nano 4K
Tang Nano 4K ist ein Board der Größe 60 mm x 22,86 mm, das als zentralen Chip den GW1NSR-LV4C einsetzt.
Tang Nano 4K auf einem Steckbrett
Das Board ist offensichtlich ursprünglich für Grafikanwendungen entwickelt worden, denn es hat sowohl einen HDMI-Anschluß für einen Monitor als auch ein DVP-Interface zum Anschluß einer Kamera. Außerdem hat es einen 32 MBit Flash-Speicher und ein USB-Interface sowie zwei Taster und eine LED. Viele Signale des GW1NSR-LV4C sind auf eine der beiden 22-poligen Stiftleisten herausgeführt, man muß aber stets darauf achten, daß sie nicht schon anderweitig für die Kamera oder den Monitor benutzt sind. Außerdem haben sie unterschiedliche Signalpegel, mal 1,8 V, mal 2,5 V und mal 3,3 V. Das schränkt die Anwendungsfälle erheblich ein, aber als Starterboard zum Einarbeiten in die Entwicklungswerkzeuge ist es dennoch sehr hilfreich.
Tang Nano 4K ist ohne Kamera für etwa 15 Euro und inklusive HDMI Kamera für etwa 20 Euro über Aliexpress zu beziehen. Wem das zu teuer ist, der kann sich auch den Tang Nano 1K mal anschauen, der etwa 8 Euro kostet.
GW1NSR-LV4C
Der GW1NSR-LV4C ist der zentrale Chip auf dem Tang Nano 4K-Board. Er hat als Hard-Core einen ARM Cortex-M3 an Bord (80 MHz max), sowie ein FPGA mit 4608 LUT4 Zellen. Das sind „look-up Tabellen“ mit jeweils vier Eingängen und einem Ausgang. Sie können vier Eingangssignale in beliebiger Weise verknüpfen und daraus das Ausgangssignal erzeugen. Für weitere Details der Architektur konsultiere man das Datenblatt. Allerdings ist die interne Architektur für den Anwender transparent. Man muß nicht unbedingt wissen, wie der Chip intern funktioniert, die Tools übernehmen das sozusagen auf Knopfdruck.
Weitere interessante Baugruppen auf dem Chip sind 180 kBit SRAM, 256 kBit Flash-Speicher, 64 MBit PSRAM, 64 MBit HyperRAM und 32 MBit NOR Flash. Außerdem hat er 16 18 bit x 18 bit Multiplizierer, zwei PLLs (clkout 480 MHz max) und zwei DLLs eingebaut, sowie einen Oszillator (125 MHz typ.) mit +/-5% Toleranz. Die vier I/O‑Bänke können jeweils mit Spannungen zwischen 1,2 V und 3,3 V betrieben werden.
Hier ein Foto mit angeschlossenem Logikanalysator für Testzwecke.
Tang Nano 4K mit angeschlossenem USB-Logikanalysator
Die Kommunikation mit dem PC erfolgt über die USB-Buchse auf der rechten Seite, die gleichzeitig die Spannungsversorgung des Boards bereitstellt.
Tang Primer 25K
Viel interessanter als der Tang Nano ist für mich der Tang Primer 25K. Dabei handelt es sich um zwei separate Leiterplatten, das „Dock Base Board“ und das aufgesteckte „Core Board“. Das Core Board enthält das eigentliche FPGA vom Typ GW5A-LV25MG121NC1/I0, einen 50 MHz Quarzoszillator, die Spannungsversorgung und ein 64 MBit NOR-Flash zum Speichern des FPGA-Inhalts inklusive gegebenenfalls des Codes für eine im FPGA implementierte Softcore-CPU. Auch die Tang Primer Boards sind über Aliexpress bestellbar. Der aktuelle Preis (2025) liegt bei etwa 20 Euro für das Core-Board und bei etwa 30 Euro für das Basisboard inklusive einem Core-Board.
Tang Primer 25K Core-Board
Das Core-Board hat eine Größe von nur 23 mm x 18 mm. Hier ein Größenvergleich mit einer SMA-Buchse:
Tang Primer 25K Core Board von oben, SMA-Buchse zum GrößenvergleichTang Primer 25K Core Board von unten, SMA-Buchse zum Größenvergleich
Die Verbindung mit dem Basisboard oder einem selbst zu bauenden Applikationsboard erfolgt über zwei jeweils 60-polige Subminiatur Steckverbinder aus der DF40-Serie von Hirose. Sie haben einen Pinabstand von 0,4 mm und damit ist ein zuverlässiges „Selberlöten“ nicht mehr möglich. Man wird also auf einen Bestücker zurückgreifen müssen und glücklicherweise hat JLCPCB die passenden Sockel in seinem Lagerbestand.
Das Core-Board benötigt eine Versorgungsspannung von 3,6 V bis 5,5 V und erzeugt daraus mit mehreren Schaltreglern alle benötigten weiteren Spannungen: 0,9 V, 1,2 V, 1,8 V, 2,5 V und 3,3 V. Die 0,9 V und die 1,2 V werden nur zur Versorgung des FPGAs benötigt und die 1,8/2,5/3,3V werden auf die Steckverbinder geführt. Auch die I/O‑Spannungsversorgungen der sechs GPIO-Bänke werden auf die Steckverbinder geführt, so daß das Basisboard diese Bänke über Leiterbahnbrücken mit der benötigten Spannung versorgen kann, ohne sie selbst erzeugen zu müssen.
Tang Primer 25K Base-Board
Das Tang Primer Base-Board stellt eine handhabbare Hardware-Entwicklungsumgebung zur Verfügung.
Tang Primer 25K Base Board mit aufgestecktem Core-Board
Über die USB-Buchse auf der rechten Seite wird das Board mit einem Host-PC verbunden und mit der Betriebsspannung versorgt. Über diese USB-Buchse ist das FPGA direkt programmierbar und alternativ kann der Bitstream in den Flash-Speicher geladen werden, aus dem das FPGA sich nach dem Einschalten selbst konfiguriert.
Außerdem sind viele Signale des FPGAs auf 100-mil-Stift- und Buchsenleisten herausgeführt. Damit sind Testaufbauten wie dieser hier leicht möglich.
Tang Primer 25K Base Board mit aufgestecktem Core-Board und Testaufbau
Hier ist ein Steckboard mit zwei aufgesteckten SMA-Buchsen gezeigt, das jeweils einen 50 Ω Abschlußwiderstand enthält und dann mit möglichst kurzen Drähten an die Stiftleiste verbunden wird. Auf die SMA-Buchsen sind BNC-Adapter aufgeschraubt, an die ein Signalgenerator angeschlossen wird. Auch der oben schon gezeigte Logikanalysator wird hier wieder verwendet. Das Kabel, das nach rechts oben abgeht, führt zu einem USB-RS232-Konverter. Er ist einer der simplen Art, der nur RxD, TxD und +5V zur Verfügung stellt. Er funktioniert gleichwohl hervorragend und wird regelmäßig problemlos mit 115 kBd betrieben.
Das GW5A-LV25MG121NC1/I0-FPGA
Das hier verwendete Gowin-FPGA vom Typ GW5A hat 23040 logische Einheiten, bestehend aus jeweils einer Lookup-Tabelle mit vier Eingängen und einem Flipflop. Außerdem sind 56 SRAM-Blöcke mit insgesamt 1008 KBit und zusätzlich noch 180 KBit verteiltes SRAM implementiert. Darüberhinaus gibt es 28 DSP-Blöcke, jeweils bestehend aus mehreren Hardware-Multiplizierern und ‑Addierern sowie einer 48-bit-ALU. Sechs PLLs sorgen für verschiedene benötigte Taktraten. Die Referenzeingangsfrequenz muß zwischen 19 MHz und 800 MHz liegen und die VCO-Frequenz liegt zwischen 800 MHz und 1600 MHz. Aus der eingestellten VCO-Frequenz wird durch Frequenzteiler die benötigte Ausgangsfrequenz erzeugt.
FPGA-Entwicklung
Als Software-Entwicklungsumgebung wird das weitverbreitete Eclipse mit GNU-Tools eingesetzt. Das soll hier nicht weiter besprochen werden, detaillierte Hilfe gibt es im Internet. Wer, so wie ich, bisher noch nicht damit gearbeitet hat, wird sich schnell zurechtfinden, sollte aber „ein paar Tage“ zur Einarbeitung veranschlagen. Die Gowin-Dokumentation ist auch hier sehr hilfreich, insbesondere wenn es um die Konfiguration für die verwendete Zielarchitektur geht, also ARM Cortex oder RiscV.
Der Gowin FPGA-Designer unterstützt Verilog 95, Verilog 2001, System-Verilog 2017 und VHDL. Die Logiksynthese läuft sehr schnell, Placement und Routing (P&R) braucht naturgemäß etwas länger. Ein kompletter Durchlauf für ein Design mit einem PicoRV32-Softcore, UART und Wishbone-Bus, einer PLL und einiger 32-bit Register und Glue-Logik dauert etwa 1 Minute. Ein Simulator ist nicht vorhanden, aber man kann auf kostenlose Simulatoren anderer Entwicklungswerkzeuge ausweichen. In meinem Fall ist das Modelsim, das bei der Intel/Altera Entwicklungsumgebung dabei ist.
Der IP Core Generator soll noch kurz erwähnt werden. Er ist Teil des Gowin FPGA Designers und gestattet die Konfiguration einiger vordefinierter Bausteine. Damit wird beispielsweise der RiscV-Softcore, die PLLs oder die DSPs konfiguriert. Hier die Konfiguration des CPU-Cores:
Konfiguration des 32-bit Pico-RiscV CPU Cores mit dem Gowin IP Core Generator
Für den RiscV-Core wählt man außer dem Befehlssatz auch die anzuschließenden Speicher und das Bus-Interface (AHB oder Wishbone). Außerdem sind einige für Microcontroller typische Peripherals wählbar: GPIOs, UART, I2C-Master, SPI Master oder Slave oder SPI-Flash-Interface. Das sieht dann so aus:
Konfiguration des CPU-Subsystems mit dem Gowin IP Core Generator
Ich habe damit jetzt einige Wochen herumgespielt und bin außerordentlich zufrieden. Die Tools arbeiten sehr stabil und zuverlässig, keinerlei unerklärliches Fehlverhalten, das dann nach Neustart des PCs genauso unerklärlich wieder weg ist. Das bin ich bei anderen Embedded Entwicklungsumgebungen anders gewohnt, irgendwas ist ja immer. Auch das Herunterladen des Bitstreams zum FPGA funktioniert zuverlässig und ohne Murren. Wenn etwas schiefging, wusste ich bisher immer, woran es lag, meistens an mir.
Mit dem oben schon gezeigten Testaufbau habe ich einen digitalen Phasenvergleicher gebaut, der mit den zugegeben sauberen Signale eines Testgenerators Phasenverschiebungen zwischen zwei Signalen von 0,1° auflösen kann. Die Abweichung vom tatsächlichen Wert lag nach meinen Beobachtungen zwischen 1° und 2°, was an dem provisorischen Aufbau liegen kann. Eine Anwendung für diesen Phasenmesser könnte ein Gamma-Meßgerät sein, dessen Prototyp ich hier schonmal vorgestellt, aber bisher nicht verwirklicht habe.
Ich werde noch etwas optimieren, sowohl Verilog- als auch C‑Code noch etwas bereinigen und dann die Ergebnisse hier vorstellen.
Meine Frau sagt immer, ich soll mehr entspannen. Daher habe ich nun zur Entspannung mal ein weiteres Kiki-Projekt gestartet, einen Adapter für die 20V/40V-„ACTIV ENERGY“ Akkus, die in den Akku-Geräten der Marke „FERREX“ eingesetzt werden.
Ein neuer Rasenmäher
Das Projekt nahm seinen Anfang, als unser alter Akku-Rasenmäher kaputtging. Er hatte einen 120V-Akku (!), der nicht mehr gefertigt wird und für den es somit keinen Ersatz mehr gab. Ich vermute Problem mit den diversen Niederspannungs-Richtlinien, denn 120V sind nicht mehr ganz harmlos. Eine Fehleranalyse ergab, daß eine der 30 in Serie geschalteten 18650-Zellen einen Kurzschluss hatte und damit ließ sich der ganze Akku nicht mehr laden.
Zufällig gab’s bei Aldi gerade einen neuen Rasenmäher mit den 20/40-V-Akkus und so haben wir zugeschlagen. Bisher verwende ich für fast alle Akkuwerkzeuge die Parkside 20-V-Akkus, aber den neuen 40-V-Akkus konnte ich nicht widerstehen. Ihr Vorteil ist die gut handhabbare ungefährliche Spannung und halb so große Stromstärke bei gleicher Leistung.
Wozu das Ganze?
Mein Ziel ist der Betrieb eines IC7300 aus einem oder zwei dieser Akkus. Bei 100 W Sendeleistung zieht er immerhin 16A aus der 12V Versorgung, also nahezu 200 Watt. Bei 20 V wären das 10 A, bei einem 40-V-Akku nur 5 A. Zwei 40-V-Akkus können auch parallelgeschaltet werden, wie es bei Lithium-Akkus üblich ist. Damit sinkt die Stromstärke weiter auf 2,5 A, zumindest wenn die Akkus in etwa den gleichen Ladestand haben. Das ist ein Argument, zumal die Stromaufnahme wegen des begrenzten Wirkungsgrads des Spannungswandlers noch etwas höher liegen dürfte.
Wenn zwei Akkus verwendet werden, würde ich sie jeweils über eine Schottkydiode mit dem Spannungswandler verbinden, damit sie sich nicht gegenseitig laden oder entladen, falls der Ladestand sehr unterschiedlich ist. Der Einsatz zweier Akkus hätte den Vorteil, das man unterbrechungsfrei einen der beiden tauschen kann.
Die Schaltung ist trivial. Als Kontaktzungen für den Akku dienen Flachstecker für Printmontage aus Messing, es ist eine rückstellende Polymer-Sicherung eingebaut, 3,75 A beim Prototypen und für den Anschluß eines Kabels ist eine XT30-Buchse vorgesehen. Die Ausfräsung in der Leiterplatte dient zum Einrasten des Akkus. Der mittlere Flachstecker darf nicht bestückt werden. Es sind in Wirklichkeit zwei Kontakte, die mit T und ID bezeichnet sind. Ihre Funktion ist nicht ohne weiteres ersichtlich. Ich tippe auf einen Temperatursensor T und ein Signal zur Identifikation des Akkutyps. Sie sind für den Normalbetrieb offensichtlich nicht notwendig, könnten aber Notsignale bei zu hohem Strom oder zu hoher Temperatur abgeben. Proceed at your own risk! Der 20-V-Akku hat diese beiden Signale übrigens auch, aber ihm fehlt der Kontakt B2-.
Hier das KiCad-Projekt inclusive der 3D-Modelle, soweit vorhanden:
Der Akkuhalter ist mit dem 3D-Drucker gedruckt. Ich habe PLA-Filament mit Carbonfasern verwendet, in der Hoffnung, daß es dadurch etwas stabiler wird. Es macht jedenfalls einen stabilen Eindruck. Hier ist das FreeCad-Projekt für den Halter und das erzeugte 3mf-File:
Als Spannungswandler habe ich einen „DC/DC Spannungswandler Spannungsregler Modul Step Down Buck 30–90V auf 12V 1–30A“ vorgesehen. Er verträgt 30–90 V Eingangsspannung und ist damit für den 40-V-Akku in allen Grenzen von „voll“ bis „leer“ mit ausreichenden Reserven geeignet. Erste Versuche haben gezeigt, daß er sogar mit einem vollgeladenen 20-V-Akku funktioniert, was freilich außerhalb seiner Spezifikation ist. Wenn der mehr oder weniger entladen ist, beispielsweise auf 15 V, wird das auch nicht mehr funktionieren.
Bei 130 W Last auf der 12-V-Seite wird der Spannungswandler nach einer guten halben Stunde kaum handwarm. Danach war der Akku leer und hat offensichtlich automatisch abgeschaltet. Die verwendete Sicherung ist für 3,75 A Dauerstrom ausgelegt, was der Grund für die Wahl der 130-W-Last war. Der Akkustromstärke lag zum Start des Tests bei 3,5 A, was 140 W Eingangsleistung entspricht. Wegen des kontinuierlichen Abfalls der Akkuspannung beim Entladen, steigt die Stromstärke im Testverlauf und könnte dann die Sicherung auslösen.
Das Störspektrum
Wegen des beabsichtigten Betriebs eines KW-Funkgeräts ist natürlich das Störspektrum des Wandlers von besonderer Bedeutung. Ich habe daher einen passenden Ringkern mit 8 Windungen Draht bewickelt und ihn über die positive Zuleitung der Ausgangsseite gezogen. Am Spektrumanalysator zeigen sich folgende Schmutzeleien abhängig von der Last und dem Frequenzbereich:
Störspektrum komplett ausgeschaltetStörspektrum von 0 bis 1 MHz, eingeschaltet aber ohne LastStörspektrum von 0 bis 50 MHz bei 20 W LastStörspektrum von 0 bis 10 MHz bei 20 W LastStörspektrum von 0 bis 1 MHz bei 20 W LastStörspektrum von 0 bis 50 MHz bei 80 W LastStörspektrum von 0 bis 10 MHz bei 80 W LastStörspektrum von 0 bis 1 MHz bei 80 W Last
Am wichtigsten für den normalen Empfangsbetrieb ist die Störstrahlung bei 20 W Last, denn das ist ungefähr die Leistungsaufnahme des IC7300. Das Störspektrum liegt im Wesentlichen unterhalb von 1 MHz. Dort wird man sicherlich hier und da Pfeifstellen beobachten. In den KW-Amateurfunkbereichen sind glücklicherweise kaum Störungen zu erwarten. Im Sendebetrieb, hier bei 80 Watt Eingangsleistung, gehen die Störungen weiter zurück. Damit sollte man arbeiten können.