Stereo-Multiplexsignal mit einem Funktionsgenerator und Python erzeugen

Mit einem modernen Funktionsgenerator lassen sich sehr leicht auch komplexere Wellenformen abbilden. Für ein Projekt wurde ein Stereo-Multiplexsignal (MPX) benötigt. Das benötigte Stereo-Multiplex-Signal sollte zwei unterschiedliche Töne für den rechten und linken Kanal, sowie einen 19 kHz Stereo-Pilotton enthalten. Das Ganze wurde mit etwas Mathematik, einem Python-Skript und einem Siglent SDG1032X Funktionsgenerator umgesetzt.

Überblick

Die Art und Weise, wie ein FM-Stereo-Signal kodiert wird ist simpel und ausgeklügelt zugleich. Zunächst wird aus den rechten und linken Audiosignal ein Summensignal gebildet. Das Summensignal stellt eine Rückwärtskompabilität mit älteren Mono-Empfängern sicher. Weiter wird ein Differenzsignal aus den beiden Audio-Signalen gebildet. Dieses Differenzsignal wird verwendet um ein Doppelseitenband-Signal um eine Mittenfrequenz von 38 kHz zu erzeugen. Zuletzt wird ein zu dem 38 kHz phasenkohärenter 19 kHz Pilotton mit einer relativen Amplitude von 10 % zu den beiden vorhergenannten Signalen hinzugefügt. Diese drei Signale werden zusammen verwendet um einen FM-Sender zu modulieren. Für eine ausführlichere Erklärung verweise ich auf mein YouTube-Video zur Stereo-FM Theorie [1](EN).

Für das Testsignal sollte das MPX-Signal einen 700 Hz Ton im linken Audiokanal und einen 2200 Ton im rechten Audiokanal enthalten. Als Funktionsgenerator wurde ein Siglent 1032X verwendet. Auf Softwareseite wurde Python mit PyVISA und NI-VISA verwendet. Letztere bieten eine einfache Methode um mit modernen Laborgeräten zu kommunizieren.

Stereo-Multiplexsignal mit SDG1032X and Python erzeugen

Stereo-Multiplexsignal mit SDG1032X and Python erzeugen

Mathematische Beschreibung der Wellenform

The first step was to figure out how to generate the necessary datapoints for the MPX signal. In order to achieve this, equations describing all components of the final signal in a mathematical form needed to be formulated. For the sum signal, the DSB modulated difference signal and the 19 kHz pilot tone, the equations are as follows:

Als ersten Schritt galt es die Datenpunkte für die gewünschte Stereo-Multiplex-Wellenform zu erzeugen. Dazu wurden zunächst die Gleichungen für das Summensignal, das Doppelseitenbandsignal mit dem Differenzssignal und den 19 kHz Pilotton aufgestellt:

Gleichung für das Summensignal (L+R) signal:
Sum = sin(700 \omega t)+sin(2200 \omega t)

Gleichung für das Differenzsignal (L-R), doppeltes Seitenband mit 38 kHz Träger:
Diff= sin(38000 \omega t) \cdot (sin(700 \omega t)-sin(2200 \omega t))

Gleichung für den 19 kHz Pilotton:
Pilot = 0.1 \cdot sin(19000 \omega t)

Bei ω ahndelt es sich in diesem Fall um einen Normalisierungsfaktor um Frequenzen von Zyklen pro Sekunde in Radian pro Abtastwert zu übersetzen. Die Zeit zwischen den Abtastwerten wird durch den Buchstaben t repräsentiert. In der Python- / SDG-Kombination beträgt der Normalisierungsfaktor π geteilt durch die doppelte Abtastrate des SDG1032X. Da die drei generierten Signale einfach addiert werden, kann folgende Gesamtgleichung aufgestellt werden:

sin(700 \omega t)+sin(2200 \omega t) + sin(38000 \omega t) \cdot (sin(700 \omega t)-sin(2200 \omega t)) + 0.1 \cdot sin(19000 \omega t)

Die Gesamtgleichung erzeugt einen Maximalwert von 2,1 und einen Minimalwert von -2,1. Daher muss die Gleichung mit dem Faktor 0,47 multipliziert werden um einen Maximalwert von 1 bzw. einen Minimalwert von -1 zu erhalten.

Python Implementierung

Der vollständige Python-Code, zusammen mit anderen Python / PyVISA Beispiel-Skripten, kann über mein SIGLENT GitHub Repository [2] abgerufen werden.

Das Python-Skript muss 16384 Datenpunkte für die oben mathematisch beschriebene Wellenform generieren. Das folgende Python-Skript ist zwar nicht das hübscheste, es erledigt jedoch genau diese Aufgabe:

# Leeres Array mit 16384 Punkten erstellen
WAVE = np.arange(0, 0xfffe, 1);

# Sample Rate in S/s
SAMPLE_RATE = 1638400

# Normalisierungsfaktor berechnen
F_FACTOR = (np.pi/(2*SAMPLE_RATE))

# Array mit Daten füllen
for n in range(len(WAVE)):

  # Amplitude (MAX 32767 on SDG1032X)
  Amplitude = 32767
  WAVE[n] = 0.47*Amplitude*(np.sin(700*F_FACTOR*n)+np.sin(2200*F_FACTOR*n)+0.1*np.sin(19000*F_FACTOR*n)+np.sin(38000*F_FACTOR*n)*(np.sin(700*F_FACTOR*n)-np.sin(2200*F_FACTOR*n)))

