Amateurfunk verbindet die Welt

GPS-diszipliniertes 10MHz-Normal

Erstellt: DL6GL, 26.09.2020, letzte Änderung 15.09.2022


Gemeinschaftsprojekt von DG1KPN, DL2KHP (†) und DL6GL.



Silent key. Wir trauern um Hans-Peter, DL2KHP. Er ist am 27.04.2022 von uns gegangen.


Mit dem Abschalten von Hans-Peters Website dl2khp.de wäre auch die Arbeit von ihm und Norbert, DG1KPN, zum 10MHz GPS-Frequenznormal verloren gegangen. So haben wir, Norbert und ich, beschlossen, mit Norberts Projektunterlagen diese Seite, die bisher zu Details auf dl2khp.de verwiesen hat, in einer Gesamtdarstellung zu vervollständigen.

Das von DG1KPN und DL2KHP entwickelte GPS gesteuerte 10MHz-Frequenznormal (GPSDO, GPS disciplined Oscillator) besticht durch Einfachheit und Nachbausicherheit. Und das bei Materialkosten von rund 50 EURO.

Die Komponenten sind schnell aufgezählt:

  • NEO-7M GPS-Modul (ca. 6,--€, ebay)
  • Externe GPS-Antenne (ca. 3,--€, ebay)
  • OCXO CTI OSC5A2B02 10MHz 5V (gebraucht, ca. 5,--€ ebay)
  • 3 Logik-IC: 74HCT14, 74HCT390, 74HCT4046, wahlweise HC-Typen
  • 1 OpAmp TLC271CD (SO8)
  • Kleinteile, SMD-Hühnerfutter
  • Internes oder externes 5V-Netzteil, wahlweise USB
  • Platine in Industriequalität hat DH4YM im Programm
  • Gehäuse nach Wahl.


1  Überblick

Inzwischen hat dieses kleine Gerät einige Erweiterungen erfahren, die hier zunächst erläutert werden sollen.

1 Die erste Version bezieht sich auf ein GPS-Modul mit einem UBLOX NEO-7M, das mit dem Programm UBLOX U-Center erstmalig zu konfigurieren ist. Eine 3V-Knopfzelle puffert den internen Speicher für die erstellte Konfiguration. Wenn die Knopfzelle erschöpft ist, muss die Konfiguration, manuell oder mit Hilfe eines gesicherten Files, wiederholt werden. Das Vorgehen ist im Download beschrieben.

2

In der zweiten Ausbaustufe wurde dem GPS-Modul ein Controller zur Seite gestellt, der mit jedem Kaltstart automatisch die Konfiguration vornimmt. Die 3V-Pufferzelle hat damit ausgedient.

Hierzu werden zwei Lösungen angeboten:

2a ATtiny85 oder Arduino NANO mit optionaler Displayanzeige von Andreas, DL5MGD.
Beide führen die Konfiguration des NEO-7M durch,
die NANO Version zeigt zusätzlich die PLL-Regelspannung und die Anzahl der Satelliten auf LCD an.
Schaltungsunterlagen und Software im Download: dl5mgd_startmodul.zip.
Unterstützung hierzu können wir nicht bieten.

2b  ATmega328P auf kleiner Eigenbauplatine oder Arduino NANO mit optionaler Displayanzeige (DL6GL).
Unterlagen (Schaltbilder, Platine, Software) im Download. LCD-Anzeige: PLL-Kontrollspannung und aus den NMEA-Meldungen gewonnene Daten wie Uhrzeit, Datum, geografische Länge, Breite und Höhe sowie Maidenhead-Locator.
Die Software zu (2b) wird bedarfsweise weitergepflegt, etwa im Januar 2022:

Bei einem Nachbauer, der statt des Moduls mit NEO-7M eines mit NEO-M8N eingesetzt hat, funktionierte die NMEA-Auswertung nicht. Der NEO-M8N verwendet in der Voreinstellung ein anderes NMEA-Protokoll, z.B. "$GNRMC" statt "$GPRMC" wie der NEO-7. Nun, ab der Version 1.20, gibt es daher 2 Firmwareversionen, eine mit "GN"-Protokoll für NEO-M8 und eine mit "GP" für NEO-7M.

