Einleitung
Schon seit Jahresanfang 2026 ist die erste Version des Reflexionsfaktor-Messgerätes verfügbar, die über den Prototypenstatus hinausgeht. Inzwischen funktioniert diese Version zuverlässig und sehr zufriedenstellend. Auch der Antennenkoppler mit der Versionsnummer 1.7 funktioniert im gesamten Kurzwellenbereich, mit kleinen Abstrichen sogar im 2‑m-Band. Eine erste Kurzbeschreibung hatte ich schon im Februar veröffentlicht und den Koppler nochmal etwas detaillierter im März. Bei der Inbetriebnahme zeigten sich Ungereimtheiten des Kopplers, die ich in einem Nachtrag beschrieben habe. Sie sind glücklicherweise gelöst.
Status
Die Hardware funktioniert nun ohne erkennbare Probleme. Der RTL-Code für das FPGA und die Software für den synthetisierten RISC-V-Prozessor würde ich als Beta-Release bezeichnen. Es sind alle gewünschten Funktionen implementiert und keine Fehler bekannt. Sowohl der Verilog-RTL-Code wie auch der C‑Quellcode könnten sicherlich noch etwas glattgezogen und besser dokumentiert werden. Hier und da ist noch Testcode vorhanden, der nicht mehr benötigt wird.
Inzwischen ist auch die Host-Software gut benutzbar, wenngleich auch noch im Beta-Status. Sie ist für Qt geschrieben und damit prinzipiell auch für andere Betriebssysteme als Windows verwendbar. Eine eventuelle Portierung überlasse ich dem geneigten Anwender. Ich selbst habe mal eine frühere Version in einer virtuellen Ubuntu-Maschine erfolgreich übersetzt, es ist mir aber nicht gelungen ein Deployment zu erzeugen, das auch außerhalb dieser Maschine lief. Damit möchte ich erst mal keine weitere Zeit vertun.
Beispielmessungen
Hier ein Eindruck des aktuellen Software-Standes, exemplarisch mit einer reellen Last von 10 Ω und mit einer induktiven Last von 0,93 µH (Wert mit VNWA bei 21 MHz gemessen):






Oben ist jeweils der Reflexionsfaktor gezeigt (Schieberegler links), darunter das Smithdiagramm (Schieberegler rechts) und unten das Fenster mit den jeweiligen Messwerten und den daraus errechneten Ergebnissen. Als Signalquelle dient ein Signalgenerator mit 20 dBm Ausgangsleistung. Wenn das gemessene Stehwellenverhältnis kleiner als SWR3 ist (hier auf 20 eingestellt), wird eine Anpassung mit einem LC- oder CL-Netzwerk berechnet und eingezeichnet. Eine detaillierte Erklärung folgt bei der Beschreibung der Host-Software.
Projektbeschreibung
Das gesamte Projekt ist recht umfangreich und umfasst die Leiterplattenentwicklung mit KiCad, die FPGA-Entwicklung in Verilog, die Firmware des darauf synthetisierten Risc-V-Prozessors in C und natürlich die Host-Bedieneroberfläche in C++. Ich werde alle Quellcodes veröffentlichen und in groben Zügen beschreiben. Dabei will ich mich nicht in Details verlieren. Wer das Projekt nachbauen will, muß sich sowieso einarbeiten, falls er nicht ohnehin alles anders und besser machen will. Eventuelle Fragen beantworte ich natürlich gerne.
Dieser erste Teil soll sich um die Hardware, die FPGA-Entwicklung und die Firmware drehen. Die Host-Software inklusive einiger Beispielmessungen wird einen eigenen Beitrag erfordern.
Hardwarebeschreibung
Die Hardware ist bereits hier kurz beschrieben und soll hier nochmal kopiert werden, um nicht zwischen den Bildschirmen hin- und herschalten zu müssen.
Ansichten und Design-Dateien
Die 3D-Ansichten…