Die so generierten Datenpunkte der Wellenform werden dann mit Hilfe des PyVISA-Packages und den notwendigen SCPI-Kommandos an den Funktionsgenerator gesendet. Dafür muss das PyVISA-Package und die NI-VISA API natürlich auf dem verwendeten PC installiert sein und es muss eine Verbindung zwischen dem PC und dem Funktionsgenerator bestehen.

# Write Waveform to Device
# Note: byte order = little-endian!
device.write_binary_values('C1:WVDT WVNM,STEREO_MPX,FREQ,100.0,TYPE,8,AMPL,1.0,OFST,0.0,PHASE,0.0,WAVEDATA,', WAVE, datatype='i', is_big_endian=False)

Das war’s! Das vollständige Python-Skript kann ebenfalls aus meinem GitHub-Repository heruntergeladen werden [2].

Ergebnis

Nachdem das Python-Skript ausgeführt wurde, fing der Funktionsgenerator an das beabsichtigte Stereo-Multiplex-Signal zu erzeugen. Da hier nur 2 statische Audio-Töne für die beiden Audiokanäle erzeugt werden, können die Spektralanteile und die relativen Amplituden aller Signalbestandteile sehr gut im Spektrum beobachtet werden:

Spektrumdarstellung des Stereo-MPX-Signales

Spektrumdarstellung des Stereo-MPX-Signales

Der Vollständigkeit halber, hier das generierte Signal in der Zeitdomäne:

Generiertes Stereo-Multiplex-Signal in der Zeitdomäne

Generiertes Stereo-Multiplex-Signal in der Zeitdomäne

Zusammenfassung

Im Kern kann gesagt werden, dass es sehr einfach ist mit Python Wellenformdaten für moderne Funktionsgeneratoren zu erzeugen. Solange eine mathematische Gleichung für die Wellenform aufgestellt werden kann, gibt es kaum Limits. Beim SDG1032X ist die größte Limitierung der relative kleine Samplespeicher mit nur 16384 Punkten. Nichtsdestotrotz, das hier zur Verfügung gestellte Python-Framework bietet eine gute Grundlage für das Erzeugen von komplexeren Wellenformen. Dazu muss lediglich die Zeile mit der mathematischen Beschreibung der Wellenform („WAVE[n] =“) angepasst werden. Mein GitHub-Repository enthält dazu weitere Beispiele.

Links und Quellen:

[1] BalticLab (2016): Stereo Multiplexing for FM Transmission | Theory

[2] AI5GW (2022): Python code examples for SIGLENT equipment

 

SITOR-B / NAVTEX Testsignal mit Arduino und Funktionsgenerator erzeugen

Dieser Artikel zeigt wie man gültige NAVTEX Testsignale mit einem Arduino und einem Funktionsgenerator generieren kann. Der Arduino übernimmt die Zeichenkodierung nach CCIR476, die Implementierung der SITOR-B Protokolls inklusive Vorwärtsfehlerkorrektur und das Erzeugen von Synchronisations- und Steuerzeichen. Ein einfacher Funktionsgenerator dient als FSK-Modulator auf 518 kHz +- 85 Hz, wo das generierte Signal von einem NAVTEX-Empfänger empfangen werden kann.

Einleitung

Eigentlich war meine Absicht einen Artikel zur Reparatur eines „NAV4 Navtex“ Empfängers vom Hersteller ICS Electronics posten. Das Gerät lag längere Zeit defekt in in meinen Bastelkisten herum. Die Reparatur gestaltete sich jedoch ziemlich langweilig. Nach einem Abgleich des Eingangsfilters funktionierte das Gerät auf Anhieb sofort wieder. Bei der Reparatur zeigte sich allerdings ein anderes Problem: NAVTEX Sender senden nach einem festen Zeitplan. Daher musste ich bis zu 4 Stunden auf die nächste Aussendung vom Deutschen Wetterdienst (DWD) warten. Diese Wartezeit hat sich nicht mit meiner Ungeduld vertragen. So entstand dieses Projekt zur Generierung eigener NAVTEX Testsignale.

NAV4 Navtex Empfänger von ICS Electronics

NAV4 Navtex Empfänger von ICS Electronics

NAVTEX (NAVigational TEleX) ist ein internationaler Dienst zur Verbreitung nautischer und meteorologischer Warnnachrichten. Verschiedene Stationen, unter Anderem der DWD, senden auf 490 kHz und 518 kHz regelmäßig wichtige Informationen für die Schifffahrt aus. Obwohl NAVTEX ein sehr alter Standard ist, gehören NAVTEX Empfänger immer noch zur Ausrüstungspflicht für bestimmte Schiffe unter dem SOLAS-Abkommen (SOLAS = Safety of Life at Sea). NAVTEX Sender senden CCIR476 kodierte Zeichen mit einer Symbolrate von 100 Baud. Da NAVTEX auf dem SITOR (SImplex Teletype Over Radio) B Protokoll aufbaut, ist dank Vorwärtsfehlerkorrektur (kurz FEC, von englisch Forward Error Correction) eine gewisse Robustheit auch bei schwierigen Funkbedingungen gegeben.

CCIR476 Zeichenkodierung