Wird kein LCD verwendet, ist die Firmwareversion unerheblich. Die Konfiguration für NEO-7 oder NEO-8 ist identisch.

Aktuelle Controller-Firmware: V1.22 (29.07.2022).


2  Hardware

Abb. 2.1: Gesamtschaltbild V3.1.

Schaltungsunterlagen und Gerberdaten sind im Download (10MHz_GPSDO_V31.zip) zu finden.

Das auf den ersten Blick etwas verwirrende Schaltbild hat folgenden prinzipiellen Aufbau:

Abb. 2.2: Vereinfachtes Prinzipschaltbild der PLL.

Das PPS-Ausgangssignal des GPS-Empfängers ist prinzipiell mit einem Phasenjitter behaftet, d.h. die Anstiegsflanken variieren in kleinen statistischen Zeitabständen. Dessen Frequenz kann im NEO-7 konfiguriert werden. Hier statt 10MHz auf 100kHz mit noch tolerierbarem Jitter. Der Phasenkomparator 74HC4046 vergleicht die Frequenz- und Phasendifferenz zwischen dem 100kHz PPS-Signal und dem auf 100kHz geteilten OCXO-Signal (OCXO=Oven Controlled Crystal Oscillator). Mit Integration des Komparatorsignals im PLL Loop filter (R6, R7, C8, C10 mit sehr langer Zeitkonstante) wird der OCXO in der Frequenz auf minimale Abweichung (Lock) nachgeregelt. Die 6 Gatter des 74HC14 Schmitt Triggers werden an mehreren Stellen zur Signalformung eingeschleift, u.a. auch zwischen dem GPS PPS-Ausgang und dem Signal in-Pin 14 des 74HC4046.

74HC4046:

  • Der interne VCO ist mit INH (VCO inhibit, Pin 5) an +5V deaktiviert
  • Die Comparator-Ausgänge Phase Comparator 1 bis 3 sind auf einen Pfostenstecker (PC1 bis PC3 in Abb. 2.1) geführt und können frei gewählt werden. Jumper an Comparator 2 (PC2) hat sich als beste Alternative in Bezug auf stabilen und schnellen Lock erwiesen. Details im 74HC4046-Datenblatt.

Abb. 2.3: U-Blox NEO-7M-Modul. Die aufmontierte GPS-Antenne befindet sich unterhalb.

Das NEO-7M-Modul wird auf der Hauptplatine (GPS-Antenne nach oben) mit Distanzstücken verschraubt. Vorher überlegen, wie die SMA-Winkelbuchse, Abb. 2.3 rechts oben, einzulöten ist. Montage wie in Abb. 2.3 erfordert lange Distanzstücke. Flacher geht es mit Montage auf der anderen Seite als in Abb. 2.3.

Die Knopfzelle, Abb. 2.3 rechts unten, ist auf alle Fälle zu entfernen, indem die rot eingekreiste Halterung aufgelötet wird. Zur Pufferung des internen Speichers hält sie nicht lange durch. Als Ersatz ist auf der Hauptplatine eine Halterung für eine CR2032-Knopfzelle vorgesehen. Diese wird nur gebraucht, wenn auf die automatische Konfiguration mit einem der o.g. Controller verzichtet wird.

Wird die Knopfzelle verwendet, sollte das quadratische Pad auf der Hauptplatine für den Minuspol der CR2032-Zelle für eine sichere Kontaktgabe zusätzlich leicht verzinnt werden. Der Pluspol ist mit einer kurzen Litze mit Kontaktstift an "UBat" auf der Hauptplatine unterhalb des NEO-7M-Moduls zu verbinden (Abb. 2.4 links unten).

Abb. 2.4: Hauptplatine bestückt (Vorläuferversion 3.0).

Abb. 2.5: Innenansicht der Realisierung von DL6GL (noch ohne zusätzlichen Controller).

Auf dem NEO-7M-Modul ist zwar eine GPS-Antenne aufgebracht, sie ist aber, eingebaut in ein Gehäuse, unbrauchbar. Eine externe GPS-Antenne muss freie Sicht haben. Wir haben sie unter dem Dachfirst installiert - Niederführung mit einem guten 50Ω-Koaxkabel. Je nach Tageszeit wurden 9 bis 11 GPS-Satelliten erkannt. Diese Information liefern U-Center oder das ATmega328-Modul u.a. neben der Uhrzeit (UTC) und der Geo-Position.

