Bouwproject 2026

TenMeg is een GPS-gedisciplineerde 10 MHz-frequentiereferentie gebouwd rond een Raspberry Pi Pico 2 W. Het idee is even oud als simpel: je hebt een degelijke OCXO die over korte tijd fantastisch stabiel is, maar over uren of dagen alle kanten op drijft, en je hebt een GPS-ontvanger die over de lange termijn praktisch perfect loopt maar van seconde tot seconde een paar honderd nanoseconde springt. Combineer ze, laat de GPS de OCXO continu bijsturen, en je krijgt het beste van beide werelden: een referentie die direct na inschakelen al stabiel is en op de lange termijn meeloopt met de cesium-klokken aan boord van de GPS-satellieten. Deze schakeling heeft twee afzonderlijke 10MHz uitgangen met een uitgangsniveau van ca. 0dBm.
Voor zendamateurs die met smalbandige modes zoals FT8, JT65, WSPR of EME werken, of die transverters gebruiken in de hogere banden, is zo’n 10 MHz-referentie goud waard. Een vrij lopende OCXO zit doorgaans rond 1 ppm; na disciplineren met GPS zit je onder de 1 ppb, dus duizend keer beter. Naast de pure frequentiefunctie kun je je eigen huisnetwerk ook nog eens van een stratum-1 NTP-server voorzien, een NMEA TCP-stream uit de GPS halen voor logsoftware op een andere PC, en alles bedienen via een rotary encoder of via een browser.
De hardware is bewust eenvoudig gehouden. Je hebt een Pico 2 W, een ATGM336H GPS-module met 1 PPS-uitgang, een MCP4725 12-bit I²C DAC voor de elektronische frequentie-controle van de OCXO, een 1.9-inch IPS-display van 320×170 pixels, een rotary encoder, en een paar status-LEDs. De OCXO in dit project is een OSC5A2B02. Een elco van 100 µF over de DAC-uitgang dempt het I²C-geschakel en is verder de hele analoge kant.
De truc om de OCXO bij te regelen zit in het vergelijken van klokpulsen tussen opeenvolgende 1 PPS-flanken van de GPS. Daarvoor wordt het 10 MHz-signaal van de OCXO op een GPIO van de Pico aangesloten waar in hardware een PWM-counter loopt. Die PWM-counter telt continu door, en omdat hij 16 bit is wrapt hij elke 6,55 milliseconde; een interrupt onthoudt dan in software hoe vaak hij over is gegaan, zodat je effectief een 32-bit teller hebt. Eén van de twee Cortex-M33-kernen van de RP2350 zit ondertussen in een nauwe lus de 1 PPS-pin te pollen. Zodra die pin omhoog gaat, wordt de stand van de cycle-counter ingelezen. Het verschil tussen de huidige stand en die van een seconde geleden zou exact 10.000.000 moeten zijn als de OCXO precies op tien megahertz draait; elke afwijking is je frequentiefout in hertz, met een resolutie van 1 Hz per sample. Door over meerdere samples te middelen ga je makkelijk onder één ppb.
Op die ruwe meting zitten een paar filters. Het eerste is een median-of-five filter dat losse uitschieters wegvangt; de 1 PPS-puls heeft typisch een paar honderd nanoseconde ruis, en af en toe een wilde sprong wanneer de GPS bijvoorbeeld een nieuwe satelliet oppakt. Daarna gaat het door een exponentieel voortschrijdend gemiddelde voor de fijne ruis. De gefilterde fout voert een PI-regelaar die de DAC en daarmee de spanning op de OCXO bijregelt. Die PI-regelaar werkt niet met vaste constanten maar met gain-scheduling: bij grote afwijkingen (ACQUIRE-modus) reageert hij snel om binnen een minuut binnen ±5Hz te komen, en zodra dat lukt schakelt hij naar TRACKING-modus met veel zachtere gains zodat je niet over je doel heen schiet. Onder de 0,2 Hz is er een deadband waarin de integrator stilstaat; anders zou hij op de laatste decimaal heen en weer blijven schuiven. Pas wanneer de fout tien seconden achter elkaar onder de 0,5 Hz blijft, gaat de lock-LED branden.
Wat doet het systeem als de GPS-fix wegvalt? Na drie seconden zonder PPS gaat het in holdover-modus. De DAC wordt dan vastgezet op het gemiddelde van de laatste vijf minuten, zodat de OCXO op de laatst-bekende-goede stuurspanning blijft hangen tot het signaal terugkomt. Hierdoor blijft je referentie ook tijdens een korte GPS-onderbreking bruikbaar. Bij een koude start zonder GPS-fix gebeurt dit nadrukkelijk niet; dan blijft hij in LOCKING staan, omdat hij anders een betekenisloze startwaarde zou bevriezen.
De RP2350 heeft twee kernen en die worden bewust gescheiden gehouden. De ene kern doet alleen de regelkring: PPS pollen, cycles tellen, PI rekenen, DAC schrijven. Geen netwerk, geen flash-schrijfacties, niets dat hem kan onderbreken. De andere kern doet al het overige werk: het display tekenen, NMEA-zinnen van de GPS parsen, de encoder uitlezen, de WiFi-stack draaien en al die netwerkdiensten. Wanneer er bijvoorbeeld een instelling naar flash wordt geschreven duurt dat zo’n 30 milliseconde en in die tijd zou de regelkern interrupts missen; door dat werk strikt op de andere kern te houden blijft de meting onverstoord.
Voor de gebruiker betekent dat het volgende. Het display heeft negen pagina’s die je met de encoder doorbladert: een hoofdscherm met EFC-spanning, UTC-tijd, drift en temperatuur; een satellietenpagina met SNR-balken per zichtbare satelliet; een GNSS-overzicht; een grafiek van de cumulatieve fasefout over een uur; een grafiek van de DAC-stand; een Allan-deviatie-pagina met waarden bij τ = 10, 100, 300 en 1000 seconden; een netwerkstatuspagina; een full-screen flipklok in stationsstijl en een GPS-info-pagina met de Maidenhead-locator tot twaalf karakters precisie. Drukken op de encoder opent een menu waarin je de helderheid, de taal (Nederlands, Engels, Duits of Frans), de UTC-offset en de WiFi-instellingen aanpast.
Op het netwerkvlak draait de Pico drie servers tegelijk. Een NTP-server op poort 123, stratum 1, met PPS-verankerde tijd; de subseconde-precisie komt rechtstreeks uit de OCXO-cycleteller en niet uit de interne klok van de Pico, wat ongeveer een microseconde nauwkeurigheid naar je clients oplevert. Een NMEA TCP-server op poort 10110 die de ruwe GPS-stream doorgeeft aan tot vier clients tegelijk; daarmee werken pakketten als VisualGPSView meteen. En een HTTP-dashboard op poort 80 dat dezelfde live data toont als het scherm zelf, met grafieken, ADEV-waarden, NTP request counters en een lock-statusbadge, automatisch bijgewerkt elke seconde, en in dezelfde taal als het OLED.
Bovendien verschijnt de Pico bij aansluiting op een PC zonder enige driver-installatie als zowel een seriële poort als een netwerkadapter. Dat laatste betekent dat je via USB direct via 192.168.7.1 verbinding maakt met al die diensten, zonder dat WiFi überhaupt geconfigureerd hoeft te zijn. Heel praktisch voor portable gebruik of een eerste boot.
Bij de allereerste start zonder geconfigureerd WiFi opent het apparaat een eigen accesspoint genaamd “TenMeg_Setup”. Verbind je telefoon ermee en het captive portal opent vanzelf; een lijstje van zichtbare netwerken met signaalsterkte, je vult je wachtwoord in, slaat op, en de Pico boot opnieuw met je credentials in flash. Vanaf dat moment zie je het IP op de netwerkpagina en kun je direct verder met je dashboard, of de NTP-server koppelen aan bijvoorbeeld de Windows Time-service. Eenmaal aangelegd vergeet je het ding doorgaans, want hij doet wat hij hoort te doen: een stille, accurate 10 MHz in je hele shack en een nauwkeurige tijdbron op je netwerk.
Het bouwproject is geheel open source. Doordat enkele onderdelen voor een hele scherpe prijs zijn ingekocht hebben we de prijs laag kunnen houden. Het pakket kost €60. Er zijn slechts 20 pakketten beschikbaar, dus vergeet je niet op tijd aan te melden. Wanneer er meer dan 20 aanmeldingen zijn, volgt er een loting. De moeilijkheidsgraad is vergelijkbaar met die van de afgelopen jaren. Er worden dan ook geen SMD componenten toegepast.
’73
Sjef PE5PVB