CCIR476 ist eine 7-Bit Zeichenkodierung, die in diversen Funkprotokollen verwendet wird. SITOR, AMTOR und das auf SITOR-B aufgesetzte NAVTEX verwenden ie CCIR476 Zeichenkodierung. Da in einem gültigen Zeichen exakt 4 von den insgesamt 7 Bits ‚1‘ sind, ist eine einfache Fehlererkennung möglich. Da beim SITOR-B / NAVTEX Protokoll jedes Zeichen zweifach gesendet wird, ist damit auch eine Fehlerkorrektur möglich. Dazu aber später mehr. Da es sich bei AMTOR oder konkreter AMTOR-B (auch AMTOR-FEC genannt) um die Amateurfunkvariante von SITOR-B handelt, bin ich davon ausgegangen, dass es für die notwendige CCIR476 Zeichenkodierung sicher eine Arduino-Bibliothek gibt. Doch diese Annahme stellte sich schnell als falsch heraus. Die gute Nachricht für Alle, die auch Verwendung für eine CCIR476-Bibliothek haben: Meine CCIR476 Bibliothek für Arduino [1] ist jetzt entweder direkt über den Bibliotheksmanager in der Arduino-IDE oder auf GitHub [2] verfügbar.

CCIR476 Bibliothek in der Bibliotheksverwaltung der Arduino-IDE

CCIR476 Bibliothek in der Bibliotheksverwaltung der Arduino-IDE

CCIR476 verwendet – genau wie der bei RTTY verwendete Baudot-Code – zwei verschiedene Zeichentabellen; Eine Tabelle für Buchstaben und eine zweite Tabelle für Ziffern/Zeichen. Die Umschaltung zwischen den beiden Tabellen erfolgt durch Steuerzeichen. Die von mir geschriebene Bibliothek sucht in beiden Tabellen nach dem gewünschten ASCII-Zeichen und übersetzt dieses in das korrespondierende CCIR476 Zeichen. Dabei erkennt die Software, ob es sich dabei um Buchstaben oder Ziffern/Zeichen handelt. Sollte ein Wechsel zwischen den beiden Tabellen notwendig werden, werden die entsprechenden Steuerzeichen in den Bitstrom eingefügt.

SITOR-B und NAVTEX Protokoll

Die Internationale Fernmeldeunion, ITU, ist eine gute Anlaufstelle auf der Suche nach Spezifikationen für ältere Funkprotokolle. Auf der Website der ITU wurde die ITU Empfehlung M.476-5 mit dem Titel „Direct-printing telegraph equipment in the maritime mobile service“ gefunden [3]. In diesem Dokument werden sämtliche Details von SITOR-A und SITOR-B beschrieben.

Die Kurzfassung: Eine Übertragung wird durch die abwechselnde Aussendung von 2 Steuerzeichen, Phasing Signal 1 und Phasing Signal 2, eingeleitet. Jedes Zeichen wird insgesamt 2-mal ausgesendet. Zwischen der Erstaussendung eines Zeichens und der Wiederholung liegen genau 4 anderen Zeichen. Die Aussendung wird durch 3-malige Aussendung des „Phasing Signal 1“- Steuerzeichens beendet.

Das Dokument der ITU beschreibt die Vorwärtsfehlerkorrektur wie folgt:

The station sending in the collective or in the selective B-mode (CBSS or SBSS) emits each character twice: the first transmission (DX) of a specific character is followed by the transmission of four other characters, after which the retransmission (RX) of the first character takes place, allowing for timediversity reception at 280 ms time space;

Übersetzt in Code für den Arduino sieht die Vorwärtsfehlerkorrektur mit Zeichenwiederholung nach 4 anderen Zeichen wie folgt aus:

void SITOR_Transmit_FEC(byte SYM)
{      
     Transmit_SYMBOL(SYMBOL_BUFFER_1);
     SYMBOL_BUFFER_1 = SYMBOL_BUFFER_2;
     SYMBOL_BUFFER_2 = SYMBOL_BUFFER_3;
     SYMBOL_BUFFER_3 = SYM;  
     Transmit_SYMBOL(SYMBOL_BUFFER_3);  
}

NAVTEX verlangt darüber hinaus, dass jede NAVTEX-Nachricht mit den Zeichen „ZCZC“ eingeleitet und mit den Zeichen „NNNN“ beendet wird. Nach dem einleitenden „ZCZC“ wird zudem eine Meldungskennung, bestehend aus Senderkennung, Meldungsart und einer laufenden, 2-stelligen Nummer, ausgesendet. Mein Beispielcode verwendet die Meldungskennung „SA00“. Dabei steht das „S“ für den DWD-Sender in Pinneberg, „A“ für eine Navigationswarnung und die Seriennummer „00“ hat einen Sonderstatus als besonders dringliche Meldung.

Testaufbau und Ergebnisse

Der Beispielcode wurde kompilliert und auf einen Arduino Uno gebrannt. Sobald man eine Betriebsspannung an den Arduino anlegt, generiert dieser eine CCIR476 kodierte, dem SITOR-B und NAVTEX Protokoll entsprechende Testnachricht. Diese Testnachricht steht mit der korrekten Bitrate von 100 Baud am Pin 2 des Arduino’s als digitaler Bitstrom zur Verfügung.

NAVTEX Bitstrom am Pin 2 des Arduino Uno

NAVTEX Bitstrom am Pin 2 des Arduino Uno

Dieser Bitstrom wurde dann über die „Aux In/Out“-Buchse einem Siglent 1032X Funktionsgenerator zugeführt. Der Funktionsgenerator wurde auf eine Frequenz von 517,915 kHz eingestellt. Die eingebaute Funktion zur FSK-Modulation wurde aktiviert, die Modulationsquelle auf „Extern“ gesetzt und die FSK Sprungfrequenz auf 518,085 kHz eingestellt.

Ein Siglent 1032X wurde als FSK-Modulator für das generierte SITOR-B / NAVTEX Testsignal verwende

Ein Siglent 1032X wurde als FSK-Modulator für das generierte SITOR-B / NAVTEX Testsignal verwendet