Für die 5V-Stromversorgung ist ein eigenes Netzteil vorteilhaft (Abb. 2.5). Es ist hier beschrieben. Wahlweise (gut geregeltes) externes 5V-Steckernetzteil oder via USB. Während der Anheizzeit zieht der OCXO maximal etwa 650mA, regelt aber nach 2 Minuten rasch herunter auf stationär ca. 220mA. Die bei ebay für einen Spottpreis erhältlichen CTI OSC5A2B02 10MHz-OCXO sind gebraucht, stammen also aus mehr oder weniger schonenden Ausbauten. Ein Test vor dem Einbau in die Platine ist daher angeraten: Messung des Heizstroms an 5V wie hier zusammen mit dem ausgegebenen 10MHz-Signal.

Abb. 2.6: OCXO Heizstrom.

Es empfiehlt sich, dem OCXO eine kleine Schaumstoffmütze gegen Wärmeverlust zu verpassen. Dazu wurde ein 30x30x25mm-Stück PU-Schaum passend zu den OCXO-Außenabmessungen ausgehöhlt - in Abb. 2.5 entfernt. Norbert hat sein gesamtes Gerät mit kleinen Styroporkugeln gefüllt.

Für die 1μH-Induktivitäten L3 bis L5 für den Sinus-Tiefpass sind auf der Platine SMD-Bauformen vorgesehen. Der besseren Güte wegen wurden stattdessen SMCC-Drosseln eingesetzt.


3  Betrieb und Messungen

Die grüne "GPS Ready"-LED zeigt nach ca. 30 Sekunden an, dass die aus dem GPS 1 PPS-Signal abgeleitete 100kHz-Frequenz zur Verfügung steht. Das bedeutet aber noch nicht, dass der OCXO synchronisiert ist. Hierfür nützlich, aber nicht unbedingt nötig, ist eine Anzeige der OCXO-Regelspannung, im Bild oben mit einem kleinen Profilinstrument. Ein solches bietet nur eine grobe Information. Ein digitales Panelmeter mit Millivoltauflösung wäre besser geeignet, die Konstanz der Regelspannung zu beurteilen. Wird einer der ATmega328-Controller mit LCD verwendet, erfolgt die Anzeige hier. Die Regelspannung des o.g. OCXO ist ca. 2,0 ±0,3V. In der Platinenversion 3.1 von DL2KHP ist dazu ein OpAmp TLC271 als Spannungsfolger vorgesehen. Hier, Abb. 2.5, musste er nachgerüstet werden. Während der Anheizzeit pendelt die Regelspannung, schwingt sich dann nach etwa 5 Minuten auf einen bestimmten Wert ein, beim vorliegenden OCXO auf 1,78V. Ab dann ist die Regelung eingerastet. Die Auswirkung auf die Frequenz zeigt Abb. 3.1.

Abb. 3.1: Frequenzregelung nach einem Kaltstart.

Die nach einer Laufzeit von zwei Tagen erreichte Frequenzkonstanz zeigt folgendes Bild, Referenz Rubidium-Normal, OCXO nicht thermisch isoliert:

Abb. 3.2: Allan Deviation.

Innerhalb einer Zeitspanne für eine Messung von 1 Sekunde ist die Abweichung 4x10-11 = 4x10-5 ppm. Das sind bei 10MHz 0,0004Hz = 0,4mHz (Milli-Hertz).

Obwohl im Tiefpass für den Sinusausgang einfache 1µH MICC-Drosseln verwendet werden, kann sich das Sinussignal, gemessen an den Oberwellen, durchaus sehen lassen.

Abb. 3.3: Oberwellenspektrum des 10MHz Sinusausgangs.

Angaben in dBm. Bezogen auf die Grundwelle mit 12,68dBm Ausgangsleistung ist die erste Oberwelle (Marker 2) um 54,58 dBc unterdrückt, nachfolgende um 60,07 und 67,12 dBc. Die spektrale Reinheit des 10MHz-Sinus ist auch zufriedenstellend.

Abb. 3.4: 10MHz spektrale Reinheit (Rauschglocke, Auflösung 1Hz).