3D-Ansichten des ersten Releases
und hier der Schaltplan und das KiCad-Projekt:
Kurzbeschreibung
Die Dämpfungsglieder am Eingang sind jetzt für eine maximale Eingangsleistung von 27 dBm (500 mW) ausgelegt. Bei einer Koppeldämpfung von 26 dB darf die maximale Eingangsleistung damit bei 53 dBm, also 200 Watt liegen.
Dem negativen Eingang der Komparatoren ist nun jeweils ein rauscharmer Präzisions-OpAmp vom Typ OPA376 als Spannungsfolger vorgeschaltet. Der kompensiert die Spannungsverschiebung durch den Eingangsleckstrom der Komparatoren. 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.
Ergänzung zur Kurzbeschreibung
Die Spannungsversorgung erfolgt über einen an J7 angesteckten USB-RS232-Konverter mit einem 5‑V-Ausgang. Sie wird über F1 und D2 gegen Überspannung und Verpolung abgesichert und mit C28, C29 und C30 gefiltert. Diese Spannung versorgt die OpAmps, die Komparatoren, die logarithmischen Verstärker und das Tang-Primer-Board. Das Tang-Board erzeugt die von ihm benötigten Spannungen selbst und gibt sie auch über seinen Steckverbinder nach außen.
Die Außenbeschaltung entscheidet, welche FPGA-Bänke mit welcher Betriebsspannung versorgt werden. In diesem Fall werden alle Bänke mit 3,3 V versorgt. Mit diesen 3,3 V wird außerdem auch der AD-Wandler U1 (ADS1118) betrieben. Er braucht typischerweise nur 0,3 mA. Es ist ein ADC mit vier Eingängen und zusätzlich einem Thermometer. Seine Konfiguration erhält er über eine SPI-Schnittstelle, die gleichzeitig auch die Messwerte überträgt.
Der ADC misst die beiden Ausgangsspannungen der logarithmischen Verstärker sowie die 5‑V-Eingansspannung von der USB-Schnittstelle und die 3,3 V vom Tang-Board. Er hat eine Auflösung von 16 Bit und kann je nach Konfiguration bis zu 860 Messwerte pro Sekunde liefern.
Das Tang-Board ist völlig eigenständig und hat alle benötigten Komponenten an Bord. Es benötigt nur die 5‑V-Betriebsspannung. Seine Konfiguration inklusive der Firmware eines optional synthetisierten Prozessors wird beim Einschalten aus einem serielle Flash-Speicher geladen. Um diesen Flash-Speicher zu programmieren, muss das Tang-Board abgezogen und auf ein Tang-Baseboard aufgesteckt werden. Das habe ich hier beschrieben, darüberhinaus sei auf weitere Quellen im Internet verwiesen.
Das erste Board hat leider noch zwei Fehler, die zum Glück nicht gravierend sind, aber bei einem neuen Design behoben werden sollen. Es sind SMA-Buchsen mit falschem Pinabstand eingebaut und die NFM18PS105R-Filter unter dem Tang-Board sind zu dick. Da muß entweder ein höherer Sockel verwendet werden oder die Filter müssen woanders hin verschoben werden. Beim jetzigen Board muß ein Streifen Isolierband unter dem Tang-Board aufgeklebt werden und es darf nicht zu fest eingedrückt werden, sonst gibt es Kurzschlüsse. Außerdem ist D1 zu hell und blendet, wenn das Board vor einem auf dem Tisch liegt.
FPGA-Design
Das Funktionsprinzip des FPGAs habe ich bereits in einem Beitrag Anfang 2026 für den ersten Prototypen beschrieben. Die Beschreibung ist nach wie vor gültig, außer daß ich den asynchronen Sender ATX weiterentwickelt und ihn in ART (asynchronous receiver/transmitter) umbenannt habe, auch wenn der Empfangsteil noch nicht implementiert ist.
Hier das leicht überarbeitete Blockdiagramm:
Der asynchrone Sender ART
Der Sendeteil ist nun besser konfigurierbar als vorher. Man kann zwischen einem und zwei Stopbits wählen und keine, gerade oder ungerade Parität auswählen. Die Bitrate ist nun nicht mehr ein ganzzahliger Bruchteil der Taktfrequenz sondern ein ganzzahliger Bruchteil von 1⁄8 der Taktfrequenz. Der Grund ist der noch nicht implementierte Empfänger, der jedes Bit mehrfach abtasten muss, beabsichtigt ist achtmal. Wegen dieser Änderung wurde die CPU- und ART-Taktfrequenz nun auf 25 MHz erhöht, weil mit den bisherigen 20 MHz die erwünschte Baudrate von 115.200 Bd nicht hinreichend genau erzeugt werden konnte.
Da die Interrupt-Ausführungszeit des PicoRV32 recht hoch ist und die Ressourcen im FPGA vorhanden sind, wurde ein 256-Byte Sende-FIFO implementiert. Es wird CPU-seitig in einem Rutsch mit den Sendedaten gefüllt und vom ART nach Bedarf geleert. Interrupts sind nicht mehr notwendig, solange nicht mehr Daten gesendet werden sollen, als in das FIFO passen.
Wahl der Messrate
Zunächst zur Abschätzung der Grenzen: Eine Messung pro Sekunde wäre das absolute Minimum. Langsamer darf es nicht sein, wenn man den Wert nur optisch anzeigen will. Zehn Messungen pro Sekunde wäre das Minimum, um einen Antennentuner anzusteuern. Hundert Messungen pro Sekunde wären in den meisten Fällen wohl schon ein Overkill.
Was kann denn die Hardware? Der AD-Wandler kann pro Sekunde 860 Messungen durchführen, die auf seine bis zu fünf Kanäle verteilt werden. Absolut notwendig sind die beiden Kanäle zur Messung der Vor- und Rücklaufspannung. Damit liegt also die maximale Messrate bei 430 Messungen pro Sekunde. Beschränkt man sich also auf die genannten 100 Messungen pro Sekunde, dann können in jedem Messzyklus problemlos alle vier AD-Kanäle und die Temperatur gemessen werden. Das vereinfacht die Software, Klimmzüge sind unnötig.
Der Phasenvergleicher akkumuliert im Messintervall die Eigenschaften der vor- und rücklaufenden Signale: die Anzahl und Sequenz ihrer Flanken und die Dauer der Überlappung. Das Messintervall muss hinreichend lang sein, damit genügend Flanken ausgewertet werden können. Bleiben wir bei dem Beispiel mit 100 Messungen pro Sekunde, dann dauert ein Messintervall 10 ms, was bei den 1,8 MHz des 160-m-Bandes also für 18.000 Flanken reicht. Das reicht für eine Statistik und bei den höheren Bändern wird es zunehmend mehr.
Ein weiterer Punkt ist zu beachten: die Messdaten müssen ja irgendwie übertragen werden. Dazu ist die serielle Schnittstelle implementiert, deren Datenrate begrenzt ist. Um bei den Standardraten zu bleiben, habe ich hier 115 kBd mit zwei Stopbits und geradzahliger Parität gewählt. Damit kann man also pro Sekunde maximal 115200⁄11 ≅ 10kByte übertragen, was in 10 ms 100 Byte sind. In der Entwicklungsphase war das etwas zu knapp, denn hin und wieder wurden ausführliche Testdaten mit Zusatzinformation benötigt, die diesen Rahmen überschritten haben. Daher fiel die Wahl auf 25-ms-Intervalle, also 40 Messungen pro Sekunde. Das ist der jetzige Stand, der aber in den genannten Grenzen änderbar ist.
VCO und PLL
Als Takt für den Phasenvergleicher clk_s sollten die ursprünglich gewählten 200 MHz beibehalten werden. Damit lassen sich 26-Bit-Zähler zuverlässig synthetisieren, ohne die Frequenzgrenzen zu verletzen. Das reicht für Messintervalle bis länger als 300 ms. Mit den nun gewählten Intervall von 25 ms wären daher auch 23-bit-Zähler ausreichend, die eventuell etwas schneller getaktet werden können. Der Nutzen wäre gering, daher bleibt es momentan bei 26-bit-Zählern.
Der interne VCO wird mit 800 MHz betrieben und daraus werden durch Teilung die Abtastfrequenz von 200 MHz und die CPU-Taktfrequenz von 25 MHz generiert. Aus einem Achtel der CPU-Frequenz wird durch ganzzahlige Teilung die Baudrate der asynchronen Schnittstelle erzeugt. Daher ist man nicht ganz frei in der Wahl der Taktfrequenzen.
Vorschau auf Teil 2
Im nächsten Teil soll die Firmware, der FPGA-Verilog-Code und die Host-Software beschrieben werden. Wie oben angedeutet, ist momentan alles mindestens als funktionierende Beta-Version verfügbar. Hier ist der aktuelle Stand zusammengepackt:
Vor einem echten „Release“ und einer detaillierten Beschreibung will ich aber alles noch etwas glattziehen. Es fehlt auch noch eine Modbus-Variante, die dann zusammen mit anderen Modulen an einer RS-485-Schnittstelle betrieben werden kann. Bluetooth wäre auch nicht schlecht, denn beim Testbetrieb habe ich festgestellt, daß über die USB-Schnittstelle viele Störungen vom PC auf einen angeschlossenen Transceiver eingekoppelt werden. Das ist daran erkennbar, daß der Rauschpegel im Transceiver deutlich steigt, wenn man den USB-Stecker nur an die USB-Buchse am PC hält, so daß noch keine Spannungsversorgung erfolgt. Das hängt aber vermutlich auch von der Entstörung des jeweils verwendeten PCs ab.
Wie auch immer, ich werde mir die nötige Zeit lassen. Sollte trotzdem jemand vorab mit den Quellcodes herumspielen wollen, möge er das mit dem oben angebotenen Code machen. Wer nicht klarkommt, kann mich per Email kontaktieren.

































































