Das Testsignal aus dem Funktionsgenerator wurde direkt in den Antenneneingang vom NAVTEX Empfänger geführt. Der Arduino wurde neu gestartet und kurze Zeit später begann die „SBY“ LED am NAVTEX Empfänger zu blinken. Kurze Zeit darauf begann der Thermodrucker damit die übermittelte Testnachricht fehlerfrei auszudrucken.

Erfolgreicger Empfang des NAVTEX Testsignales auf einem NAVTEX Empfänger

Empfang des NAVTEX Testsignales auf einem NAVTEX Empfänger

Bonusmaterial

Wenngleich eine Funktion zur FSK-Modulation auf den meisten, modernen Funktionsgeneratoren ziemlicher Standard ist, habe ich ebenso erfolgreich einen Si5351A-Taktgenerator verwendet um das NAVTEX Testsignal FSK-moduliert um 518 kHz zu generieren. Der entsprechende Sketch hierfür findet sich ebenso im Beispielordner der CCIR476 Bibliothek oder direkt hier.

Folgendes, kurzes Video zeigt den Testaufbau in Aktion:

Zusammenfassung

Dieses Projekt zeigt, dass es manchmal sehr lehrreich sein kann mehrere Tage Arbeit zu investieren um wenige Stunden Wartezeit zu umgehen. Hätte ich einfach nur die 4 Stunden auf die nächste Aussendung vom DWD gewartet, hätte ich niemals so viel über CCIR476, SITOR-B oder NAVTEX gelernt. Ebenso wenig hätte ich gelernt wie man eigene Bibliotheken schreibt und wie diese in die Bibliotheksverwaltung der Arduino-IDE aufgenommen werden. Manchmal kann Ungeduld zusammen mit etwas Kreativität interessante Wege eröffnen.

Links and Sources:

[1] CCIR476 Arduino library, GitHub: https://github.com/AI5GW/CCIR476

[2] CCIR476 Arduino library, arduino.cc: https://www.arduino.cc/

[3] ITU recommendation M.476-5, ITU: https://www.itu.int/

 

Experimente mit einem UKW LDMOS Leistungsverstärker

Der LDMOS MRF101 von NXP verspricht knapp über 100 Watt Ausgangsleistung und 20 dB Verstärkung von 1,8 MHz bis 250 MHz. Aufgrund der enormen Robustheit gegenüber Fehlanpassungen (VSWR > 65:1) und seines relativ günstigen Preises ist der MRF101 sehr interessant für die Amateurfunkwelt. Dieser Artikel zeigt erste Versuche im 2m Amateurfunkband.

Prototyp des UKW LDMOS Leistungsverstärkers

Prototyp des UKW LDMOS Leistungsverstärkers

Überblick

Für meine Versuche verwende ich einen einzelnen MRF101AN (keine push-pull Konfiguration). Trotz der Eignung für das 6m (50 MHz), 4m (70 MHz), 2m (145 MHz) und 1,25m (222 MHZ) Amateurfunkband sowie dem UKW Rundfunkband, scheint es im Internet kaum Designs mit dem MRF101 für diese Bänder zu geben. Die meisten Selbstbauten beschränken sich auf KW + 6m. Meine Vermutung ist, dass die Anpassung der Eingangs- und Ausgangsimpedanz mit Breitbandübertragern auf niedrigeren Frequenzen wesentlich leichter ist und Bastler von höheren Frequenzen fernhält. Für meine Versuche habe ich das 2m-Band für meinen Prototypen gewählt.

Meine Vorgaben für meinen Prototypen habe ich wie folgt gewählt: Eingangs-VSWR kleiner 2:1 im Bereich 144-148 MHz, 100 mA Ruhestrom gemäß Datenblatt. Die Vorspannung zur Ruhestromeinstellung des MRF101AN wurde über einen Widerstand ans Gate gebracht. Dieser Widerstand ist wechselstromseitig über einen Kondensator auf Masse gelegt und ist Teil der Eingangsimpedanzanpassung. Dazu aber später mehr.

Anpassung der Eingangs- / Ausgangsimpedanz

Die erste wirkliche Herausforderung bei der Entwicklung meines Prototyps war die Eingangsimpedanzanpassung. Laut Datenblatt ist die Eingangsimpedanz des MRF101AN bei 145 MHz mit 6.2 – j10.2 angegeben [1]. Eine stark kapazitive Reaktanz ist bei einer Eingangskapazität von 149 pF wenig verwunderlich. Die zu erwartende Ausgangsimpedanz beträgt 9.9 – j5.9. Aufgrund der stark reaktiven Anteile der komplexen Impedanz wären Versuche mit Breitbandübertragern mit ziemlicher Wahrscheinlichkeit zum Scheitern verurteilt.

Daher habe ich mich zur Eingangsimpedanzanpassung für ein einfaches L-Netzwerk entschieden. Zur Impedanzanpassung mit einem L-Netzwerk habe ich bereits einen Artikel geschrieben [2]. Im Artikel ist die Funktionsweise und die Berechnung eines solchen Netzwerkes ausführlich beschrieben. Es sollte angemerkt werden, dass man aus Gründen der Stabilität niemals versucht die Gate-Impedanz eines Leistungs-MOSFETs direkt an 50 Ohm anzupassen. Die übliche Praxis ist es, einen relativ niederohmigen Widerstand zwischen Gate und Source zu platzieren und die resultierende Gesamtimpedanz dann an die Systemimpedanz von 50 Ohm anzupassen. Der Ausgang eines Leistungs-MOSFET kann hingegen direkt an 50 Ohm angepasst werden.