4  Zusätzlicher Controller zur NEO-Konfiguration und Anzeige

Wenn nach gut einem Jahr die Knopfzelle schlapp macht und das Gerät den Betrieb verweigert, hört der Spaß auf. Das Gehäuse aufschrauben, die Batterie wechseln und das gesicherte Konfigurationsfile neu laden wird dann zum Ärgernis, wenn mal eben für einen Versuch das 10MHz-Signal gebraucht wird.

Andreas, DL5MGD, hat damals Hans-Peter zwei Lösungen zur Verfügung gestellt, eine Minimalversion mit einem ATtiny85 und eine mit einem Arduino NANO und LCD-Anzeige. Einzelheiten dazu sind uns nicht bekannt.
Mit Andreas' Genehmigung dürfen wie sie auch hier im Download anbieten.

Eine eigene Lösung mit BASCOM-AVR haben Norbert und ich davon unabhängig für einen ATmega328P entwickelt, wahlweise auf einer eigens zu erstellenden Mini-Platine oder auf einem Arduino NANO mit:

  • Option 1 (minimal): Die "Init-LED" (Abb. 4.2, 4.3) blinkt, während die Konfiguration des NEO-7 durchgeführt wird. Ansonsten richtet der Controller stillschweigend die Konfiguration für den NEO-7 ein.
    Mit der Firmware V1.22 wurde die Init-LED so umprogrammiert, dass sie im Normalzustand leuchtet und nur während der Konfiguration blinkt. Sie kann also die Power-ON-LED ersetzen.
  • Option 2 (vornehmer): Ein 16x2 LCD protokolliert den Konfigurationsvorgang und zeigt wichtige Betriebsparameter an.
    Auch optional ist der mit der Firmwareversion 1.10 (Schaltung Rev. 3, s.u.) hinzugekommene Taster "Display select".
    Mit der Firmwareversion 1.20 wird zuätzlich zu "Alt" (Altitude) der Maidenhead-Locator als "Loc" angezeigt.

Abb. 4.1: LCD-Anzeige von Betriebsdaten.

Die Anzeigen wechseln im Sechssekundentakt. Insbesondere kann die Konstanz der PLL-Regelspannung im zweiten Bild beobachtet werden. Diese wird dem Ausgang Vr des IC4 entnommen und mit dem ADC0 des Controllers gemessen.

Bei Dauerbetrieb geht das Frequenznormal auch noch als Stationsuhr durch. Dazu wurde mit der Schaltung Rev. 3, Platine Rev. 1 und Firmware Rev. 1.10 ein Taster "Display select" zugefügt, der einen der vier Anzeigeblöcke, etwa den ersten in Abb. 4.1 fixiert.

Wer am Quellprogramm noch Hand anlegen will, kann mit einer gesonderten seriellen Schnittstelle ("Serial Com") die empfangenen NMEA-Meldungen "GPRMC", "GPGGA" und ggf. die binären UBX-Konfigurationsmeldungen des NEO-7 mit einem Terminalprogramm, z.B. PuTTY, ansehen. Diese Ausgaben wurden nur für Testzwecke verwendet und anschließend auskommentiert.

Die Fuse-Einstellungen und das .hex-File werden über die ISP-Schnittstelle geladen, Quelle, .hex und nähere Beschreibung im Download in NEO-7 Controller Dokumentation_RevX.zip.

Aktuelle Schaltungen:

Abb. 4.2: Schaltplan der Spezialplatine-Rev3.

Danke an Henk, PA0HAH, für den Hinweis auf den in den vorherigen Schaltplänen falsch gepolten 3,3V-Levelshifter. Die Platine ist korrekt.

Abb. 4.3: Schaltplan mit Arduino NANO-Rev.2.

Die serielle Kommunikation mit dem NEO-7 erfolgt über die Hardware-UART TXD/RXD. Ob die UART-Ports des NEO-7 5V-tolerant sind, konnte der Dokumentation von U-Blox nicht zweifelsfrei entnommen werden. In der Version in Abb. 4.2 ist daher mit R1/R2 ein Levelshifter zur Vorsicht angeordnet. Die UART-Ports TX1/RX0 beim Arduino sind über 1k-Längswiderstände herausgeführt, so dass nach (fast) allen Quellen im Web eine direkte Verbindung möglich ist. DG1KPN hat es ausprobiert. Der 3,3V TXD-Level vom NEO-7 ist ausreichend zur Ansteuerung des RXD-Ports des ATmega328P.