Da ich selbst zu unmotiviert war mögliche Werte per Hand zu berechnen, habe ich die kostenlose Software SimSmith von AE6TY verwendet [3]. SimSmith erlaubt es per drag and drop verschiedene Komponenten in der Schaltung zu platzieren und ihr Verhalten über einen breiten Frequenzbereich zu simulieren. Um richtig Spaß an der Software zu haben sollte man natürlich ein Smith-Diagramm einigermaßen lesen können. Eine SWR-Anzeige ist allerdings auch verfügbar.

SimSmith Simulation der Eingangsimpedanzanpassung des MRF101AN mittels L-Netzwerk

SimSmith Simulation der Eingangsimpedanzanpassung des MRF101AN mittels L-Netzwerk

Das die simulierte Eingangsanpassung wollte allerdings in der Realität nicht so richtig funktionieren. Dies ist allerdings auch wenig verwunderlich; Mein fliegender, Manhattan-style Aufbau der Schaltung ist alles andere als optimal für eine solche Schaltung. Aufgrund der parasitären Induktivitäten, die ein solcher Aufbau mit sich bringt, musste ich die Induktivitäten der Eingangs- und Ausgangsanpassung deutlich verringern. Wie man später sehen kann habe ich es mit der Reduzierung der Induktivität etwas übertrieben. Das ist für die Experimente zur Machbarkeit aber erstmal egal.

Folgende Schaltung habe ich für die weiteren Versuche verwendet:

Schaltplan des MRF101AN Leistungsverstärkers für das 2m-Amateurfunkband

Schaltplan des MRF101AN Leistungsverstärkers für das 2m-Amateurfunkband

Die Schaltung kann hier auch als PDF heruntergeladen werden: MRF101_AN_VHF_Amplifier_Schematic.pdf

Testergebnisse


Für diese Tests habe ich mir nicht besonders viel Mühe gegeben. Lediglich genug um die Machbarkeit der von mir beabsichtigten Topologie zu überprüfen. Eine Optimierung der Schaltung kann dann später mit einem vernünftigen Platinenlayout erfolgen. Alle Tests wurden mit einer Versorgungsspannung von 50 Volt und einem eingestellten Ruhestrom am MRF101AN von 100 mA durchgeführt. Der Ausgang der Leistungsendstufe wurde mit einer 50 Ohm Ersatzlast (Dummyload) terminiert. Ein Teil der Leistung wurde über einen 1:100 Tastkopf an mein Siglent SDS1202X-E Oszilloskop geschickt. Ein großer Kühlkörper stellte sicher, dass der MRF101AN sich jederzeit in seinem zulässigen Betriebstemperaturbereich befand.

Nach Anlegen der Betriebsspannung hat der Leistungsverstärker sofort beschlossen selbstständig zwischen 160 und 170 MHz oszillieren zu wollen. Das war zu erwarten und konnte ihm mit etwas Abschirmung zwischen der Gate- und Drain-Seite der Platine sofort wieder ausgetrieben werden.

Als erstes wurde die Eingangsimpedanz mit einem Nano VNA überprüft. Zwar ist der Verlauf des VSWR akzeptabel und innerhalb des Ziels von kleiner 2:1, jedoch lässt sich das Ganze sicher noch deutlich optimieren.

VSWR am Eingang des LDMOS Leistungsverstärker. Gemessen mit einem Nano VNMA

VSWR am Eingang des LDMOS Leistungsverstärker. Gemessen mit einem Nano VNMA

Ein Blick auf die komplexe Impedanz im Smith-Diagramm ergibt eine deutlich aussagekräftigeres Bild vom Verlauf der Eingangsimpedanz:

Komplexe Eingangsimpedanz des MRF101AN LDMOS Leistungsverstärker

Komplexe Eingangsimpedanz des MRF101AN LDMOS Leistungsverstärker

Ein Bisschen mehr Admittanz von C2 und etwas mehr Reaktanz von L1, dann sollte die Eingangsanpassung ganz gut aussehen. Da sich die parasitären Reaktanzen bei einem zukünftigen Platinenlayout ohnehin ändern, wurde der geringen Fehlanpassung erstmal keine weitere Beachtung geschenkt. Auf jeden Fall war es gut genug um um ein Handfunkgerät ohne Risiko mit der LDMOS Endstufe verbinden zu können.

Test des UKW (144-148 MHz) LDMOS Leistungsverstärker

Test des UKW (144-148 MHz) LDMOS Leistungsverstärker

Bei rund einem Watt Eingangsleistung auf 145,225 MHz brachte die Endstufe – vermeintlich – tatsächlich knapp 100 Watt HF Ausgangsleistung:

Ausgangssignal des Prototyps

Ausgangssignal des Prototyps

Die Messergebnisse sind allerdings mit äußerster Vorsicht zu genießen! 70.5 Vrms an 50 Ohm entspricht natürlich ganz knapp 100 Watt Leistung. Der Spruch „Wer misst, misst Mist!“ gilt allerdings auch für moderne Oszilloskope. Zunächst fällt auf, dass das gemessene Signal ziemlich Sinusförmig aussieht. Das ist mit ziemlicher Wahrscheinlichkeit eine Illusion. Das Oszilloskop hat eine maximale Bandbreite von 200 MHz und ist daher nicht in der Lage die höherfrequenten Fourierkomponenten des vermutlich oberwellenreichen Signals korrekt darzustellen. Zwar hat das L-Netzwerk am Ausgang eine Tiefpasscharakteristik, allerdings keine besonders hohe.

Zusätzlich wurde eine Stromaufnahme von nur rund 2,3 A bei 50 V Betriebsspannung beobachtet. Das entspricht 115 Watt DC-Eingangsleistung. Würde die Ausgangsleistung tatsächlich 100 Watt betragen, entspräche dies einem Wirkungsgrad von ca. 87 %. Der Kühlkörper der Ersatzlast wird in jedem Fall relativ schnell ziemlich warm. Sobald ich ein UKW-taugliches Leistungsmessgerät in die Finger bekomme werde ich dem noch einmal genauer nachgehen. Für die Machbarkeitsanalyse ist aber auch das erstmal egal.

Zusammenfassung

Die Experimente mit dem MRF101AN stimmen mich optimistisch genug um ein passendes Platinenlayout zu entwickeln. Dazu warte ich eigentlich nur auf eine Rückmeldung der Würth Elektronik Unternehmensgruppe ob diese mir die zu den hübschen, Würth-roten WCAP-ATG8 Kondensatoren auch die passenden Spulen zur Verfügung stellen. Zusätzlich sammle ich aktuell Rückmeldungen von meinen Abonnenten ob die Platine zeitgemäß mit SMD-Bauteilen, oder klassisch mit bedrahteten Komponenten geplant werden soll.

Das finale Platinenlayout soll auf jeden Fall – je nach Bestückung – für 6m (50 MHz), 4m (70 MHz), das UKW Rundfunkband, 2m (145 MHz) und eventuell 1,25m (222 MHZ) einsetzbar sein. Meine Tendenz geht aktuell dahin, die Vorspannungsregelung und die Temperatur- / Stromüberwachung auf eine gesonderte Platine auszulagern. Das hätte dann den Vorteil, dass man die Zusatzplatine ziemlich universell auch für andere LDMOS / Leistungs-MOSFETs einsetzen könnte. Beispielsweise für den großen Bruder des MRF101AN, den MRF300AN (300 Watt, 1,8 – 250 MHz).

Links and Sources:

[1] MRF101AN / MRF101BN Datasheet, NXP: https://www.nxp.com/

[2] L-Network impedance matching https://baltic-labor.de

[3] SimSMith, Ward Harriman, AE6TY http://www.ae6ty.com/

 

Wilkinson Leistungsteiler mit Diskreten Bauteilen

Wilkinson Leistungsteiler sind in der Hochfrequenztechnik sehr beliebt. Mit ihnen kann man ein Signal auf mehrere Lasten oder mehrere Signalquellen auf eine Last verteilen. Sie zeichnen sich durch eine hohe Isolation aus und sind im Vergleich zu widerstandsbasierten Alternativen äußerst verlustarm. Dieser Artikel zeigt anhand eines Beispiels wie man einen solchen Wilkinson-Teiler mit diskreten Bauteilen aufbauen kann.

Für dieses Beispiel seien folgende Designparameter gegeben: Ein Wilkinson-Teiler soll ein Signal bei 28 MHz auf zwei verschiedene Lasten verteilen. Die Systemimpedanz beträgt 50 Ohm. Zunächst ein kurzer Blick auf das grundsätzliche Design eines Wilkinson-Teilers basierend auf einem λ/4-Leitungstransformator:

Klassischer Wilkinson-Teiler mit λ/4-Leitungstransformator

Klassischer Wilkinson-Teiler mit λ/4-Leitungstransformator

Der Aufbau ist sehr simpel: Die hohe Isolation zwischen Port 1 und 2 kommt dadurch zustande, dass ein periodisches Signal durch den Widerstand R seinen historischen, um 180° phasenverschobenen Spiegel begegnet. Das liegt daran, dass die Laufzeit durch zwei mal λ/4 lange Leiter einen Phasenunterschied von 180° zum Ursprungssignal aufweist. Der Widerstand ist so zu dimensionieren, dass er doppelt so hoch ist, wie die Systemimpedanz. Bei 50 Ohm Systemen also 100 Ohm.

R = 2Z _0

2Z _0 = 100&

Die Impedanz des λ/4 Leiters ist mit der Wurzel aus 2 multipliziert mit der Systemimpedanz zu bemessen. Für 50 Ohm Systeme entspricht dies einer Impedanz von 70.7 Ohm.

Z = \sqrt{2} * Z _0

\sqrt{2} * 50 = 70,7

Jetzt benötigt man nur noch zwei Leiter mit der exakten, elektrischen Länge einer viertel Wellenlänge (λ/4) bezogen auf die Betriebsfrequenz. Dabei ist der Verkürzungsfaktor für das verwendete Material zu berücksichtigen. Kennt man die Dielektrizitätskonstante des verwendeten Materials, ist die Berechnung sehr leicht. Hierzu gibt selbstverständlich auch kostenlose Software, beispielsweise AppCAD [1]. Für Rogers 4003 material, sieht die Simulation beispielsweise wie folgt aus:

Microstrip line calculation in AppCAD

Microstrip line calculation in AppCAD

Ein Leiter mit der Länge λ/4 bei 28 MHz auf Rogers 4003 Material müsste also rund 1,65 Meter lang sein! Auch wenn die Kosten für Leiterplatten heutzutage sehr gering sind, ist so ein Design natürlich nicht sonderlich platzsparend. Wäre es nicht schön, wenn es eine Ersatzschaltung gebe, die in Punkto Impedanz und Phasenlaufzeit die gleichen Eigenschaften besitzt, wie ein λ/4-Transformator? Ein Pi-Filter aus diskreten Bauteilen ist hierfür genau der richtige Kandidat. Pi-Filter können so bemessen werden, dass sie sich elektrisch exakt wie λ/4-Transformatoren verhalten.