Controller Schaltungs- und Firmware-Updates

V1.10 05.12.2021
Schaltung: Display select-Taster und R6 zugefügt (unkritisch, ≥10k)
Damit kann die Anzeige eines der vier Anzeigenblöcke (Abb. 4.1) angehalten werden.
V1.20 05.01.2022
  • Henk, PA0HAH, hat statt eines NEO-7M-Moduls ein GPS-Modul mit NEO-M8N eingesetzt und dabei festgestellt, dass die NMEA-Protokolle die Talker-ID "GN" statt "GP" verwenden. Beim NEO-M8N ist die Voreinstellung "Any combination of GNSS" mit Talker-ID = "GN". Beim NEO-7M ist die Voreinstellung "GPS, SBAS, QZSS" mit Talker-ID = "GP". Der Workaround von Henk war Anlass, die V1.20 aufzulegen.
  • Die Firmware ab V1.20 liegt in 2 Versionen vor:
    - GPS-Controller_120_7: für NEO-7 mit NMEA Talker-ID = "GP", z.B. "$GPRMC",
    - GPS-Controller_120_8: für NEO-8 mit NMEA Talker-ID = "GN", z.B. "$GNRMC" .
    Sie unterscheiden sich nur in einem Softwareschalter für die Talker-ID.
    Der ATmega328P hätte noch freie Pins, über die mit Jumpern entsprechende Einstellungen vorgenommen werden könnten. Dann wäre aber die Kompatibilität mit dem ursprünglichen Design verloren gegangen, Zorn von Nachbauern inbegriffen.
    Die Wahl einer der beiden Versionen ist nur dann von Bedeutung, wenn das LCD zur Anzeige der Betriebsdaten aus den NMEA-Protokollen (Abb. 4.1) verwendet wird.
    Die Konfiguration eines NEO-7 oder -8 ist identisch.
  • Neu hinzu gekommen ist der Maidenhead (QTH) Locator mit einer Auflösung von 8 Zeichen in der vierten LCD-Anzeige (Abb. 4.1). 

V1.21 12.01.2022
Kosmetik: Anzeige "Lat" und Long" (Abb. 4.1) sind für eine bessere Lesbarkeit am Dezimalpunkt ausgerichtet.
V1.22 29.07.2022
Da hätte ich schon früher drauf kommen können, dass eine zusätzliche (optionale) Init-LED zu viel Aufwand ist, um für ein paar Sekunden zu blinken. Deren Ansteuerung wurde nun so geändert, dass sie im Normalzustand leuchtet und nur während der Konfiguration des NEO-Bausteins blinkt. Sie kann also die Power-ON-LED am Netzteil ersetzen. Zu beachten: Die Init-LED in Abb. 4.2 ist ein 2mA-Typ mit Vorwiderstand R5=1k5. In Abb. 4.3 ist sie ein 20mA-Typ mit Vorwiderstand R1=220R (2mA wie in Abb. 4.2 wäre sparsamer und schonender für den AVR).


Meine Geographie-Kenntnisse waren nun doch mit der Zeit recht verschüttet. Als Nachhilfe musste ich zur Locatorberechnung erst einmal das Web befragen. Was ich dabei herausgefunden habe, ist im Download in einem kurzen Abriss dokumentiert.
Nur mal um zu sehen, wie das zu Fuß geht - just for fun - können in einem Excel-Sheet der Maidenhead Locator aus den Längen-/Breiten-Koordinaten berechnet werden oder auch umgekehrt die Längen-/Breiten-Koordinaten aus dem Locator. Allerdings nicht so vornehm mit Weltkartendarstellung, wie viele Beispiele im Netz das können.


Download                     

GPS-Modul NEO-7M mit U-Center konfigurieren.pdf    

OCXO CTI OSC5A2B02 Datasheet.pdf

10MHz_GPSDO_V31.zip

dl5mgd_startmodul.zip

neo-7-controller-dokumentation_Rev6.zip

Anmerkungen zum Maidenhead-Locator.pdf

Maidenhead Locator_1.01.xlsx