Tauscht man im oben gezeigter Grundschaltung die λ/4-Transformatoren durch je einen Pi-Filter, erhält man folgendes Schaltbild:

Wilkinson Teiler mit diskreten Bauelementen

Wilkinson Teiler mit diskreten Bauelementen

R ist weiterhin mit der zweifachen Systemimpedanz zu bemessen. In diesem Fall also weiterhin 100 Ohm. Die Reaktanz von C und L sind gleich der Impedanz, die ein Leiter mit der Länge λ/4 laut der oben angegebenen Formel haben müsste. In 50 Ohm Systemen also 70,7 Ohm. Mit dieser Information lassen sich die benötigten Induktivitäten und Kapazitäten berechnen:

L = \frac{\sqrt{2} * Z _0}{2 \pi f}

L = \frac{\sqrt{2} * 50}{2 \pi 28 * 10^6} = 401,92 nH

Das ist nah genug an 400 nH, dass ich es dahingehend abrunde. Vor Allem auch aus dem Grund, dass ich zufällig gerade keine 401,92 nH Spulen auf Lager habe. 400 nH wird da deutlich einfacher zu finden sein. Als nächstes werden nun die zu den 400 nH Spulen passenden Kondensatoren berechnet.

C = \frac{(\frac{1}{2 \pi f})^2}{L}

C = \frac{(\frac{1}{2 \pi 28 * 10^6})^2}{400*10^-9} = 80,77 pF

Das Ergebnis wird ebenfalls auf 80 pF abgerundet. Alle mit „C“ bezeichneten Kondensatoren müssen also mit 80 pF bemessen sein. Der mit „2C“ bezeichnete Kondensator Summen-Port (S) hat die doppelte Kapazität, in diesem Fall also 160 pF. Es spricht natürlich überhaupt nichts dagegen tatsächlich zwei 80 pF Kondensatoren am S-Port zu verwenden. Das fertige Design sieht entsprechend wie folgt aus:

Wilkinson-Teiler für eine Betriebsfrequenz von 28 MHz

Wilkinson-Teiler für eine Betriebsfrequenz von 28 MHz

So leicht lässt sich ein Wilkinson-Teiler berechnen. In der Praxis hilft es oft errechnete Bauteilewerte eher ab- anstatt aufzurunden. Das liegt daran, dass parasitäre Kapazitäten und Induktivitäten die Betriebsfrequenz tendenziell eher nach unten verschieben. Durch abrunden der Bauteile lässt sich dieser Effekt zumindest etwas eindämmen.

Fertig aufgebauter Wilkinson-Teiler für eine Betriebsfrequenz von 28 MHz

Fertig aufgebauter Wilkinson-Teiler für eine Betriebsfrequenz von 28 MHz

Links and Sources:

[1] AppCAD: https://www.broadcom.com/appcad

 

Impedanzanpassung mit dem L-Netzwerk

Impedanzanpassung ist eine allgegenwärtiges Herausforderung für Hochfrequenzschaltungen. Das L-Netzwerk ist eine einfache, verlustarme Methode um unterschiedliche Impedanzen aneinander anzupassen. Dieser Artikel soll zeigen wie man ein passendes L-Netzwerk für komplexe Impedanzen berechnet.

Die niedrige Ausgangsimpedanz eines Leistungs-MOSFET an eine höhere Systemimpedanz, beispielsweise 50 oder 75 Ohm, anzupassen ist ein typisches Problem in der Entwicklung von Hochfrequenzschaltungen. Für diesen Artikel passen wir den 75 Ohm Ausgangswiderstand eines Funktionsgenerators an eine 1000 Ω Lastimpedanz bei einer Frequenz von 16 MHz an.

Um die Funktionsweise eines L-Netzwerkes zu erklären, präsentiere ich erst das fertige Netzwerk, erkläre die Funktionsweise und erst danach erkläre ich die Berechnung der einzelnen Komponenten.

L-Netzwerk zur Anpassung von 75 Ohm Quellwiderstand an einen 1000 Ohm Lastwiderstand

L-Netzwerk zur Anpassung von 75 Ohm Quellwiderstand an einen 1000 Ohm Lastwiderstand

RS = Quellwiderstand (75 Ohm)
RL = Lastwiderstand (1000 Ohm)
Ls = Serien-Induktivität (j263)
Cp = Parallel-Kapazität (-j284)

Das kleine „j“ wirkt erstmal etwas befremdlich. Zumindest, wenn man es noch nie zuvor gesehen hat. Das „j“ steht in der Elektrotechnik für die imaginären Einheit i. Da in der Elektrotechnik das kleine „i“ bereits anderweitig belegt ist, hat man sich für die Verwendung von „j“ entschieden. Ein positiver Wert zeigt eine induktive Reaktanz, ein negativer Wert eine kapazitive Reaktanz an. Im Prinzip heißt es nicht Anderes, als dass wir eine Spule (Ls) mit einer Reaktanz von 263 Ohm und einen Kondensator (Cp) mit einer Reaktanz von 284 Ohm verwenden. Da diese Reaktanzen abhängig von der Signalfrequenz sind, ist ein L-Netzwerk nicht sonderlich breitbandig.

Wie schafft es diese Schaltung nun eine 1000 Ohm Last wie 75 Ohm auszusehen und andersrum? Um diese Frage zu beantworten kommen wir um ein wenig Mathematik nicht herum. Fangen wir mit RL und Cp an. Die beiden sind parallel geschaltet. Die daraus resultierende Impedanz errechnet sich wie folgt:

Z = \frac{Xc * R}{Xc + R}

Z = \frac{X_c * R_L}{Xc + R_L} = \frac{-j284 * 1000}{-j284 + 1000} = 75-j263

75 Ohm ist der resistive Anteil an der resultierenden komplexen Impedanz, 263 Ohm der reaktive (kapazitive) Anteil. Das heißt, dass die Parallelschaltung von RL und Cp sich so benimmt als sei ein 75 Ohm Widerstand mit einem Kondensator mit 263 Ohm Reaktanz in Serie geschaltet. Man nennt dies auch die äquivalente Serienimpedanz.

Äquivalente Serienimpedanz von Cp und RL

Äquivalente Serienimpedanz von Cp und RL

Wenn wir diese soeben berechnete äquivalente Serienimpedanz nun in das ursprüngliche L-Netzwerk einbauen, erhalten wir folgendes Ersatzschaltbild:

Ersatzschaltbild nach Wandlung von Cp und RL in eine äquivalente Serienimpedanz

Ersatzschaltbild nach Wandlung von Cp und RL in eine äquivalente Serienimpedanz

Es fällt auf, dass die Serieninduktivität Ls und der äquivalente Serienkondensator nun betragsmäßig die gleiche Reaktanz haben, wenngleich auch mit unterschiedlichen Vorzeichen. Diese beiden Reaktanzen heben sich nun einfach gegenseitig auf. Der Lastwiderstand von 1000 Ohm sieht für den Signalgenerator nun aus wie ein 75 Ohm Widerstand.

Vereinfachtes Ersatzschaltbild der gesamten Schaltung

Vereinfachtes Ersatzschaltbild der gesamten Schaltung

Ein praktischer Nebeneffekt eines solchen L-Netzwerkes ist, dass es eine Tiefpasscharakteristik hat. Beispielsweise beim Anpassen einer LDMOS Endstufe an eine Systemimpedanz von 50 Ohm ist dieser Effekt von Vorteil um Obertonaussendungen zu unterdrücken. Eine Hochpasscharakteristik lässt sich mit einem L-Netzwerk auch realisieren, wenn man die Positionen von Ls und Cp tauscht. An der prinzipiellen Funktionsweise eines L-Netzwerkes würde dies nichts ändern, jedoch müssen die Werte neu berechnet werden.

Wie berechnet man so ein L-Netzwerk nun von Anfang an? Wir nehmen unser Beispiel mit 75 Ohm Quellwiderstand, 1000 Ohm Lastwiderstand und einer Betriebsfrequenz von 16 MHz. Zuerst muss die Kreisgüte, auch Q-Faktor genannt, berechnet werden.

Q = \sqrt{\frac{R_{Last}}{R_{Quelle}}-1}

RLast = Lastwiderstand
RQuelle = Quellwiderstand

Q = \sqrt{\frac{1000}{75}-1} = 3,512

Mit dem berechneten Q-Faktor von 3,512 können wir nun die Reaktanz der Induktivität berechnen.

X_L = Q*R_{Quelle} = 3,512 * 75 = 263

Die verwendete Induktivität soll also eine Reaktanz von 263 Ohm bei 16 MHz haben. Die 263 Ohm können und sollten wir wieder als j263 schreiben um zu unterstreichen, dass es sich hier um eine induktive Reaktanz handelt.

Um die benötigte Reaktanz des Kondensators Cp zu errechnen, wird der Lastwiderstand durch den Q-Faktor geteilt.

X_C = \frac{R_{Load}}{Q} = \frac{1000}{3,512} = 284

Der Kondensator Cp sollte also eine Impedanz von 284 Ohm bei 16 MHz haben. Auch hier können wir das Ergebnis als -j284 schreiben um auf die kapazitive Natur der Reaktanz hinzuweisen.

Zuletzt müssen die errechneten Werte noch in eine konkrete Induktivität und Kapazität bei 16 MHz umgewandelt werden.

L = \frac{X_L}{\omega} = \frac{263}{2 \pi (16*10^6)} = 2,6 \mu H

Die Induktivität sollte also 2,6 μH betragen. Der nächstübliche, käufliche Wert wäre 2,2 μH. Da in der Realität ohnehin ausreichend parasitäre Induktivität in der Schaltung vorhanden sein wird, rechnen wir einfach mit 2,2 μH weiter. Als nächstes wird der Kondensator berechnet:

C = \frac{1}{\omega X_C} =  \frac{1}{2 \pi (16*10^6) 284} = 35 pF

Der verwendete Kondensator Cp sollte also eine Kapazität von 35 pF haben. Auch hier habe ich einfach den nächsten Normwert von 33 pF verwendet. Um die Funktion des Berechneten L-Netzwerkes zu überprüfen, habe ich die Rückflussdämpfung mit einer Messbrücke gemessen. Der Signalgenerator wurde auf eine Ausgangsimpedanz von 75 Ohm eingestellt. Die Messkabel vom Signalgenerator zur Messbrücke und von der Messbrücke zum Oszilloskop, sowie die Messbrücke selbst, sind ebenfalls für eine Systemimpedanz von 75 Ohm ausgelegt.

Die verwendete Messbrücke und das auf einer Steckplatine aufgebaute L-Netzwerk

Die verwendete Messbrücke und das auf einer Steckplatine aufgebaute L-Netzwerk

Ergebnis: Die Schaltung funktioniert exakt so, wie sie soll. Die beste Impedanzanpassung hat diese Schaltung bei 16,1 MHz erbracht. Ein bisschen Abweichung von den Berechnungen war zu erwarten. Vor Allem auch, weil die Bauteilewerte auf die nächsten Normwerte gerundet wurden.

Überblick über den gesamten Messaufbau

Überblick über den gesamten Messaufbau