Geo­me­trie für Anfänger

Der Hori­zont­ab­stand

Gera­de war ich mal wie­der ein paar Wochen im Urlaub und zwar am Mit­tel­meer. Wenn man so die Schif­fe beob­ach­tet, kommt immer wie­der die Fra­ge auf, wie weit die eigent­lich weg sind.

Das ist unter den übli­chen Ver­ein­fa­chun­gen (Erde als Kugel, ruhi­ge See etc.) eine ein­fa­che geo­me­tri­sche Aufgabe:

Der Hori­zont­ab­stand mit dem Satz des Pytha­go­ras berechnet

a ist der gesuch­te Abstand zum Hori­zont, h die Beob­ach­tungs­hö­he und r der Erd­ra­di­us. Mit dem Satz des Pytha­go­ras lässt sich der Hori­zont­ab­stand also ein­fach bestimmen:

Durch Auf­lö­sen der Klam­mer ergibt sich

Wenn die Beob­ach­tungs­hö­he sehr viel klei­ner ist als der Erd­ra­di­us, dann lässt sich die­se For­mel ver­ein­fa­chen zu:

Durch Ein­set­zen des Erd­ra­di­us von unge­fähr 6371 km ergibt sich dann:

Damit kann man arbei­ten. Als Faust­for­mel ergibt sich der Hori­zont­ab­stand in Kilo­me­ter damit zu 3,6 * der Qua­drat­wur­zel aus der Beob­ach­tungs­hö­he in Meter.

Bei­spiel: im oben gezeig­ten Foto sei die Beob­ach­tungs­hö­he etwa 10 m und damit der Abstand der Schif­fe am Hori­zont etwa 11 km (Auf­nah­me ist gezoomt). Da das sowie­so nur eine gro­be Schät­zung ist, muß man es mit den Zah­len nicht so genau neh­men. Nimmt man statt 3,6 den Fak­tor 4 und als Wur­zel aus 10 eine 3, dann kommt man auf 12 km Abstand, was als Schät­zung genau­so gut ist, wie die 11 km. Ande­res Bei­spiel: man steht als 2‑m-Mann mit den Füßen am Ufer ein paar Zen­ti­me­ter über der Was­ser­ober­flä­che. Der Hori­zont ist dann 1,4 * 3,6 km ent­fernt, also 5 km im Rah­men der Schätzung.

Wozu ist das jetzt gut?

Sovie­le Schif­fe kom­men hier ja nicht vor­bei. Auch für Funk­wel­len im UKW-Bereich und dar­über gilt die qua­si-opti­sche Aus­brei­tung. Im ebe­nen Gelän­de mit einem Funk­ge­rät in der Hand kön­nen wir also nicht viel mehr Reich­wei­te als die 5 km des obi­gen Bei­spiels erwar­ten. Die ver­dop­pelt sich, wenn die Gegen­sta­ti­on auch 2 m über dem Boden arbei­tet. Mit einer Anten­nen­hö­he von 16 m schaf­fen wir dann schon 15 km, bzw. das Dop­pel­te, wenn die ande­re Anten­ne auch so hoch ist.

Glück­li­cher­wei­se ist die Erde kei­ne exak­te Kugel son­dern hat Abwei­chun­gen in Form von Hügeln und Ber­gen. Mein Wohn­ort liegt z.B. in gut 400 m Höhe, was eine Reich­wei­te von 3,6 * 20 = 72 km ver­spricht. Das ist schon nicht schlecht, denn bekannt­lich geht ja durch Refle­xio­nen und Beu­gung auch immer ein biss­chen mehr, zumin­dest wenn nicht wei­te­re Ber­ge dazwi­schen sind. Die Zug­spit­ze ist unge­fähr 3000 m hoch, so daß ihr Hori­zont 200 km weit weg ist. Das ergibt zusam­men mit mei­nem Hori­zont also gut 270 km, aber tat­säch­lich ist sie Luft­li­nie etwa 360 km ent­fernt. Das ist aber immer­hin nahe genug, um bei guten Bedin­gun­gen, wenn auch ver­rauscht, das Zug­spitz­re­lais auf 2m zu hören. Beu­gung macht’s möglich.

Eine ande­re Anwen­dung die­ser Faust­for­mel ist die Sicht­wei­te aus einem Flug­zeug. Aus einem Air­li­ner in 10 km Flug­hö­he kann man also 3,6 * 100 = 360 km Sicht­wei­te erwar­ten, die in aller Regel wegen des Zustands der Atmo­sphä­re nicht mög­lich ist. Ein Klein­flug­zeug fliegt in Deutsch­land in maxi­mal 10000 Fuß Höhe (mit klei­nen Aus­nah­men bei­spiels­wei­se in der Gegend der Zug­spit­ze), oft eher unter 3000 Fuß, also 1 km. Die Reich­wei­te des Funk­ge­räts ist daher auf etwa 100 km begrenzt, liegt in der Pra­xis aller­dings in der Regel eher bei eini­gen 10 km.

…und noch der mili­tä­ri­sche Aspekt

Die­sel­ben Betrach­tun­gen gel­ten natür­lich auch für Radar. Bekannt­lich üben Mili­tärs ger­ne den Tief­flug „in Baum­wip­fel­hö­he“. Neh­men wir hier mal eine Höhe von 100 m an, dann kön­nen sie vom Radar erst erfasst wer­den, wenn sie weni­ger als 36 km ent­fernt sind. Neh­men wir an, sie flie­gen nahe­zu mit Schall­ge­schwin­dig­keit, dann ergibt sich dar­aus eine Vor­warn­zeit von weni­ger als zwei Minuten.

Die­se Tat­sa­che führt zum Ein­satz von Über­ho­ri­zont-Rada­ren (OTH-Rada­re), die uns Funk­ama­teu­ren mit­un­ter das Leben auf Kurz­wel­le so schwer machen. Aber das ist ein ande­res Thema…

Richt­kopp­ler V1.7

Wie hier schon beschrie­ben habe ich eine wei­te­re Vari­an­te eines Sont­hei­mer-Fre­de­rick-Richt­kopp­lers gebaut. Sie hat den pas­sen­den Abstand der SMA-Buch­sen, um direkt an das Gam­ma-Mess­ge­rät ange­schraubt zu wer­den. Bei­de Lei­ter­plat­ten sind nun ver­füg­bar und hier zunächst die Beschrei­bung und die Meß­er­geb­nis­se zum Koppler.

Detail­an­sicht

Hier noch­mal die KiCad-3D-Ansicht und ein paar Detailfotos:

Dies­mal wur­den Ring­ker­ne des Typs FT 50–43 mit einem AL-Wert von 440nH/Wdg² ver­wen­det. Sie haben jeweils 20 Win­dun­gen und damit eine Eigen­in­duk­ti­vi­tät von 176 µH. Sie trans­for­mie­ren die Lei­stung auf ein vier­hun­dert­stel, was rech­ne­risch einen Kopp­lungs­ver­lust von 10*log(400)=26 dB erwar­ten lässt.

Als inne­re „Wick­lung mit einer Win­dung“ wur­de ein kur­zes Stück RG400 Koax­ka­bel ein­ge­setzt, das gegen­über RG58 den Vor­teil hat, nicht so hit­ze­emp­find­lich zu sein. Man kann recht sorg­los mit dem Löt­kol­ben han­tie­ren. Außer­dem ist die Schir­mung deut­lich dich­ter, was der Iso­la­ti­on zugu­te kommt.

Mess­ergeb­nis­se

Hier die Meß­er­geb­nis­se, die direkt mit den vor­he­ri­gen hier und hier zu ver­glei­chen wären:

Die Richt­schär­fe ist der wich­tig­ste Para­me­ter eines Richt­kopp­lers. Sie gibt das Ver­hält­nis der bei idea­ler Anpas­sung gemes­se­nen Rück­lauf­span­nung im Ver­hält­nis zur Vor­lauf­span­nung an. Die rück­lau­fen­de Span­nung soll­te unter idea­len Ver­hält­nis­sen null sein, was in der Pra­xis aber nicht erreich­bar ist. Die hier vor­ge­stell­te Ver­si­on 1.7 erreicht für den gesam­ten Kurz­wel­len­be­reich eine Richt­schär­fe von bes­ser als ‑43 dB und selbst im 4‑m-Band noch knapp ‑34 dB. Das sind für den hier beab­sich­tig­ten Zweck mehr als gute Wer­te. Selbst für das 2‑m-Band wer­den noch ‑20 dB erreicht.

Der Kopp­lungs­ver­lust liegt bis in das 4‑m-Band bei den errech­ne­ten 26 dB. Dar­über fällt er etwas stär­ker ab, als bei dem vor­he­ri­gen Ver­suchs­auf­bau mit FT50-61 Ring­ker­nen. Zwei Deka­den abzu­decken ist ja auch nicht ganz selbstverständlich.

Die Durch­gangs­dämp­fung liegt mit 0,02~0,04 dB hart an der Gren­ze der Meß­ge­nau­ig­keit des ver­wen­de­ten Netz­werk­ana­ly­sa­tors. Idea­ler­wei­se wären hier 0,01 dB zu erwar­ten (10*log(1–1/400)).

Der inne­re blaue Kreis im Smith-Dia­gramm kenn­zeich­net ein SWR von 1,25. Im gesam­ten Bereich zwi­schen 1,8 MHz und 150 MHz liegt das SWR bei 1,02 bis maxi­mal 1,07

Das KiCad-Pro­jekt

Zusam­men­fas­sung

Der hier vor­ge­stell­te Richt­kopp­ler ist für den vor­ge­se­he­nen Ein­satz­zweck bis hin­auf zum 4‑m-Band sehr gut geeig­net. Wer bis in das 2‑m-Band arbei­ten will, soll­te eher den FT 50–61 Ring­kern neh­men, was auf Kosten des 160-m-Ban­des gehen könn­te. Even­tu­ell sind dann 22 bis 24 Win­dun­gen als Kom­pro­miss angemessen.

Vor­schau

Auch der oben schon gezeig­te Kopp­ler funk­tio­niert nun sehr gut. Die Ein­gangs­si­gna­le wer­den bis etwa ‑40 dBm erkannt und bis sind bis etwa ‑30 dBm gut mess­bar. Ich wer­de noch eini­ge Meß­rei­hen durch­zie­hen und dann hier berich­ten. Vor­ab schon­mal die Mes­sun­gen der Eingangsreflexion:

Gam­ma-Mess­ge­rät – 1st Release

Nach­dem der Pro­to­typ nun zuver­läs­sig funk­tio­niert, habe ich das Design des ersten Releases fer­tig­ge­stellt. Es über­nimmt die Funk­tio­nen des Pro­to­typs, ver­zich­tet aber auf nicht not­wen­di­ge Debug-Steck­ver­bin­der und ‑Schnitt­stel­len. Das Tang Pri­mer 25K Basis-Board wird nicht mehr unter­stützt, son­dern ledig­lich das Tang Pri­mer 25K Core-Board. Die­ses Core-Board muß dann extern auf einem Basis-Board pro­gram­miert und umge­steckt wer­den. Phy­si­ka­li­sche seri­el­le Schnitt­stel­len wie USB, Blue­tooth und RS485 sind ent­fal­len. Bei Bedarf müs­sen sie ander­wei­tig ange­schlos­sen wer­den. RxD und TxD wer­den als 3.3V-TTL-Signale zur Ver­fü­gung gestellt.

Der Feh­ler des Pro­to­typs mit dem Leck­strom in den Kom­pa­ra­to­ren wur­de mit einem Ope­ra­ti­ons­ver­stär­ker (hof­fent­lich) aus­ge­bü­gelt. Das Board geht in Kür­ze in Produktion.

Ansich­ten und Design-Dateien

Die 3D-Ansich­ten…

3D-Ansich­ten des ersten Releases

und hier der Schalt­plan und das KiCad-Projekt:

Kurz­be­schrei­bung

Die Dämp­fungs­glie­der am Ein­gang sind jetzt für eine maxi­ma­le Ein­gangs­lei­stung von 27 dBm (500 mW) aus­ge­legt. Dem nega­ti­ven Ein­gang der Kom­pa­ra­to­ren ist nun jeweils ein rausch­ar­mer Prä­zi­si­ons-OpAmp vom Typ OPA376 als Span­nungs­fol­ger vor­ge­schal­tet. Der soll­te die Span­nungs­ver­schie­bung durch den Ein­gangs­leck­strom der Kom­pa­ra­to­ren kom­pen­sie­ren. Für OpAmp und Kom­pa­ra­to­ren wären auch jeweils Vari­an­ten mit zwei Ein­hei­ten in einem Gehäu­se ver­füg­bar. Um eine best­mög­li­che Ent­kopp­lung der bei­den Kanä­le zu errei­chen, wur­de auf deren Ein­satz aber verzichtet.

J7 dient der Span­nungs­ver­sor­gung und der seri­el­len Kom­mu­ni­ka­ti­on mit der Außen­welt. Hier kann zu Test­zwecken ein USB-Seri­ell-Kon­ver­ter direkt ange­steckt wer­den. Um einen gewis­sen Schutz gegen Ver­po­lung zu errei­chen, sind in die Daten­lei­tun­gen seri­el­le Wider­stän­de von 330 Ω ein­ge­fügt. Die Span­nungs­ver­sor­gung ist mit einer Ther­mo­si­che­rung und einer TVS-Diode gesi­chert. J3 und J6 stel­len ein paar Signa­le des FPGAs zur Ver­fü­gung. Wenn alles auf Anhieb funk­tio­niert, sind sie unnötig.

Die Kanä­le wur­den jetzt mit Port1 und Port2 bezeich­net. Sie sind ja gleich­ar­tig auf­ge­baut und die Soft­ware ent­schei­det, wel­cher Port die vor­lau­fen­de und wel­cher die rück­lau­fen­de Span­nung aufnimmt.

Kopp­ler V1.7

Anders als ursprüng­lich geplant wur­de der Kopp­ler nicht auf die­ses Board inte­griert. Statt­des­sen habe ich einen pas­sen­den Kopp­ler ent­wor­fen, nun­mehr die Ver­si­on 1.7, der den pas­sen­den Port­ab­stand hat, so daß er direkt an das Mess­ge­rät ange­schraubt wer­den kann. Hier die 3D-Ansicht:

Anten­nen­kopp­ler V1.7

Für J3 und J4 wer­den tat­säch­lich männ­li­che SMA-Schraub­ver­bin­der mon­tiert, die aber hier man­gels 3D-Modell nicht dar­ge­stellt sind. Der Abstand ist pas­send zum Mess­ge­rät gewählt.

Für die Tra­fos wird hier RG400 Koax­ka­bel mit blau­em Außen­man­tel ein­ge­setzt. Es hat etwa den glei­chen Außen­durch­mes­ser wie RG58, nutzt aber PTFE als Iso­la­tor und einen tem­pe­ra­tur­fe­sten Außen­man­tel. Es brut­zelt daher beim Löten nicht gleich weg.

Erfah­run­gen zum Bau der Trafos

Zwi­schen­zeit­lich habe ich eini­ge wei­te­re Ver­suchs­auf­bau­ten mit den vor­he­ri­gen Kopp­ler­va­ri­an­ten gemacht. Die habe ich bis­her nicht hier doku­men­tiert. Es sieht im Moment so aus, daß die Vari­an­te mit FT 50–61 Ring­kern und nur 20 Win­dun­gen den besten Fre­quenz­gang von 160m bis in den UKW-Bereich hat. Die Kop­pel­dämp­fung beträgt 26 dB (1:20²) was für ein stär­ke­res Signal am Mess­ein­gang sorgt und gleich­zei­tig den Ver­lust gering hält (250 mW Ver­lust bei 100 Watt Sen­der­aus­gangs­lei­stung). Der ein­zi­ge klei­ne Nach­teil ist der, daß auf­grund der rela­tiv nied­ri­gen Induk­ti­vi­tät der induk­ti­ve Wider­stand der Spu­len bei 1,8 MHz grenz­wer­tig ist. Hier kann man wei­ter opti­mie­ren und ent­we­der ein paar weni­ge Win­dun­gen mehr auf­brin­gen (22~24) oder doch wie­der auf den FT 50–43 Ring­kern zurück­grei­fen. Höhe­re Win­dungs­zah­len wür­de ich in bei­den Fäl­len ver­mei­den. Sie trei­ben die Induk­ti­vi­tät hoch und ver­rin­gern die Selbst­re­so­nanz­fre­quenz. Bei­des ist für die 4‑m- und 6‑m-Bän­der ungünstig.

Hier die Meß­er­geb­nis­se ohne wei­te­ren Kommentar:

Gam­ma-Mess­ge­rät – Inbetriebnahme

Ein­lei­tung

Der im vori­gen Bei­trag bereits ange­kün­dig­te RTL-Code für das FPGA und die zuge­hö­ri­ge Firm­ware sind jetzt funk­ti­ons­fä­hig und soweit, daß man bei­des vor­zei­gen kann. Es ist noch der eine oder ande­re Test­code ent­hal­ten, daher ist bei­des noch nicht als „Release“ gekenn­zeich­net. Außer­dem soll es noch ein paar Ände­run­gen in der näch­sten Revi­si­on der Lei­ter­plat­te geben.

Nach ein paar grund­le­gen­den Bemer­kun­gen zum Mess­prin­zip wird nach­fol­gend zuerst der Ver­i­log-Code beschrie­ben, anschlie­ßend die Soft­ware und zum Abschluss wer­den ein paar Bei­spiel­mes­sun­gen mit einem Signal­ge­nera­tor gezeigt. Am Ende des Bei­trags fol­gen noch ein paar Anmer­kun­gen zum PicoRV32-Risc-V-Core.

Das ver­wen­de­te Tool zum Erstel­len des FPGAs ist der Gowin FPGA Desi­gner V1.9.11.01. Für die Soft­ware­er­stel­lung wird GMD (Gowin for Embedded C/C++ Deve­lo­pers), Ver­si­on: 2025.01 verwendet.

Als Refe­renz soll hier zunächst noch­mal das Block­dia­gramm aus dem vori­gen Bei­trag gezeigt wer­den, weil sich die nach­fol­gen­den Erklä­run­gen dar­auf beziehen:

Das Mess­prin­zip

Die vor- und rück­lau­fen­den Ana­log­si­gna­le wer­den in den Kom­pa­ra­to­ren digi­ta­li­siert und anschlie­ßend im FPGA digi­tal aus­ge­wer­tet. Hier ist exem­pla­risch ein Timing­dia­gramm für ein 10-MHz-Signal und eine Abta­stung mit 200 MHz gezeigt:

Oben wird das vor­lau­fen­de Signal und dar­un­ter das reflek­tier­te und um 90° pha­sen­ver­scho­be­ne rück­lau­fen­de Signal gezeigt. Die drit­te und vier­te Kur­ve zei­gen jeweils das digi­ta­li­sier­te Signal und danach ist das exklu­siv-ver­o­der­te Pha­sen­dif­fe­renz­si­gnal dar­ge­stellt, aus dem die Pha­sen­ver­schie­bung bestimmt wird. Das Abtast­si­gnal hat eine deut­lich höhe­re Fre­quenz, in die­sem Fall 200 MHz.

Ein Mess­in­ter­vall dau­ert typi­scher­wei­se zwi­schen 10 und 100 ms. Wäh­rend die­ses Inter­valls wer­den ver­schie­de­ne Zäh­ler unter bestimm­ten Bedin­gun­gen mit dem Takt des Abtast­si­gnals hoch­ge­zählt und am Ende des Mess­in­ter­valls von der CPU aus­ge­le­sen und aus­ge­wer­tet. Beim Start des näch­sten Mess­in­ter­valls wer­den die­se Zäh­ler auto­ma­tisch wie­der gelöscht und star­ten bei null.

Pha­se Dif­fe­rence Coun­ter PDC

Alle Zäh­ler sind im Modul „Reflection_Measurement“ in der Datei „RefMeas.v“ defi­niert. Der Pha­se Dif­fe­rence Coun­ter PDC wird immer dann inkre­men­tiert, wenn das Pha­sen­dif­fe­renz­si­gnal auf high liegt, wenn also bei­de Ein­gangs­si­gna­le ver­schie­den sind. Am Ende des Mess­in­ter­valls zeigt das Ver­hält­nis des PDC-Zäh­ler­stan­des zur Gesamt­an­zahl der Tak­te wäh­rend des Inter­valls also die Pha­sen­ver­schie­bung zwi­schen den Ein­gangs­si­gna­len an.

Edge Coun­ter EC

Die Pha­sen­mes­sung mit dem Pha­se Dif­fe­rence Coun­ter lie­fert ein zwei­deu­ti­ges Ergeb­nis, denn eine nega­ti­ve Pha­sen­ver­schie­bung führt zu dem­sel­ben Zäh­ler­stand, wie eine posi­ti­ve Ver­schie­bung. Die­se Mehr­deu­tig­keit löst der Edge Coun­ter EC auf. Die­ser Zäh­ler wird dann inkre­men­tiert, wenn das rück­lau­fen­de Signal bei einer stei­gen­den Flan­ke des vor­lau­fen­den Signals low ist. Ein wei­te­rer gleich­ar­ti­ger Zäh­ler wird dann inkre­men­tiert, wenn das vor­lau­fen­de Signal bei einer stei­gen­den Flan­ke des rück­lau­fen­den Signals low ist. Am Ende der Mes­sung trifft die CPU eine Mehr­heits­ent­schei­dung und bestimmt so das Vor­zei­chen der Pha­sen­ver­schie­bung. Bei 0° und 180° kommt es hier zu Unsi­cher­hei­ten, die aber im Rah­men der Mess­ge­nau­ig­keit liegen.

Fre­quen­cy Coun­ter FC1 und FC2

Die bei­den Fre­quenz­zäh­ler FC1 und FC2 wer­den immer dann inkre­men­tiert, wenn eine stei­gen­de Flan­ke auf dem jewei­li­gen Ein­gangs­si­gnal fest­ge­stellt wur­de. Aus dem Zäh­ler­stand am Ende der Mes­sung bestimmt die CPU dann die jewei­li­ge Frequenz.

Die­se Fre­quen­zen sind natur­ge­mäß gleich, weil das rück­lau­fen­de Signal ja vom vor­lau­fen­den Signal abge­lei­tet ist. Bei nahe­zu idea­ler Anpas­sung geht aber der Pegel des reflek­tier­ten Signals immer wei­ter gegen null und die gemes­se­ne Fre­quenz genau­so. Der Ver­gleich die­ser Fre­quen­zen ist daher ein Maß für die Zuver­läs­sig­keit der Pha­sen­mes­sung. Wei­chen sie (deut­lich) von­ein­an­der ab, ist die Pha­sen­mes­sung mit den oben genann­ten Regi­stern ungültig.

High und Low Counter

Im unten vor­ge­stell­ten Design sind noch vier wei­te­re Zäh­ler imple­men­tiert, die im Block­dia­gramm nicht gezeigt sind und zukünf­tig ent­fal­len sol­len: F‑High, F‑Low, R‑High und R‑Low. Die High-Zäh­ler wer­den inkre­men­tiert, wenn das ent­spre­chen­de Ein­gangs­si­gnal bei stei­gen­der Flan­ke des Abtast­tak­tes high ist, die (red­un­dan­ten) Low-Zäh­ler dann, wenn das Signal low ist. Wie im Bei­trag „Gam­­ma-Mes­s­­ge­rät – Nach­trag zu den Mes­sun­gen“ beschrie­ben wur­de, gibt es beim Pro­to­typ einen Off­set in der Ver­gleichs­span­nung der Kom­pa­ra­to­ren. Das führt dazu, daß die Umschalt­pe­gel der Kom­pa­ra­to­ren vom Null­durch­gang der Ein­gangs­si­gna­le ver­scho­ben ist. Der Effekt ist nach­fol­gend etwas über­trie­ben dargestellt:

Als Fol­ge davon sind die erkann­ten posi­ti­ven Halb­wel­len kür­zer als die nega­ti­ven Halb­wel­len. Die­ser Feh­ler ist bei hohen Ein­gangs­pe­geln gering, wird aber immer höher, je wei­ter die Pegel sin­ken. Am Ende des Mess­in­ter­valls zei­gen die Zäh­ler­stän­de also die Dau­er der high- und low-Pha­sen an, also die Qua­li­tät des jewei­li­gen Signals.

Wei­te­re Funk­ti­ons­blöcke im FPGA

Inter­vall Timer T1

T1 ist ein ein­fa­cher Inter­vall Timer, der auto­ma­tisch nach einer ein­stell­ba­ren Zeit einen CPU-Inter­rupt gene­riert. Er wird im Bei­spiel­code auf 10 ms ein­ge­stellt. Anders als der in der CPU ein­ge­bau­te Timer, muß er nach dem Aus­lö­sen eines Inter­rupts nicht wie­der neu initia­li­siert wer­den. Damit wird also unab­hän­gig von der Inter­rupt-Ant­wort­zeit ein festes zeit­li­ches Raster erzeugt, zumin­dest solan­ge kei­ne Inter­rupts ver­lo­ren gehen.

Asyn­chro­ner Trans­mit­ter ATx

In der CPU kön­nen zwei ver­schie­de­ne UARTs ange­legt wer­den, ein „simp­le UART“ und ein „WB UART“. Kei­nes davon ist beson­ders gut doku­men­tiert, so daß es mir nicht auf Anhieb gelun­gen ist, einen Inter­rupt aus­zu­lö­sen, wenn der Sen­de­puf­fer leer ist. Da zum Sen­den der Mess­wer­te nur ein Trans­mit­ter nötig ist, schien es mir ein­fa­cher, einen eige­nen asyn­chro­nen Sen­der zu schrei­ben. Ich habe ihn ATx genannt, nicht UART, weil er weder uni­ver­sell ist noch einen Emp­fän­ger beinhal­tet. Immer­hin ist er gepuf­fert und löst einen Inter­rupt aus, sobald der Puf­fer ins Schie­be­re­gi­ster über­tra­gen wird. Die Baud­ra­te ist von der CPU ein­stell­bar. Es wird ein Stopp­bit gene­riert und Pari­ty ist nicht unterstützt.

Der RTL Code

Die oben im Block­dia­gramm gezeig­ten und anschlie­ßend erklär­ten Funk­tio­nen wur­den in Ver­i­log geschrie­ben und für das FPGA syn­the­ti­siert. Hier ist das gesam­te kom­pri­mier­te Gowin_V1.9.11.01 FPGA Desi­gner Pro­jekt inklu­si­ve der vom IP Core Gene­ra­tor erzeug­ten Modu­le. Mit wel­chen Para­me­tern die­se Modu­le erzeugt wur­den steht in src/readme.txt.

Das Top-Level Design fin­det sich in der Datei „Antennenkoppler.v“. Hier wer­den die FPGA-Pins defi­niert, die auf dem Pro­to­ty­pen­board ange­schlos­sen sind. Außer den gene­rier­ten Modu­len wer­den die Modu­le „Reflection_Measurement“, „ATx“ und „Inter­val­Ti­mer“ instan­zi­iert. Deren Quell­code fin­det sich in den ent­spre­chen­den Datei­en im sel­ben Verzeichnis.

Das Top-Level-Modul gene­riert die Reset-Signa­le für die CPU und die Refle­xi­ons­mes­sung, sowie die Signa­le für das Wish­bo­ne-Memo­ry-Inter­face. Es defi­niert auch die Signa­le für die Adress-Deco­die­rung. Wei­te­re Erläu­te­run­gen fin­den sich in den jewei­li­gen Quelltexten.

Außer­dem instan­zi­iert das Top-Level-Modul die PLL, die aus dem Ein­gangs­takt von 50 MHz den Abtast­takt von 200 MHz und den CPU-Takt von 20 MHz erzeugt.

Der IP Core Generator

Exem­pla­risch soll hier die Erzeu­gung des Gowin PicoRV32 CPU-Cores mit dem IP Core Gene­ra­tor gezeigt wer­den. Der IP Core Gene­ra­tor wird ent­we­der unter „Tools“-„IP Core Gene­ra­tor“ gestar­tet oder durch Anklicken des zuge­hö­ri­gen Icons mit den drei Wür­feln auf der Tools-Lei­ste. Er mel­det sich mit einem Ange­bot ver­schie­de­ner Hard- und Soft-Module:

Hier wählt man unter Soft IP-Core den Gowin_PicoRV32 mit einem Dop­pel­klick aus. Es wird eine Ein­ga­be­mas­ke zu Kon­fi­gu­ra­ti­on des gewünsch­ten Funk­ti­ons­um­fangs gestartet:

Durch Dop­pel­klick auf die jewei­li­ge Funk­ti­ons­grup­pe kann die­se aus­ge­wählt (grün hin­ter­legt) oder wie­der ent­fernt wer­den. Bei kon­fi­gu­rier­ba­ren Ele­men­ten öff­net sich ein ent­spre­chen­des Menü. Star­ten wir mit der Kon­fi­gu­ra­ti­on der CPU:

Gowin PicoRV32 CORE

In die­sem Dia­log wird der CPU-Core konfiguriert.

Man kann zunächst in engen Gren­zen den ver­wen­de­ten Befehls­satz aus­wäh­len. Immer aus­ge­wählt ist der RV32I Inte­ger Befehls­satz, optio­nal kann man die kom­pri­mier­ten Instruk­tio­nen (RV32C) und die Unter­stüt­zung für Inte­ger-Mul­ti­pli­ka­ti­on und Divi­si­on (RV32M) zu- oder abwäh­len. Dar­über­hin­aus sind eini­ge Fea­tures wähl­bar, die den Funk­ti­ons­um­fang und die Per­for­mance beein­flus­sen, was jeweils zugun­sten oder zuun­gun­sten der Anzahl ver­wen­de­ter Logik­gat­ter führt. Da es bei dem hier vor­ge­stell­ten System weder Ein­schrän­kun­gen bei den Logik­gat­tern noch bei der Per­for­mance gibt, las­sen wir alles auf den oben gezeig­ten Default-Einstellungen.

ITCM

Mit der etwas unge­wöhn­li­chen Abkür­zung ITCM wird der Befehls­spei­cher für den Pro­zes­sor kon­fi­gu­riert und sein Inhalt festgelegt.

Der Befehls­spei­cher kann 8 kB, 16 kB, 32 kB oder 64 kB groß sein. Für die­ses Pro­jekt belas­sen wir es bei dem Default-Wert von 32 kB.

Als näch­stes muß der Boot-Mode aus­ge­wählt wer­den. Bei den ersten bei­den Modi wird ein SPI-Inter­face gene­riert, über das das Pro­gramm beim Start aus dem exter­nen Flash in das ITCM gela­den wird. Damit ist die Soft­ware­ent­wick­lung qua­si unab­hän­gig von der Hard­ware­ent­wick­lung. Hier ist es im Moment aller­dings ein­fa­cher, die Soft­ware bereits in den FPGA-Bit­stream ein­zu­mas­sie­ren. Dazu wählt man „MCU boot and run in ITCM“ und trägt den Namen der zu ver­wen­den­ten Hex-Datei ein. Das hat aller­dings den Nach­teil, daß die Soft­ware bereits bei Gene­rie­rung des Bit­streams vor­han­den sein und die­ser bei jeder Soft­ware­än­de­rung neu gene­riert wer­den muß.

DTCM

Die Kon­fi­gu­ra­ti­on des Daten­spei­chers erfolgt ana­log zu der des Instruktionsspeichers.

Der Daten­spei­cher wird beim Star­ten durch die CPU initia­li­siert. Ein Hex-File wie beim Instruk­ti­ons­spei­cher ent­fällt daher.

WB UART

Das Wish­bo­ne UART wird tat­säch­lich in dem hier vor­ge­stell­ten Pro­jekt nicht mehr ver­wen­det, aber aus histo­ri­schen Grün­den sind die Signa­le noch defi­niert. Daher muß es enab­led wer­den, um Feh­ler­mel­dun­gen zu ver­mei­den. Es wird in einer zukünf­ti­gen Ver­si­on ent­we­der wie­der benutzt oder ganz entfernt.

WB SPI Master

Das SPI Master Inter­face wird zur Kom­mu­ni­ka­ti­on mit dem exter­nen AD-Wand­ler ADS1118 benö­tigt. Es wird enab­led und fol­gen­der­ma­ßen konfiguriert:

Das SPI-Inter­face wird mit dem CPU-Takt von 20 MHz betrie­ben und der AD-Wand­ler darf mit höch­stens 4 MHz getak­tet wer­den. Um genü­gend Mar­ge zu haben, wird er tat­säch­lich mit 2 MHz betrie­ben, was einem CLOCK_SEL=4 ent­spricht (SPICLK = CPUCLK/(2*(CLOCK_SEL+1))). Shift-Rich­tung, Clock Pha­se und Pola­ri­tät sind vom ADC vor­ge­ge­ben und müs­sen wie hier gezeigt gewählt wer­den, die Kom­mu­ni­ka­ti­on erfolgt mit einer Daten­län­ge von 32 Bit. Die ande­ren Para­me­ter blei­ben auf ihren Default-Werten.

Open WB Interface

Abschlie­ßend wird noch das Open Wish­bo­ne Inter­face enab­led. Es wird für das Lesen und Schrei­ben der Regi­ster in den oben genann­ten Funk­ti­ons­blöcken benötigt.

Ande­re CPU Funktionsblöcke

Simp­le UART, Open AHB Inter­face, WB I2C Master, WB SPI Slave, WB GPIO und ADV SPI-Flash wer­den hier nicht benutzt und dem­entspre­chend disabled.

Gene­rie­ren der kon­fi­gu­rier­ten CPU

Nach­dem nun alle Blöcke wie gewünscht kon­fi­gu­riert sind, kann nun die CPU gene­riert wer­den. Vor dem Klicken auf „ok“ soll­te aber noch der Haken bei „Use Gowin PicoRV32 as top modu­le“ abge­wählt wer­den, denn die CPU ist hier ein Sub-Modul.

Nach dem Klicken auf „ok“ wird noch nach­ge­fragt, ob das exi­stie­ren­de Ver­zeich­nis über­schrie­ben wer­den darf, falls es aus vor­he­ri­gen Durch­gän­gen bereits exi­stiert. Wir klicken auf „yes“ und nun hat er erst­mal 30 Sekun­den zu tun. Dann wird nach­ge­fragt, ob die neu gene­rier­ten Datei­en zum Pro­jekt hin­zu­ge­fügt wer­den sol­len. Das soll­te man beim ersten mal mit „yes“ beant­wor­ten, sonst muß man sie anschlie­ßend manu­ell hin­zu­fü­gen. Bei wei­te­ren Durch­gän­gen ist die Ant­wort egal, denn sie sind ja schon Teil des Projekts.

Syn­the­se, Pla­ce­ment & Routing

Jetzt ist das Pro­jekt bereit zur Syn­the­se. Dabei wer­den die Logik­funk­tio­nen auf­ge­löst und das gesam­te Pro­jekt in Logik­gat­ter umge­wan­delt. Wenn das feh­ler­frei durch­läuft, folgt anschlie­ßend das Pla­ce­ment & Rou­ting. Dabei wer­den die Pins und Gat­ter an die berech­ne­ten Posi­tio­nen plat­ziert und elek­trisch mit­ein­an­der verbunden.

Wenn die Syn­the­se für ein defi­nier­tes Pro­jekt ver­wen­det wer­den soll, dann muß man vor dem Pla­ce­ment zumin­dest die ange­schlos­se­nen Pins im Flo­or­plan­ner zuwei­sen. Nicht ange­schlos­se­ne Pins bekom­men eine Default-Kon­fi­gu­ra­ti­on (meist Input mit pull-up Wider­stän­den). Nicht im Flo­or­plan­ner zuge­wie­se­ne Signa­le wer­den irgend­wo­hin gelegt, wo es dem Pla­ce­ment genehm ist. Das kann man bei ersten Ver­su­chen machen, wenn es noch kei­ne Lei­ter­plat­te gibt. Das auto­ma­ti­sche Pla­ce­ment kann sogar eine Hil­fe bei der Pin­aus­wahl für das Lay­out sein.

Syn­the­se, Pla­ce­ment & Rou­ting benö­ti­gen für die­ses Pro­jekt auf mei­nem PC etwa 2 Minu­ten. Im Ver­lauf wer­den meh­re­re Berich­te erstellt, die man sich gele­gent­lich anschau­en soll­te. Sie kön­nen ins­be­son­de­re bei Feh­lern sehr hilf­reich sein. Auch die Timing Ana­ly­se soll­te man nicht igno­rie­ren. Hier wer­den die maxi­mal mög­li­chen Takt­fre­quen­zen ange­zeigt und zwar in rot, wenn die Vor­ga­ben nicht getrof­fen wer­den. Gera­de in der Ent­wick­lungs­pha­se kann man mal ein Auge zudrücken, wenn die Abwei­chun­gen gering sind und bei­spiels­wei­se nur 195 MHz statt 200 MHz erreicht wer­den, wir arbei­ten ja schließ­lich unter defi­nier­ten Bedin­gun­gen und bei Zim­mer­tem­pe­ra­tur. Sobald das Modul aber für den Außen­be­reich released wird und damit dem gesam­ten Tem­pe­ra­tur­be­reich und womög­lich Span­nungs­schwan­kun­gen aus­ge­lie­fert ist, wür­de ich kei­ne roten Mel­dun­gen mehr tole­rie­ren. Im ungün­stig­sten Moment fällt dann das Modul aus und man hat kei­nen Hin­weis, was schief­ge­lau­fen sein könnte.

Die Soft­ware

Hier zunächst das kom­plet­te Eclipse-Projekt:

Es müss­te direkt über­setz­bar sein, aber gege­be­nen­falls müs­sen Pfa­de ange­passt werden.

Das eigent­li­che Haupt­pro­gramm steht in der Datei „RiscV_Phasenmessung.c“. Im „libra­ry“ Ver­zeich­nis befin­den sich die Quell­codes, die von Gowin zur Ver­fü­gung gestellt wur­den, eini­ge von ihnen wur­den für die­ses Pro­jekt adap­tiert, ins­be­son­de­re die Inter­rupt-Funk­tio­nen in irq.c und irq.h.

Das Haupt­pro­gramm

Im Haupt­pro­gramm wer­den nach der Initia­li­sie­rung loka­ler Varia­blen als erstes die ver­wen­de­ten Peri­phe­rie­ele­men­te im FPGA initia­li­siert. Der asyn­chro­ne Sen­der wird auf 115,2 kBd ein­ge­stellt, der Inter­vall­timer auf 10 ms und ein Mess­zy­klus wird gestar­tet. Anschlie­ßend wer­den die Inter­rupts freigegeben.

Der Inter­vall­timer

Der Inter­vall­timer erzeugt alle 10 ms einen Inter­rupt, der die Funk­ti­on user1_int() auf­ruft. Dort wird im wesent­li­chen der näch­ste ADC Mess­zy­klus gestar­tet und das Ergeb­nis der vor­he­ri­gen Mes­sung gele­sen. Der SPI-Trans­fer zum ADC läuft auto­ma­tisch und die CPU muß nicht auf des­sen Ergeb­nis­se war­ten. Sie wer­den ein­fach bei der näch­sten Gele­gen­heit nach 10 ms abge­holt. Um die Aus­füh­rungs­zeit des Inter­rupt-Hand­lers kurz zu hal­ten, wer­den die Mess­ergeb­nis­se nicht kon­ver­tiert, son­dern als Roh­da­ten abgespeichert.

Die Pha­sen­mes­sung

Die Pha­sen­mes­sung erfolgt wie oben beschrie­ben im FPGA. Sie wird durch Schrei­ben des Con­trol­re­gi­sters gestar­tet und läuft dann auto­ma­tisch ab. Der Sta­tus der Mes­sung wird im Sta­tus­re­gi­ster ange­zeigt, das hier der Ein­fach­heit hal­ber gepollt wird. Ist die Mes­sung been­det, wer­den die Ergeb­nis­se aus­ge­le­sen, for­ma­tiert und die seri­el­le Über­tra­gung wird gestar­tet. Der Daten­trans­fer nach dem ersten Byte erfolgt inter­rupt­ge­steu­ert. Direkt nach dem Start der Über­tra­gung wird der näch­ste Mess­zy­klus gestartet.

Die For­ma­tie­rung der Ergeb­nis­se ist im Moment in les­ba­rer Form gehal­ten, damit man sie direkt in einem Ter­mi­nal­pro­gramm beob­ach­ten kann. Daher wur­de auch auf einen Zei­len­vor­schub ver­zich­tet, es wird also jedes­mal die vor­he­ri­ge Zei­le über­schrie­ben. Das wird in einem end­gül­ti­gen System sicher­lich adaptiert.

Bei­spiel­mes­sun­gen

Nach­fol­gend sol­len eini­ge Bei­spiel­mes­sun­gen z.Zt. noch mit rei­ner Text­aus­ga­be doku­men­tiert werden.

Mes­sung ohne Eingangssignale

Die­ser Block zeigt die gesam­te Text­aus­ga­be nach einem Reset. Die fol­gen­den Bei­spie­le zei­gen 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 Ver­sor­gungs­span­nung in Mil­li­volt, T die aktu­el­le Tem­pe­ra­tur des AD-Wand­lers. Es sind kei­ne Ein­gangs­si­gna­le ange­legt, daher ist die Fre­quenz 0 Hz. An den Aus­gän­gen der log­arith­mi­schen Ver­stär­ker lie­gen knapp 400 mV an.

21.104 MHz, F=0 dBm, R=0 dBm, ∆P=0°

Ff:  21.104 MHz, Fr:  21.104 MHz, Delta_P: +0.99°, High_f: 45.39%, High_r: 45.16%, ADC0=2 mV, ADC1=3303 mV, ADC2=1873 mV, ADC3=1864 mV, T=+25,844 °C

Hier wur­de absicht­lich eine krum­me Fre­quenz von 21.104 MHz gewählt, denn mit­un­ter erge­ben sich bei aus­ge­such­ten Ein­gangs­wer­ten zufäl­lig die gewünsch­ten kor­rek­ten Ergeb­nis­se. Die Fre­quen­zen wer­den kor­rekt gemes­sen und es zeigt sich eine Pha­sen­ver­schie­bung von +0.99°, was im Rah­men der Mess­ge­nau­ig­keit liegt. Die an den LogAmps gemes­se­nen Pegel lie­gen bei 1,87 V mit einer Abwei­chung von etwa 10 mV. High_f und High_r geben die rela­ti­ve High-Zeit des jewei­li­gen Signals wäh­rend der Mess­pe­ri­ode an. Sie lie­gen etwas unter 50%, wodurch die Mes­sung bei die­sem Ein­gangs­pe­gel schon unzu­ver­läs­sig wird.

21.104 MHz, F=20 dBm, R=0 dBm, ∆P=100°

Ff:  21.104 MHz, Fr:  21.104 MHz, Delta_P: +108.90°, High_f: 49.78%, High_r: 45.12%, ADC0=2 mV, ADC1=3303 mV, ADC2=2372 mV, ADC3=1862 mV, T=+26,813 °C 

Wir blei­ben bei der krum­men Fre­quenz und erhö­hen den Pegel des vor­lau­fen­den Signals auf +20 dBm und die Pha­sen­ver­schie­bung auf 100°. Die Fre­quenz­mes­sung bleibt kor­rekt und die Qua­li­tät der vor­lau­fen­den Signals ver­bes­sert sich auf 49.78%, also nahe­zu auf den Idealwert.

21.104 MHz, F=20 dBm, R=20 dBm, ∆P=100°

Ff: 21.104 MHz, Fr: 21.104 MHz, Delta_P: +101.99°, High_f: 49.77%, High_r: 49.65%, ADC0=2 mV, ADC1=3303 mV, ADC2=2371 mV, ADC3=2363 mV, T=+27,531 °C

Jetzt wird auch der Pegel des rück­lau­fen­den Signals auf +20 dBm erhöht. Die Qua­li­tät bei­der Signa­le nähert sich dem Ide­al­wert von 50% und die gemes­se­ne Pha­sen­ver­schie­bung liegt nun 2° neben dem tat­säch­li­chen Wert. Bei­de LogAmps zei­gen nun etwa 2,37 V Aus­gangs­span­nung an.

21.104 MHz, F=0 dBm, R=-15 dBm, ∆P=-100°

Ff:  21.104 MHz, Fr:  21.104 MHz, Delta_P: -103.13°, High_f: 45.24%, High_r: 29.50%, ADC0=0 mV, ADC1=3303 mV, ADC2=1871 mV, ADC3=1484 mV, T=+28,375 °C

Der Vor­lauf-Pegel liegt nun wie­der bei 0 dBm, der Rück­lauf-Pegel bei ‑15 dBm und die Pha­sen­ver­schie­bung wur­de am Signal­ge­nera­tor auf ‑100° ein­ge­stellt. Die Fre­quenz­mes­sun­gen sind nach wie vor kor­rekt, aber die Qua­li­tät des rück­lau­fen­den Signals sinkt auf unter 30%. Es wird also ein erheb­li­cher Teil der posi­ti­ven Halb­wel­le abge­schnit­ten. Trotz­dem weicht die gemes­se­ne Pha­sen­ver­schie­bung nur um gut 3° von der tat­säch­li­chen Ver­schie­bung ab.

21.104 MHz, F=0 dBm, R=-19 dBm, ∆P=-100°

Ff:  21.104 MHz, Fr:  21.104 MHz, Delta_P: -109.76°, High_f: 45.49%, High_r: 15.77%, ADC0=2 mV, ADC1=3303 mV, ADC2=1871 mV, ADC3=1385 mV, T=+27,500 °C

Der Rück­lauf-Pegel liegt jetzt bei ‑19 dBm. Die Fre­quenz­mes­sun­gen sind nach wie vor kor­rekt, aber die Qua­li­tät des rück­lau­fen­den Signals sinkt auf unter 16%.

21.104 MHz, F=0 dBm, R=-20 dBm, ∆P=-100°

Ff:  21.104 MHz, Fr:   0.000 MHz, Delta_P: -81.88°, High_f: 45.30%, High_r: 0.00%, ADC0=2 mV, ADC1=3303 mV, ADC2=1871 mV, ADC3=1358 mV, T=+27,500 °C

Der Rück­lauf-Pegel liegt jetzt bei ‑20 dBm, nur 1 dB weni­ger als bei der vori­gen Mes­sung. Das Signal wird nicht mehr erkannt, die Fre­quenz sinkt auf 0 Hz und die Qua­li­tät auf 0%. Kanal 3 des ADC zeigt noch 1,358 V, es liegt also noch ein hin­rei­chend star­kes Signal an.

Das ist genau das Pro­blem, das einer Nach­bes­se­rung bedarf und im näch­sten Rede­sign beho­ben wer­den soll.

Anmer­kun­gen zur PicoRV32 CPU

Im FPGA wird eine PicoRV32 CPU syn­the­ti­siert. Das ist ein 32-bit-Mikro­pro­zes­sor mit einer Risc-V-Archi­tek­tur. Zum Erstel­len des RTL-Codes wird der „IP Core Gene­ra­tor“ des Gowin FPGA Desi­gners benutzt. Alter­na­tiv kann der gesam­te Ver­i­log-Code auch von Git­Hub her­un­ter­ge­la­den wer­den. Damit hat man alle Frei­hei­ten, inklu­si­ve der Adap­ti­on des Codes, aber eben auch alle Last der kor­rek­ten Kon­fi­gu­ra­ti­on. Wei­te­re Infor­ma­tio­nen zur Risc-V-Archi­tek­tur fin­det man auf deren Web­site.

PicoRV32 Design­zie­le

PicoRV32 ist für die Syn­the­se für ein FPGA opti­miert. Dazu soll der Res­sour­cen­ver­brauch gering sein, die Rechen­lei­stung ist von unter­ge­ord­ne­ter Bedeu­tung. Im hier ver­wen­de­ten FPGA wird bei der Stan­dard­kon­fi­gu­ra­ti­on der CPU unge­fähr ein drit­tel der vor­han­de­nen Logik­gat­ter benötigt.

PicoRV32 Per­for­mance

Fälsch­li­cher­wei­se wird der Begriff RISC oft mit „eine Instruk­ti­on pro Takt“ gleich­setzt, was zwar oft stimmt, aber nicht die eigent­li­che Bedeu­tung ist. RISC bedeu­tet nur, daß der Befehls­satz auf sol­che Ope­ra­tio­nen redu­ziert ist, die ohne zeit­lich unbe­stimm­te Pipe­line-Locks aus­ge­führt wer­den kön­nen. Die Pipe­line darf durch­aus meh­re­re Tak­te für eine Instruk­ti­on benö­ti­gen, sie darf aber nicht bei­spiels­wei­se durch Wait-Sta­tes beim Zugriff auf ande­re Res­sour­cen auf unbe­stimm­te Zeit blockiert wer­den. Es sind nur sol­che Instruk­tio­nen erlaubt, die das sicher­stel­len. Damit fal­len ins­be­son­de­re die Befeh­le weg, die Daten im Spei­cher direkt modi­fi­zie­ren, wie es bei CISC-Pro­zes­so­ren üblich ist. Für Ope­ra­tio­nen die­ser Art wird in einem RISC Pro­zes­sor zunächst der Spei­cher­wert in ein Regi­ster gele­sen, dort modi­fi­ziert und anschlie­ßend zurück­ge­schrie­ben (Loa­d/­Sto­re-Archi­tek­tur). Wäh­rend des Lese- oder Schreib­zu­griffs kann die CPU prin­zi­pi­ell wei­ter­ar­bei­ten, was eine höhe­re Rechen­lei­stung ermög­licht. In einer ein­fach gehal­te­nen CPU darf man Opti­mie­run­gen die­ser Art aller­dings nicht erwar­ten. Auch die etwas kom­ple­xe­ren mathe­ma­ti­schen Ope­ra­tio­nen Mul­ti­pli­ka­ti­on und Divi­si­on benö­ti­gen eini­ge Dut­zend Taktzyklen.

Dhry­s­tone Bench­mark Ergebnisse

Die PicoR­V32-CPU benö­tigt beim Dhry­s­tone Bench­mark 4,1 Tak­te pro Instruk­ti­on, was 0,516 DMIPS/MHz ent­spricht. Das ist für RISC-Ver­hält­nis­se nicht über­wäl­ti­gend, aber in Anbe­tracht des gerin­gen Res­sour­cen­ver­brauch doch erstaun­lich gut. Auf jeden Fall ist es für die typi­schen embedded-Anwen­dun­gen mehr als aus­rei­chend. Eine Takt­fre­quenz von bis zu 50 MHz soll mög­lich sein, hier sind 20 MHz ein­ge­stellt und völ­lig ausreichend.

Inter­rupt Handling

Ein 32-bit RISC-Pro­zes­sor hat oft (aber nicht immer) 32 Regi­ster zur all­ge­mei­nen Ver­wen­dung. Das gilt auch für den PicoRV32. Das ist für vie­le Anwen­dungs­fäl­le groß­zü­gig und bequem, hat aber für Inter­rupt-Hand­ler den Nach­teil, daß beim Start des Hand­lers alle Regi­ster außer R0 gesi­chert und am Ende wie­der­her­ge­stellt wer­den müs­sen. Das dau­ert sei­ne Zeit. Für die hier ver­wen­de­te Vari­an­te RV32IMC wur­den typi­scher­wei­se 700 Tak­te zwi­schen dem Inter­rupt-Request und dem Inter­rupt-Ack­now­ledge gemes­sen. In die­ser Zeit ist der Inter­rupt-Hand­ler gestar­tet, hat die Regi­ster gesi­chert und springt zum Inter­rupt-Code des Anwen­ders. Des­sen Aus­füh­rungs­zeit, das Wie­der­her­stel­len der Regi­ster und der Rück­sprung in das unter­bro­che­ne Pro­gramm kommt zur gesam­ten Aus­füh­rungs­zeit noch dazu.

Es gibt eine RV32E-Ver­si­on, die die­ses Pro­blem ver­rin­gert, indem sie nur 16 Regi­ster unter­stützt. Sie wird aller­dings vom „IP Core Gene­ra­tor“ nicht angeboten.

Der Betrieb mit einem 10-MHz-Takt konn­te für den asyn­chro­nen seri­el­len Sen­der ATx inter­rupt­ge­steu­ert kei­nen kon­ti­nu­ier­li­chen Daten­strom bei 115 kBd errei­chen. Erst durch Takt­er­hö­hung auf 20 MHz wur­de das mög­lich. Das liegt natür­lich auch dar­an, daß in jedem Inter­rupt nur ein Byte in den Sen­der geschrie­ben wird. Mit einem Fifo aus meh­re­ren Bytes lie­ße sich das beheben.

Pro­ble­me

Einen schwer­wie­gen­den Feh­ler im Inter­rupt-Hand­ling konn­te ich loka­li­sie­ren, wenn­gleich noch nicht behe­ben. Zu Beginn der sprintf-Funk­ti­on und ihren Deri­va­ten wird die varia­bel lan­ge Para­me­ter­li­ste aus­ge­wer­tet. Das wird mit va_start() bewerk­stel­ligt und ist unge­wöhn­lich, weil bei fast allen ande­ren C‑Funktionen die Anzahl der Para­me­ter beim Auf­ruf bekannt ist. Wenn zwi­schen dem Funk­ti­ons­auf­ruf und va_start() ein Inter­rupt akzep­tiert wird (z.B. der Timer-Inter­rupt), dann pas­sie­ren schlim­me Din­ge. Als Work­around wer­den daher vor dem Auf­ruf alle Inter­rupts dis­ab­led und nach der Aus­füh­rung von va_start() wie­der enab­led. Das Pro­blem muß natür­lich zügig ana­ly­siert und beho­ben wer­den, aber für den Moment muß der Work­around reichen.

Nach­trag (07.02.2026)

Die Ursa­che des hier beschrie­be­nen Pro­blems ist gefun­den und beho­ben. Es ist ein Feh­ler in dem von Gowin ange­pass­ten Start­up code in der Datei start.S und betrifft den Inter­rupt Hand­ler. Vor dem Rück­sprung in das unter­bro­che­ne Pro­gramm wird der Inhalt des x31 (=t6) Regi­sters über­schrie­ben. Das ist ein tem­po­rä­res Regi­ster, des­sen Inhalt in vie­len Fäl­len nicht rele­vant ist, daher geht es meist gut. Es hat auch nichts mit der printf-Funk­ti­on zu tun, außer daß es da schnell auffällt.

Original-Code:
picorv32_getq_insn(x1, q1)
picorv32_getq_insn(x2, q2)

jal t6, return_from_irq

neuer korrekter Code:
picorv32_getq_insn(x1, q1)
picorv32_getq_insn(x2, q2)

picorv32_retirq_insn()

jal t6… springt unnö­ti­ger­wei­se in eine C‑Funktion und spei­chert die Rück­sprung­adres­se in t6. Ein Rück­sprung erfolgt aber nicht, denn es ist kein Funk­ti­ons­auf­ruf son­dern die Rück­kehr zum unter­bro­che­nen Pro­gramm. Das erle­digt die retirq Instruktion.

Sehr hilf­reich bei der Feh­ler­su­che war der Ori­gi­nal­code des PicoRV32 und das dazu­ge­hö­ri­ge readme.md-File.

Next Steps…

Ich wer­de in den näch­sten Wochen ein Rede­sign der Lei­ter­plat­te ange­hen. Dabei soll das Pro­blem der Digi­ta­li­sie­rung der Ein­gangs­si­gna­le beho­ben und die Lei­ter­plat­te deut­lich ver­klei­nert wer­den, denn die vie­len Test­mög­lich­kei­ten des Pro­to­ty­pen sind dann nicht mehr nötig.

Bis die Lei­ter­plat­te dann auf dem Tisch liegt, soll die PC-Soft­ware so ange­passt wer­den, daß der Daten­strom ana­ly­siert und das Mess­ergeb­nis im Smith-Dia­gramm dar­ge­stellt wird.

Gam­ma-Mess­ge­rät – Funktionsbeschreibung

Die­ser Bei­trag beschreibt die Funk­ti­ons­wei­se des Mess­ge­rä­tes etwas aus­führ­li­cher als bis­her. Die Ver­öf­fent­li­chung des dazu imple­men­tier­ten Ver­i­log-Codes und die Firm­ware für den im FPGA syn­the­ti­sier­ten picoRV32 CPU-Core muß ich noch­mal ver­schie­ben, obwohl bei­des gut und zuver­läs­sig funk­tio­niert. Es muss ein­fach noch etwas glatt­ge­zo­gen wer­den, es gibt zuvie­le quick-and-dir­ty Provisorien.

Das Block­dia­gramm

Das nach­fol­gen­de Block­dia­gramm zeigt den Auf­bau des Boards und die wich­tig­sten Funk­tio­nen, die im FPGA imple­men­tiert sind. Das Board selbst wur­de bereits vor­her beschrie­ben: Gam­ma-Mess­ge­rät – Der ech­te erste Pro­to­typ.

Prin­ci­ples of Operation

Die vor- und rück­lau­fen­den Span­nun­gen UF und UR wer­den vom Richt­kopp­ler in das Gam­ma-Mess­ge­rät ein­ge­speist. Die bei­den Kom­pa­ra­to­ren erzeu­gen dar­aus jeweils ein Digi­tal­si­gnal sig_F und sig_R, so dass idea­ler­wei­se die posi­ti­ve Halb­wel­le „high“ und die nega­ti­ve Halb­wel­le „low“ gene­riert. Die­se Signa­le wer­den im FPGA wie wei­ter unten beschrie­ben ana­ly­siert. Die log­arith­mi­schen Ver­stär­ker erzeu­gen eine pegel­ab­hän­gi­ge Span­nung, die von dem 4‑Kanal 16-bit AD-Wand­ler digi­ta­li­siert wird. Die digi­ta­len Wer­te wer­den über eine SPI-Schnitt­stel­le in das FPGA ein­ge­le­sen und dort von der CPU weiterverarbeitet.

Clock Domains

Die zur Mes­sung not­wen­di­gen Takt­fre­quen­zen wer­den von der PLL intern im FPGA erzeugt. Ihr Oszil­la­tor schwingt zwi­schen 800 MHz und 1,6 GHz. Durch Tei­lung kann dar­aus im Prin­zip jede belie­bi­ge dar­un­ter­lie­gen­de Arbeits­fre­quenz erzeugt wer­den. Beim hier beschrie­be­nen Pro­to­ty­pen läuft der Oszil­la­tor mit 800 MHz, aus dem durch Tei­lung die benö­tig­ten Takt­fre­quen­zen gene­riert werden.

Die PLL wird mit clk_in sta­bi­li­siert, einem 50 MHz Quarz­os­zil­la­tor auf dem Tang Pri­mer 25K Board. Die Abta­stung und Aus­wer­tung der Ein­gangs­si­gna­le erfolgt mit der stei­gen­den Flan­ke von clk_s, des­sen Fre­quenz fs im hier beschrie­be­nen Pro­to­ty­pen auf 200 MHz ein­ge­stellt ist. Das reicht voll und ganz für Signa­le bis in das 4‑m-Band (~75 MHz), theo­re­tisch sogar bis 100 MHz, aber nur, wenn die digi­ta­li­sier­ten Signa­le sym­me­trisch sind. clk_cpu ist momen­tan auf fCPU = 40 MHz ein­ge­stellt, und wird wahr­schein­lich in zukünf­ti­gen Ver­sio­nen um Strom zu spa­ren deut­lich redu­ziert, bei­spiels­wei­se auf 10 MHz. clk_cpu tak­tet außer der CPU auch noch den Timer und die seri­el­le Schnitt­stel­le ATx inklu­si­ve dem ein­ge­bau­ten Baud­ra­te Generator.

Mess­ver­fah­ren

Das Mess­ver­fah­ren ist im Grun­de ziem­lich tri­vi­al. Aus den gemes­se­nen Pegeln der vor­lau­fen­den und der reflek­tier­ten Span­nung kann auf die bekann­te klas­si­sche Art und Wei­se das Steh­wel­len­ver­hält­nis bestimmt wer­den. Für den kom­ple­xen Refle­xi­ons­fak­tor Gam­ma (Γ) braucht es aber etwas mehr, näm­lich die Kennt­nis der Pha­sen­ver­schie­bung. Die wird digi­tal im FPGA bestimmt.

Die Pha­sen­mes­sung

sig_F und sig_R wer­den im Pha­sen­kom­pa­ra­tor PC exklu­siv-ver­o­dert. Des­sen Aus­gang zeigt dann an, ob die Signa­le gleich (0) oder ungleich (1) sind. Die­ses Aus­gangs­si­gnal wird mit dem Takt clk_s abge­ta­stet und ein Zäh­ler wird inkre­men­tiert, wenn es 1 ist, die Signa­le also ungleich sind. Am Ende des Mess­in­ter­valls Tm wird die­ser Zäh­ler von der CPU aus­ge­le­sen. Wenn die Signa­le im gesam­ten Mess­in­ter­vall ungleich waren, ihre Pha­sen­ver­schie­bung also 180° beträgt, dann steht die­ser Zäh­ler auf z = fs * Tm, weil er bei jedem Takt von clk_s inkre­men­tiert wur­de. Bei exakt 0° Pha­sen­ver­schie­bung steht der Zäh­ler auf null. Damit errech­net sich also die tat­säch­li­che Pha­sen­ver­schie­bung ΔP zu:


[1]

Die Dau­er des Mess­in­ter­valls ist ein­stell­bar und liegt typi­scher­wei­se bei 10 ms bis 100 ms, was zwi­schen 100 und 10 Mes­sun­gen pro Sekun­de ent­spricht. Pro Mess­in­ter­vall wer­den also selbst auf dem 160-m-Band vie­le zehn- oder hun­dert­tau­send Zyklen des HF-Signals gemes­sen. Das HF-Signal ist nicht mit der Abtast­fre­quenz syn­chro­ni­siert, daher beginnt und endet das Mess­in­ter­vall nor­ma­ler­wei­se an irgend­ei­ner zufäl­li­gen Stel­le des HF-Signals. Das führt zu einem Mess­feh­ler am Anfang und Ende des Zyklus, der aber wegen der gro­ßen Zahl gemes­se­ner HF-Zyklen ver­nach­läs­sig­bar ist. Zudem mit­telt er sich über meh­re­re Mess­zy­klen hin­weg aus.

Der Flan­ken­de­tek­tor

Die beschrie­be­ne Pha­sen­mes­sung ist zwei­deu­tig, denn das Ergeb­nis ist bei posi­ti­ver Pha­sen­ver­schie­bung gleich groß, wie bei nega­ti­ver Ver­schie­bung. Die Rich­tung der Pha­sen­ver­schie­bung muss also noch durch die Aus­wer­tung der Flan­ken der vor- und rück­lau­fen­den Signa­le bestimmt wer­den. Dazu ist ein wei­te­rer Zäh­ler im FPGA imple­men­tiert, der inkre­men­tiert wird, wenn das rück­lau­fen­de Signal sig_R bei stei­gen­der Flan­ke des vor­lau­fen­den Signals sig_F 1 ist. Bei nega­ti­ver Pha­sen­ver­schie­bung des rück­lau­fen­den Signals steht die­ser Zäh­ler also idea­ler­wei­se bei der Signal­fre­quenz fF, bei posi­ti­ver Pha­sen­ver­schie­bung bei 0.

In der Nähe von 0° und 180° Pha­sen­ver­schie­bung erge­ben sich Unsi­cher­hei­ten bei die­ser Mes­sung, weil die eine Flan­ke mal vor und mal nach der ande­ren Flan­ke gemes­sen wird. Dadurch wird das Ergeb­nis aber nur wenig ver­fälscht, denn der Unter­schied zwi­schen bei­spiels­wei­se 178° und 182° oder 2° und 358° ist gering und liegt im Rah­men der Mess­ge­nau­ig­keit. Den­noch wur­de ein wei­te­rer Zäh­ler glei­chen Auf­baus imple­men­tiert, der inkre­men­tiert wird, wenn das vor­lau­fen­de Signal sig_F bei stei­gen­der Flan­ke des rück­lau­fen­den Signals sig_R 1 ist. Er hilft bei der Plau­si­bi­li­täts­prü­fung der gefun­de­nen Vor­zei­chens und er könn­te zukünf­tig entfallen.

Die Fre­quenz­zäh­ler

Die bis­her beschrie­be­ne Pha­sen­mes­sung reicht, um die kom­ple­xe Impe­danz der Last zu mes­sen. Im Rah­men der Mess­ge­nau­ig­keit ist jeder Punkt im Smith-Dia­gramm bestimm­bar. Das Ziel ist aber, ein pas­sen­des Anpas­sungs­glied aus rea­len Spu­len und Kon­den­sa­to­ren zu berech­nen. Dazu wird die Fre­quenz benötigt.

Die Fre­quenz­zäh­ler sind tri­vi­al und bestehen nur aus jeweils einem 32-bit Zäh­ler, mit dem die Anzahl der stei­gen­den Flan­ken der Ein­gangs­si­gna­le inner­halb des Mess­in­ter­valls gezählt wer­den. Die CPU errech­net dar­aus die Signal­fre­quenz mit einer (unnö­tig hohen) Auf­lö­sung von 10 bis 100 Hz.

Die Fre­quenz­mes­sung des rück­lau­fen­den Signals erscheint zunächst unnö­tig, denn sie muss natur­ge­mäß gleich der des vor­lau­fen­den Signals sein. Je bes­ser die Anpas­sung ist, je klei­ner also das SWR ist, umso nied­ri­ger wird aber der Pegel der rück­lau­fen­den Signals. Bei idea­ler Anpas­sung wird es null und die Fre­quenz­mes­sung zeigt 0 Hz an. In der Firm­ware wird daher die Fre­quenz des rück­lau­fen­den Signals mit der der vor­lau­fen­den ver­gli­chen. Weicht sie signi­fi­kant ab, ist das ein Zei­chen dafür, dass die Pha­sen­mes­sung auf­grund unzu­rei­chen­der Rück­lauf­span­nung unge­nau oder unbrauch­bar gewor­den ist.

Timer T1

Die RiscV CPU hat einen Timer, der aber lei­der zu sim­pel ist. Er gene­riert einen Inter­rupt nach einer ein­stell­ba­ren Zeit und muss dann im Inter­rupt-Hand­ler erneut gestar­tet wer­den. Das führt natur­ge­mäß zu zeit­li­chen Abwei­chun­gen, die sich lei­der aufaddieren.

T1 ist ein ein­fa­cher zykli­scher Timer, der Inter­rupts in einem ein­stell­ba­ren Inter­vall gene­riert (z. Zt. 10 ms). Er star­tet auto­ma­tisch ohne CPU-Akti­on von vor­ne, wenn er abge­lau­fen ist. Die Inter­rupt-Ant­wort­zeit ist daher uner­heb­lich, alle Inter­val­le sind gleich lang.

Asyn­chro­ner Sen­der ATX

Die RiscV CPU hat bereits zwei ein­ge­bau­te UARTs, eines am Wish­bo­ne-Bus und ein wei­te­res am Open-AHB-Bus. Bei­de sind lei­der unzu­rei­chend doku­men­tiert, ins­be­son­de­re was das Gene­rie­ren von Inter­rupts bei lee­rem Sen­de­puf­fer oder vol­lem Emp­fangs­puf­fer angeht. Daher wur­de hier ein eige­nes klei­nes UART mit sehr redu­zier­ter Funk­tio­na­li­tät imple­men­tiert. Es kann nur sen­den und das auch nur mit 8‑bit, einem Stop­bit und ohne Pari­tät. Es ist also nur ein asyn­chro­ner Sen­der und wur­de daher ATX (Asyn­chro­no­us Trans­mit­ter; UART = Uni­ver­sal Asyn­chro­no­us Recei­ver Trans­mit­ter) genannt. Aber er gene­riert einen Inter­rupt, wenn der Sen­de­puf­fer leer ist und so kann ein Daten­string ohne Pau­sen gesen­det wer­den, ohne dass die CPU stän­dig des Zustand des Sen­de­puf­fers prü­fen muss. Die Baud­ra­te ist auf 115 kBd eingestellt.

Gam­ma-Mess­ge­rät – Nach­trag zu den Messungen

Ana­ly­se der Digitalwandler

Die ersten Mess­ergeb­nis­se der Digi­tal­wand­ler waren zum Teil ent­täu­schend und konn­ten zumin­dest auf den ersten Blick nicht mit dem Daten­blatt erklärt wer­den. Durch wei­te­re genaue­re Mes­sun­gen und inten­si­vem Stu­di­um des Daten­blat­tes habe ich nun die Ursa­che gefun­den. Hier zunächst noch­mal der beob­ach­te­te Effekt:

Bei­de Bil­der zei­gen die glei­che Mes­sung, der Über­sicht­lich­keit hal­ber ein­mal mit und ein­mal ohne Cur­sor. Die Mes­sung erfolg­te bei 2 MHz und sie zeigt die Kom­pa­ra­tor­ein­gän­ge UFIP (CH2, blau), UFIM (CH3, vio­lett) und den Aus­gang CLKUF (CH1, gelb). Es fällt auf, daß UFIM und damit die Refe­renz für die Umschal­tung nach oben ver­scho­ben ist. UFIM soll­te eigent­lich auf der Mit­tel­li­nie von UFIP lie­gen, also bei 1,7 V. Idea­ler­wei­se soll­te der Aus­gang also bei stei­gen­dem UFIP bei 1,5 mV auf high gehen und auf der fal­len­den Sei­te bei ‑1,5 mV auf low. Wie die Mes­sung zeigt, ist UFIM mit 1,732 V aber gut 30 mV zu hoch und auch die Hyste­re­se ist mit 7 mV außer­halb der Spe­zi­fi­ka­ti­on, die eigent­lich maxi­mal 5 mV erlaubt. Im Rah­men der Meß­ge­nau­ig­keit wür­de ich die gemes­se­ne Hyste­re­se aber im Moment nicht überbewerten.

Der ver­ma­le­dei­te Eingangsstrom

Als Ursa­che für den 30 mV Off­set stellt sich der Input Bias Cur­rent von typisch 1 µA (max. 5 µA) her­aus. Durch den 100 kΩ Vor­wi­der­stand im Minus-Ein­gang des Kom­pa­ra­tors ergibt sich damit ein typi­scher Span­nungs­ab­fall von 100 mV. Figu­re 6–23 des Daten­blatts ist sehr aufschlussreich:

TLV3601 Bias Current vs. Input Voltage, 3.3 V
TLV3601 Bias Cur­rent vs. Input Vol­ta­ge, 3.3 V

Bei Zim­mer­tem­pe­ra­tur und 1,7 V Ein­gangs­span­nung kann man nach die­ser Gra­fik mit etwa 0,3 µA rech­nen, was genau zu den beob­ach­te­ten 30 mV Off­set führt. Beim vor­her ver­wen­de­ten TLV3501 ist der typi­sche input bias cur­rent übri­gens mit typisch +/- 2 pA ange­ge­ben, also weni­ger als ein hun­dert­tau­sen­stel des jet­zi­gen Wer­tes. Kein Wun­der, daß das im ersten Board nicht auf­ge­fal­len ist.

Ist Abhil­fe möglich?

Was kann man nun gegen die­sen Bias Strom tun? Wenig, denn es ist eine spe­zi­fi­zier­te Eigen­schaft des Bau­steins. Man kann aber die Aus­wir­kung des Stro­mes begren­zen, indem man ihn kom­pen­siert oder den Ein­gangs­wi­der­stand soweit ver­rin­gert, daß der Feh­ler klein bleibt. Im beob­ach­te­ten Fall bei Zim­mer­tem­pe­ra­tur könn­te man den Strom bei­spiels­wei­se mit einem 4,7 MΩ Wider­stand kom­pen­sie­ren, aller­dings ändert sich der Strom mit der Tem­pe­ra­tur und der Eingangsspannung. 

Bleibt also eigent­lich nur, den Ein­gangs­wi­der­stand zu ver­rin­gern. Mit 10 kΩ Ein­gangs­wi­der­stand wäre der Off­set schon auf 3 mV redu­ziert, was der Hyste­re­se ent­spricht. Bes­ser wäre aller­dings eine wei­te­re Reduk­ti­on mög­lichst nahe an 0 V, denn jeder Off­set führt zu einer Asym­me­trie im detek­tier­ten Aus­gangs­si­gnal und damit zu einem Feh­ler in der Pha­sen­mes­sung. Bei hohen Pegeln ist die­se Asym­me­trie ver­nach­läs­sig­bar, aber sie wird umso stö­ren­der, je klei­ner der Pegel wird.

Mit klei­ner wer­den­dem Ein­gangs­wi­der­stand steigt bei einem ein­fa­chen RC-Glied aber lei­der auch die Bela­stung des HF-Signals. Eigent­lich bevor­zu­ge ich für sol­che Anwen­dun­gen RC-Glie­der, weil sie kei­ne unge­woll­ten Reso­nan­zen auf­zei­gen. Ver­mut­lich ist es in die­sem Fall aber bes­ser, einen geeig­ne­ten LC-Tief­pass zu ver­wen­den, der bei Gleich­span­nung nie­der­oh­mig ist und bei der Betriebs­fre­quenz hoch­oh­mig. Das soll­te für den Kurz­wel­len­be­reich mach­bar sein.

Eine ande­re Lösung ist natür­lich auch der Ein­satz des TLV3501. Der ist nicht ganz so schnell, wie der TLV3601, aber für den geplan­ten Ein­satz­be­reich völ­lig ausreichend.

Eine Nicht­li­nea­ri­tät

Die Gra­fik aus dem Daten­blatt zeigt noch ein wei­te­res mög­li­ches Pro­blem: bei 1,8 V Ein­gangs­span­nung pas­siert etwas Nicht­li­nea­res. Es ist daher wahr­schein­lich ange­bracht, die Refe­renzs­span­nung etwas nied­ri­ger als die hal­be Betriebs­span­nung zu legen. Im Moment sind zwei 100-kΩ-Wider­stän­de imple­men­tiert, die die Refe­renzs­span­nung auf 3,3 V / 2 = 1,65 V fest­le­gen. Bei einem Rede­sign wer­de ich da 100 bis 150 mV nied­ri­ger gehen.

Am Ran­de erwähnt sei noch, daß die gezeig­te Mes­sung mit einem Ein­gangs­pe­gel von ‑10 dBm durch­ge­führt wur­de und die AC-Span­nung an UFIP bei gerun­det 48 mV liegt. Das sind knapp ‑13 dBm so daß die Dämp­fung der aktu­el­len Ein­gangs­be­schal­tung also bei gut 3 dB liegt.

Die log­arith­mi­schen Verstärker

Die Span­nungs­ver­sor­gung der log­arith­mi­schen Ver­stär­ker habe ich nun per Dräht­chen von 3,3 V auf 5,0 V erhöht. Außer­dem habe ich die Dämp­fung des Wider­stands­netz­werks am Ein­gang noch­mal nach­ge­rech­net: es sind 10,1 dB, nicht 6 dB wie im Schalt­plan geschrie­ben. Der Feh­ler zieht sich schon lan­ge durch, ich hab das lei­der nie in Fra­ge gestellt. Ein­mal in einer schwa­chen Stun­de falsch dimen­sio­niert und nie geprüft, was ein Mist!

Jetzt stim­men auch die Mess­ergeb­nis­se mit dem Daten­blatt überein:

Da bewahr­hei­tet sich wie­der: kaum macht man’s rich­tig, schon geht’s!

Wie man sieht, ist der Betrieb zwi­schen ‑50 dBm bis 23 dBm pro­blem­los mög­lich. Mit dem 10,1 dB Dämp­fungs­glied soll­te es sogar bis 27 dBm funk­tio­nie­ren, aber mein Signal­ge­nera­tor geht nur bis 23 dBm. Die Abwei­chung von der spe­zi­fi­zier­ten Ide­al­li­nie liegt jetzt auch inner­halb des erlaub­ten Bereichs. Klei­ne Abwei­chun­gen hin­ter dem Kom­ma schie­be ich auf Mess­feh­ler meinerseits.

Wie geht’s weiter?

Die Hard­ware bleibt jetzt erst mal so. Manu­el­le Ände­run­gen bei den ein­ge­setz­ten 0402-Bau­tei­len machen kei­nen Spaß mehr. Zu beach­ten ist, daß die Pha­sen­ver­schie­bung mit die­ser unver­än­der­ten Vari­an­te nur bei hoher Rück­lauf­lei­stung mit der gewünsch­ten Prä­zi­si­on gemes­sen wer­den kann. Die vor­he­ri­gen Mes­sun­gen zei­gen, daß bei 0 dBm die Welt noch eini­ger­ma­ßen in Ord­nung ist. Bei einem Richt­kopp­ler mit 30 dB Kop­pel­dämp­fung kom­men bei 10 Watt (40 dBm) Abstimm­lei­stung am For­ward-Port noch 10 dBm an. Die Rück­lauf­lei­stung bleibt bei einem SWR über 2 bei mehr als 0 dBm. Die Pha­sen­mes­sung soll­te also bei 10 Watt und SWR > 2 hin­rei­chend genau sein, dar­un­ter wird’s dann nach und nach schlech­ter. Die Mes­sung des SWR mit den log­arith­mi­schen Ver­stär­kern ist davon nicht betroffen.

Damit lässt sich erst­mal wei­ter­ar­bei­ten, aber es soll natür­lich nicht so bleiben.

Ach­ja, nochwas

Bei den vie­len Mes­sun­gen, die ich gera­de durch­ge­führt habe, muss­te ich immer wie­der dBm in Lei­stung oder Span­nung umrech­nen. Das geht zwar inzwi­schen flott von der Hand, aber ich muß doch immer vom Bastel­tisch zum PC lau­fen, um die Wer­te zu berech­nen (nutzt eigent­lich noch jemand Taschen­rech­ner?). Ich habe mir daher eine Tabel­le ange­fer­tigt, sie dop­pel­sei­tig auf DIN A4 aus­ge­druckt, lami­niert und neben die Meß­ge­rä­te am Bastel­tisch gelegt. Bitteschön:

Links

Gam­ma-Mess­ge­rät – Der ech­te erste Pro­to­typ (erster Teil)

Gam­ma-Mess­ge­rät – Der ech­te erste Prototyp

Der Vor­gän­ger

In einem Bei­trag Anfang des Jah­res hat­te ich einen ersten Pro­to­typ des Gam­ma-Mess­ge­rä­tes beschrie­ben. Das dort vor­ge­stell­te Board habe ich nie gefer­tigt, weil es mich selbst nicht rich­tig über­zeugt hat. Ich bin inzwi­schen auf die Gowin FPGAs gesto­ßen, die auf den Tang Boards von Sipeed ein­ge­setzt wer­den. Sie haben mich förm­lich elek­tri­siert und das habe ich in einem ersten Bei­trag auch schon beschrieben.

Der ech­te Prototyp

Das neue Design des Gam­ma-Mess­ge­rä­tes ver­wen­det nun ein Tang Pri­mer 25K Board mit einem Gowin GW5A-LV25MG121NC1/I0 FPGA. Fünf Lei­ter­plat­ten, zwei davon bestückt, lie­gen seit einer Woche auf mei­nem Bastel­tisch und der ein­zi­ge Feh­ler, den ich bis­her gefun­den habe ist, daß die grü­ne LED, die die Ver­sor­gungs­span­nung anzeigt, viel zu hell leuch­tet. Damit kann man leben. In die­sem Bei­trag soll die Hard­ware und eini­ge grund­le­gen­de Mes­sun­gen beschrie­ben wer­den, ein wei­te­rer Bei­trag über die Soft­ware und den FPGA-RTL-Code wird fol­gen. Soviel schon­mal hier: es läuft.

Tang Pri­mer 25K

Noch­mal zur Erin­ne­rung: was ist ein Tang Pri­mer 25K? Tang Pri­mer 25K besteht aus einem Basis-Board und einem dar­auf auf­ge­steck­ten Core-Board.

Tang Pri­mer 25K Core-Board

Das Tang Pri­mer 25K Core-Board ist nur 23 mm x 18 mm groß und beinhal­tet das oben genann­te FPGA, einen seri­el­len FLASH-Spei­cher, einen 50 MHz Quarz­os­zil­la­tor und die not­wen­di­gen Spannungsregler.

Beim Ein­schal­ten der Betriebs­span­nung wird auto­ma­tisch die FPGA-Kon­fi­gu­ra­ti­on und even­tu­ell die Soft­ware für einen Mikro­pro­zes­sor in das FPGA gela­den. Die­ses Core-Board wird über zwei jeweils 60-poli­ge Sub­minia­tur Steck­ver­bin­der aus der DF40-Serie von Hiro­se mit dem Tang 25K Basis­board oder einem selbst zu bau­en­den Appli­ka­ti­ons­board verbunden.

Tang Pri­mer 25K Basis-Board

Das Basis-Board stellt unter ande­rem eine USB-Schnitt­stel­le zur Außen­welt und eine zwei­rei­hi­ge 100-mil-Pfo­sten­lei­ste zur Ver­fü­gung. Die Span­nungs­ver­sor­gung und die Kom­mu­ni­ka­ti­on mit einem PC erfolgt über USB, mehr braucht man nicht für erste Versuche.

Die Lei­ter­plat­te des Gamma-Messgeräts

Hier zunächst der Schaltplan:

und das fer­ti­ge Board in der KiCad-3D-Ansicht:

Hier ist die Lei­ter­plat­te mit auf­ge­steck­tem Tang Pri­mer 25K Core-Board zu sehen. Alter­na­tiv, bevor­zugt zu Ent­wick­lungs­zwecken, kann das Tang Pri­mer 25K Basis-Board (hier nicht gezeigt) von unten in die Pfo­sten­lei­ste ein­ge­steckt wer­den. Auch die optio­na­len Blue­tooth und USB-Modu­le sind hier gezeigt. Statt BT oder USB kann auch die RS-485-Schnitt­stel­le zur Kom­mu­ni­ka­ti­on benutzt wer­den. Das kom­plet­te KiCad-Pro­jekt kann hier zur frei­en Ver­fü­gung her­un­ter­ge­la­den werden:

Die HF-Ein­gän­ge

Die vom Richt­kopp­ler erfass­ten Vor­lauf- und Rück­lauf­span­nun­gen wer­den an die Ports J1 und J2 ein­ge­speist. Das sind SMA Buch­sen, die jeweils mit zwei par­al­lel­ge­schal­te­ten 105-Ω-Wider­stän­den ter­mi­niert sind. Das ergibt nomi­nal einen Wider­stand von 52,5 Ω, aber mit den wei­te­ren Ein­gangs­wi­der­stän­den soll­ten sich ziem­lich genau die not­wen­di­gen 50 Ω erge­ben. Die Mes­sun­gen wei­ter unten zei­gen, daß das nicht ganz hin­kommt. Die bei­den Wider­stän­de haben die SMD Bau­grö­ße 2010 und kön­nen jeweils 500 mW ver­tra­gen, zusam­men als 1 W. Damit kann ein Richt­kopp­ler mit 30 dB Kop­pel­dämp­fung zumin­dest theo­re­tisch an einen 1‑kW-Sen­der ange­schlos­sen wer­den. Auf jeden Fall bleibt eine hin­rei­chen­de Sicher­heits­mar­ge zu den 100 W, die mein IC-7300 lie­fern kann.

Pegel­wand­lung

Zur Wand­lung der Vor­lauf- und Rück­lauf­pe­gel wird jeweils ein Klas­si­ker ein­ge­setzt, ein log­arith­mi­scher Ver­stär­ker vom Typ AD8307A (U1 und U2). Er lie­fert an sei­nem Aus­gang eine Span­nung, die den Ein­gangs­pe­gel log­arith­misch abbil­det, also pro­por­tio­nal zum Ein­gangs­pe­gel in dBm ist. Den log­arith­mi­schen Ver­stär­kern ist noch ein 6 dB Dämp­fungs­glied vor­ge­schal­tet, das mit 3 dB Reser­ve für einen 100-W-Sen­der dimen­sio­niert ist, denn der AD8307A ver­trägt maxi­mal 17 dBm an sei­nem Ein­gang. Für grö­ße­re Lei­stun­gen müs­sen die­se Dämp­fungs­glie­der also anders dimen­sio­niert werden.

Ana­log-Digi­tal Wand­ler ADS1118

Die Aus­gän­ge der log­arith­mi­schen Ver­stär­ker sind über RC-Tief­päs­se auf die Ana­log­ein­gän­ge des 16-bit AD-Kon­ver­ters ADS1118 U3 geschal­tet. Der hat einen vier­fa­chen Ein­gangs­mul­ti­ple­xer und kann zusätz­lich als fünf­ten Kanal noch die Tem­pe­ra­tur mes­sen. Er kann knapp 1000 Mes­sun­gen pro Sekun­de aus­füh­ren, was für die beab­sich­ti­ge Mess­pe­ri­ode von 10 ms mehr als aus­rei­chend ist. Für die ersten Ver­su­che habe ich ihn auf 128 SPS (samples per second) gedros­selt, was der Mess­ge­nau­ig­keit zugu­te kommt. Die Beschal­tung ist ein­fach, weil die Refe­renz­span­nung intern erzeugt wird. Die Daten­über­tra­gung erfolgt seri­ell über eine SPI-Schnitt­stel­le und so passt er bequem in ein klei­nes 10-Pin-Gehäu­se. Wie im Daten­blatt emp­foh­len, sind jeweils 33-Ω-Wider­stän­de seri­ell in die Über­tra­gungs­lei­stun­gen geschal­tet. Die anson­sten unbe­nutz­ten Ana­log­ein­gän­ge AIN0 und AIN1 mes­sen die Ver­sor­gungs­span­nung VIN und VDD033.

Digi­ta­li­sie­rung der HF-Signale

Im FPGA soll die Pha­sen­ver­schie­bung zwi­schen vor- und rück­lau­fen­dem Signal gemes­sen wer­den, denn aus den Pegeln kann man nur das Steh­wel­len­ver­hält­nis, aber nicht den kom­ple­xen Refle­xi­ons­fak­tor Gam­ma errech­nen. Zur digi­ta­len Wei­ter­ver­ar­bei­tung der HF-Signa­le im FPGA müs­sen sie also digi­ta­li­siert werden.

Wie im ersten PoC-Board wer­den dazu auch hier wie­der schnel­le Kom­pa­ra­to­ren benö­tigt. Statt der dort ver­wen­de­ten TLV3501 wur­de jetzt aber die schnel­le­re Vari­an­te TLV3601 ein­ge­setzt, die mit 325 MHz Schalt­fre­quenz und 2,5 ns Ver­zö­ge­rung spe­zi­fi­ziert ist. Die vor­he­ri­ge Schal­tung wur­de im wesent­li­chen bei­be­hal­ten. Die Kapa­zi­tät der Kop­pel­kon­den­sa­to­ren C10 und C11 wur­de von 1 nF auf 100 nF erhöht um ein bes­se­res Ver­hal­ten bei nied­ri­gen Fre­quen­zen sicher­zu­stel­len. Außer­dem wur­den Dop­pel­schott­ky­di­oden des Typs BAS70-04 zum Kap­pen even­tu­el­ler Span­nungs­spit­zen vor­ge­se­hen. Falls tat­säch­lich 1 W am Ein­gang anliegt, hat man eine Spit­zen­span­nung von 10 V, die den zuläs­si­gen Ein­gangs­pe­gel der Kom­pa­ra­to­ren über­steigt. Die­se Dioden wären übri­gens laut Daten­blatt ver­zicht­bar, wenn der Ein­gangs­strom auf 10 mA limi­tiert wird. Dazu müss­ten aber die Wider­stän­de R24 und R26 auf knapp 1 kΩ erhöht werden.

Das Prin­zip der Digi­ta­li­sie­rung ist übri­gens ziem­lich banal. Die Span­nungs­tei­ler aus zwei 100-kΩ-Wider­stän­den zie­hen den Gleich­span­nungs­pe­gel auf die Mit­te der Ver­sor­gungs­span­nung. Die­ser Pegel liegt über einem 100-kΩ/10-nF-Tief­pass am nega­ti­ven Ein­gang des Kom­pa­ra­tors an. Damit wird der HF-Anteil der Ein­gangs­si­gna­le weit­ge­hend unter­drückt. Prak­tisch unge­dämpft gelangt die HF aber an den posi­ti­ven Ein­gang und schal­tet den Aus­gang des Kom­pa­ra­tors ein oder aus.

Die Ein­gangs­hy­ste­re­se ist mit typisch 3 mV ange­ge­ben (min. 1,5 mV, max. 5 mV). Das bedeu­tet, daß das posi­ti­ve Signal min­de­stens um die­se Hyste­re­se vom nega­ti­ven Ein­gangs­si­gnal abwei­chen muß, damit der Aus­gang umschal­tet. Das führt zu Mess­feh­lern, die sich bei gleich gro­ßen vor- und rück­lau­fen­den Signal­pe­geln und glei­chen Eigen­schaf­ten der bei­den Kom­pa­ra­to­ren auf­he­ben. Der Feh­ler wird aber grö­ßer, wenn einer der Pegel sehr nied­rig ist oder die Exem­plar­streu­ung zwi­schen bei­den Kom­pa­ra­to­ren groß ist. Gera­de bei guter Anpas­sung, also gerin­ger Rück­lauf­span­nung, wird damit die Pha­sen­ver­schie­bung nur noch schwer oder über­haupt nicht mehr messbar.

Damit kann man eine Abschät­zung über die zu erwar­ten­de Emp­find­lich­keit machen. Fällt Vp unter 5 mV, kann man kei­ne siche­re Erken­nung des Signals mehr erwar­ten. Das ist eine Effek­tiv­span­nung von etwa 3,5 mV, also etwa ‑36 dBm. Eine auch nur halb­wegs prä­zi­se Mes­sung der Pha­sen­ver­schie­bung benö­tigt ein stär­ke­res Signal.

Die Kom­mu­ni­ka­ti­ons­schnitt­stel­len

Zur Kom­mu­ni­ka­ti­on mit der Außen­welt sind drei alter­na­ti­ve seri­el­le Schnitt­stel­len vor­ge­se­hen. Für mei­ne Pro­jek­te im Außen­be­reich ver­wen­de ich sehr ger­ne eine RS-485-Schnitt­stel­le mit Fern­spei­sung der Gerä­te über bis zu 40 V‑Gleichspannung (aktu­ell 32 V). Die­ser Bus wird über J3 ange­schlos­sen und die Ver­sor­gungs­span­nung mit U4 auf 5 V sta­bi­li­siert. U10 ist das zuge­hö­ri­ge phy­si­ka­li­sche Inter­face. Alter­na­tiv kann auf den Sockel U9 ein Blue­tooth-Modul auf­ge­steckt wer­den oder auf U8 ein RS232-USB-Kon­ver­ter. In der aktu­el­len Ent­wick­lungs­pha­se am PC ist der RS232-USB-Kon­ver­ter die idea­le Wahl.

Das Tang Pri­mer FPGA-Board

Auf die Buch­sen­lei­ste J16 auf der Unter­sei­te kann das Tang Pri­mer 25K Basis-Board direkt auf­ge­steckt wer­den. Für die Ent­wick­lungs­pha­se ist das sehr prak­tisch, denn es bringt die Pro­gram­mier­schnitt­stel­le zum PC und die Span­nungs­ver­sor­gung direkt mit. Man kann in weni­gen Sekun­den den FPGA-Code per USB in den Pro­to­ty­pen laden.

Das Tang Pri­mer 25K Core-Board kann alter­na­tiv (nicht gleich­zei­tig!) in J11 und J13 auf der Ober­sei­te ein­ge­steckt wer­den. Ein zukünf­ti­ges Appli­ka­ti­ons­board wird nur noch ein Core-Board unter­stüt­zen, nicht das Basis-Board.

Die Span­nungs­ver­sor­gung

Alle Kom­po­nen­ten des Pro­to­ty­pen wer­den mit 3,3 V ver­sorgt. Die­se Span­nung wird mit dem Line­ar­reg­ler U7 aus 5 V (VDD050) erzeugt. Als Quel­le für VDD050 kann über einen Jum­per auf der Stift­lei­ste J4 ent­we­der das Basis-Board (VINDOCK), das USB-Modul (VINUSB) oder der eige­ne Span­nungs­wand­ler aus­ge­wählt werden.

Test­pins

Der hier gezeig­te Pro­to­typ hat zu Mess- und Ent­wick­lungs­zwecken eini­ge Test­pins, Taster und LEDs die auf einem spä­te­ren Appli­ka­ti­ons­board ent­fal­len wer­den. J12, J15 und J17 sind frei ver­wend­ba­re Stift­lei­sten, die an FPGA-Pins ange­schlos­sen sind. Bei ihnen ist jeweils der dem Signal gegen­über­lie­gen­de Pin an GND ange­schlos­sen. Da lässt sich jeweils sehr bequem ein Ein­gangs­ka­nal eines Logik­ana­ly­sa­tors anschlie­ßen. J12 war ursprüng­lich ein vier­fach DIP-Schal­ter, daher die Bezeich­nun­gen DSW[1..4]. Hier kön­nen Jum­per auf­ge­steckt wer­den oder alter­na­tiv wei­te­re Kanä­le eines Logikanalysators.

MMCX Koax-Steck­ver­bin­der

Außer den genann­ten Test­pins sind eine hand­voll weib­li­che 50-Ω-MMCX-Sockel zum Anschluß eines Oszil­lo­skops oder eines Spek­trum­ana­ly­sa­tors vor­ge­se­hen. Sie bie­ten eine bes­se­re Signal­qua­li­tät als die übli­chen Pro­bes, die immer deut­li­che Über­schwin­ger wegen der unver­meid­li­chen Induk­ti­vi­tä­ten des Mas­se­an­schlus­ses zei­gen. Da sie aller­dings mit 50-Ω-Koax­ka­beln ange­schlos­sen wer­den, müs­sen sie im Oszil­lo­skop auch mit 50 Ω ter­mi­niert wer­den. Das ist in vie­len Fäl­len zu nie­der­oh­mig, so daß Seri­en­wi­der­stän­de von 450 Ω oder 4950 Ω vor­ge­schal­tet wur­den. Zusam­men mit der Ter­mi­nie­rung ergibt sich damit ein Span­nungs­tei­ler von 10:1 oder 100:1. Auch im 100:1‑Fall bleibt eine mit­te­loh­mi­ge Last von 5 kΩ, was für man­che Fäl­le noch zu nied­rig ist. Mess­ergeb­nis­se für das 10:1‑Port TO2 sind wei­ter unten gezeigt.

Die Wer­te der hier imple­men­tier­ten Wider­stands­netz­wer­ke sind rein prak­ti­scher Natur: „basic parts“ beim Lei­ter­plat­ten­her­stel­ler sind immer auf dem Bestückungs­au­to­ma­ten ver­füg­bar und kosten nichts (eini­ge „mil­li­cent“), „exten­ded parts“, die manu­ell in den Auto­ma­ten ein­ge­legt wer­den müs­sen, kosten ein­ma­lig 3 €. Gera­de bei gerin­gen Lei­ter­plat­ten-Stück­zah­len nimmt man also am besten das, was ohne­hin da ist.

Mess­ergeb­nis­se

In die­sem Abschnitt wer­den die Mess­ergeb­nis­se gezeigt, die mit einem Netz­werk­ana­ly­sa­tor bzw. einem Signal­ge­nera­tor an den HF-Ein­gän­gen erzielt wur­den. Es soll der nutz­ba­re Ein­gangs­fre­quenz- und Ein­gangs­span­nungs­be­reich ermit­telt werden.

Mes­sung der Eingangsimpedanzen

Zunächst soll die Ein­gangs­im­pe­danz über den Betriebs­fre­quenz­be­reich und etwas dar­über hin­aus gemes­sen wer­den. Hier die bei­den Mes­sun­gen zwi­schen 100 kHz und 150 MHz:

Das Ver­hal­ten bei­der Ports ist prak­tisch gleich. Sie ver­hal­ten sich erwar­tungs­ge­mäß leicht kapa­zi­tiv. Am Ende des Kurz­wel­len­be­reichs bei 30 MHz wird der Real­an­teil der Impe­danz ziem­lich genau 50 Ω. Das SWR bleibt bis 50 MHz unter 1,2. Natür­lich kann man immer bestrebt sein, die Wer­te wei­ter zu ver­bes­sern, aber für mei­ne Ama­teur­zwecke bin ich damit zufrieden.

Bei einem Rede­sign wer­de ich trotz­dem noch etwas fei­len. Da bie­ten sich zunächst die Ein­gangs­wi­der­stän­de an. Bei 1 MHz zeigt sich ziem­lich genau die reel­le Impe­danz der par­al­lel­ge­schal­te­ten Wider­stän­de von 2 * 105 Ω und 3.2 kΩ von etwa 51,5 Ω. Die bei­den 6‑dB-Dämp­fungs­glie­der soll­ten also bes­ser auf nomi­nal 1050 Ω redu­ziert wer­den. Die Mes­sung zeigt außer­dem, daß eine kapa­zi­ti­ve Last von 10 bis 12 pF an den Ports anliegt. Sie wird sicher­lich zum Teil von der Kapa­zi­tät der Pads gegen die direkt dar­un­ter­lie­gen­de Mas­se­flä­che ver­ur­sacht. Die kann man bei einem neu­en Design an den Stel­len weg­las­sen und so ein paar pF gewinnen.

Mes­sung der log­arith­mi­schen Verstärker

Die­se Mes­sun­gen sol­len klä­ren, in wel­chem Fre­quenz- und Ein­gangs­pe­gel­be­reich die Digi­tal­wand­lung zuver­läs­sig funk­tio­niert und inner­halb wel­cher Gren­zen mit wel­chen Mess­feh­lern gerech­net wer­den muß. Außer­dem soll gezeigt wer­den, ob es eine Abwei­chung der Pha­sen­la­ge bei­der Kanä­le gibt und falls ja, wie groß sie ist.

Wie beim aller­er­sten PoC-Board sol­len die Mes­sun­gen exem­pla­risch bei 10 MHz und Ein­gangs­pe­geln zwi­schen ‑70 dBm und +23 dBm gemes­sen wer­den. Hier das Ergebnis:

Das sieht in einem wei­ten Bereich sehr schön line­ar aus und wie beim PoC-Board ist auch hier wie­der eine kon­stan­te Abwei­chung von der Ide­al­li­nie um ‑2 bzw. ‑4 dB zu sehen. LOGUR über­schrei­tet damit den im Daten­blatt spe­zi­fi­zier­ten Bereich von 3 dB um etwa 1 dB. Die Ursa­che mag ein Feh­ler mei­ner­seits beim Lay­out sein, er beun­ru­higt mich aber nicht, denn gera­de weil die Kur­ven so schön line­ar sind, lässt sich der Feh­ler leicht per Soft­ware korrigieren.

Beun­ru­hi­gend ist aber das Abknicken der Kur­ven bei Ein­gangs­pe­geln über 0 dBm. Das ist ein kras­ser Unter­schied zum PoC-Board und die Ursa­che kann nur der jet­zi­ge Betrieb mit 3,3 V sein, wäh­rend das vor­he­ri­ge Board mit 5 V betrie­ben wur­de. Irgend­was geht irgend­wo in die Sät­ti­gung. Zwar ist der nutz­ba­re Dyna­mik­be­reich immer noch etwa 50 dB, aber das soll ohne Not so nicht blei­ben. Auch beim Betrieb mit 5 V steigt die Aus­gangs­span­nung nicht über etwa 2,5 V an, was immer noch sehr deut­lich im gesun­den Betriebs­be­reich des AD-Wand­lers liegt. Da ein zukünf­ti­ges Board wegen des Tang Core-Boards sowie­so mit 5 V betrie­ben wer­den soll, gibt es über­haupt kei­nen Grund, die LogAmps nicht auch mit 5 V zu betrei­ben. Es soll­te sogar rela­tiv ein­fach sein, den jet­zi­gen Pro­to­ty­pen ent­spre­chend zu korrigieren.

Mes­sung der Digitalwandler

Hier wird gemes­sen, wie genau die Aus­gangs­span­nun­gen der log­arith­mi­schen Ver­stär­ker den Ein­gangs­pe­gel abbil­den und wie sie von­ein­an­der abwei­chen. Auch hier soll zunächst nur bei 10 MHz gemes­sen wer­den, Mes­sun­gen bei ande­ren Fre­quen­zen müs­sen folgen.

Zur Erläu­te­rung der Mess­me­tho­de folgt die Dar­stel­lung einer Mes­sung mit Ein­gangs­pe­geln von jeweils 0 dBm und ohne Pha­sen­ver­schie­bung der bei­den Signale:

CH1 zeigt CLKUF, die digi­ta­li­sier­te vor­lau­fen­de Span­nung, CH2 zeigt CLKUR, die digi­ta­li­sier­te rück­lau­fen­de Span­nung. CH3 und CH4 zei­gen LOGUF und LOGUR, die Aus­gangs­span­nun­gen der log­arith­mi­schen Ver­stär­ker. In der rech­ten „Result“-Spalte wird die gemes­se­ne Takt­fre­quenz von CH2/CLKUR ange­zeigt. Solan­ge das Signal ein­deu­tig erkannt wird, muß die­se Fre­quenz iden­tisch mit der von CLKUF sein, hier also 10 MHz. Die Fel­der dar­un­ter zei­gen die aktu­el­le und gemit­tel­te Aus­gangs­span­nung der log­arith­mi­schen Ver­stär­ker an. Sie wur­den für die im vori­gen Abschnitt gezeig­ten Mes­sun­gen ver­wen­det. Das unter­ste Feld zeigt schließ­lich die Pha­sen­ver­schie­bung der bei­den stei­gen­den Flan­ken an.

Die fol­gen­den Bil­der zei­gen wei­te­re Mes­sun­gen bei 180°, +90° und ‑90° Pha­sen­ver­schie­bung und Ein­gangs­pe­geln von +10 dBm bzw. 0 dBm:

Jetzt kom­men die span­nend­sten Mes­sun­gen, näm­lich die über den Dyna­mik­be­reich, die zei­gen, bei wel­chem Pegel das Signal zuver­läs­sig erfasst wird:

Kurz zusam­men­ge­fasst: bei ‑19 dBm wird das Signal noch zuver­läs­sig erkannt, bei ‑20 dBm nicht mehr. Das sieht man nicht nur am Signal­ver­lauf, son­dern sehr ein­drück­lich an der Fre­quenz­an­zei­ge. Der Fre­quenz­zäh­ler erkennt nicht mehr jeden Puls. Bei noch nied­ri­ge­ren Pegeln wird UR über­haupt nicht mehr erkannt und eine Pha­sen­mes­sung ist dann nicht mehr mög­lich. Das liegt lei­der deut­lich über den oben abge­schätz­ten ‑36 dBm. Da muß ich noch­mal nach dem Feh­ler suchen und viel­leicht das Daten­blatt noch­mal studieren.

Schon bei ‑10 dBm wird das rück­lau­fen­de Signal deut­lich asym­me­trisch. Offen­sicht­lich wird die posi­ti­ve Flan­ke erst deut­lich nach dem Null­durch­gang erkannt und die nega­ti­ve Flan­ke bereits deut­lich davor. Auch hier muß ich der Ursa­che noch auf den Grund gehen. Ich hof­fe, daß sich das im FPGA oder in der Soft­ware kom­pen­sie­ren lässt.

MMCX Test­port im Ver­gleich zu ein­fa­chen Testpins

Hier wird das Oszil­lo­gramm eines 50-Ω-MMCX-Test­ports dem eines klas­si­schen hoch­oh­mi­gen Oszil­lo­skop-Tast­kop­fes an einem Test­pin gegenübergestellt.

Das Tang Core-Board hat einen 50 MHz Oszil­la­tor, der als Fre­quenz­ba­sis für die im FPGA ein­ge­bau­te PLL benutzt wird. In der jet­zi­gen Ent­wick­lungs­pha­se wer­den intern 200 MHz für den Pha­sen­de­tek­tor benö­tigt und 40 MHz für die RISC-V-CPU. Dazu wird der inter­ne Oszil­la­tor mit 800 MHz betrie­ben, wor­aus durch Tei­lung die benö­tig­ten Fre­quen­zen erzeugt werden.

In bei­den Fäl­len wur­de das aus der PLL abge­lei­te­te CPUCLK Signal von 40 MHz aus­ge­ge­ben. CH1 (oben in gelb) ist mit einem hoch­oh­mi­gen 10:1 Tast­kopf an der Stift­lei­ste TB5 ange­schlos­sen, CH4 (unten in blau) ist über ein 2 m lan­ges RG316 Koax­ka­bel am MMCX Test­port TO2 ange­schlos­sen. CH2 ist im Oszil­lo­skop mit 50 Ω ter­mi­niert und eben­falls auf 10:1 ein­ge­stellt, denn der Quell­wi­der­stand hat 450 Ω. Bei­de FPGA-Aus­gän­ge sind auf 8 mA kon­fi­gu­riert und die hoch­oh­mi­ge Pro­be ist kor­rekt kom­pen­siert. Hin­weis: man beach­te die unter­schied­li­che ver­ti­ka­le Auf­lö­sung von 1 V bzw. 2 V. Das Oszil­lo­skop wur­de im „infi­ni­te per­si­stance“ Modus betrie­ben, das bedeu­tet, daß alle Mes­sun­gen inner­halb des Mess­in­ter­valls über­la­gert dar­ge­stellt wer­den. Es fällt auf, daß das MMCX-Signal um knapp 2 ns ver­zö­gert ist. Das ist mit dem etwa 50 cm län­ge­ren Mess­ka­bel an CH4 gut erklärbar.

Der MMCX-Port zeigt ein deut­lich sau­be­re­res Signal. Die Kan­ten sind etwas abge­schlif­fen, was sicher­lich an der rela­tiv hohen Bela­stung von knapp 7 mA liegt. Das Signal an dem hoch­oh­mi­gen Tast­kopf zeigt deut­li­che Über­schwin­ger und lang­sa­me­re Flan­ken. Außer­dem vari­iert es stär­ker, es wird durch „infi­ni­te per­si­stance“ ver­schwom­me­ner dar­ge­stellt. Das zeigt, daß es sich loh­nen kann, bei kri­ti­schen Signa­len einen Koax-Test­an­schluß vor­zu­se­hen, soweit die Bela­stung das zulässt.

Mes­sung der PLL des FPGAs

Da die Mes­sung für das MMCX-Port gera­de auf­ge­baut ist, soll auch noch das erzeug­te Fre­quenz­spek­trum mit einem Spek­trum­ana­ly­sa­tor ins­be­son­de­re auf sei­ne Sei­ten­bän­der unter­sucht wer­den. TO2 wird also mit dem­sel­ben Mess­ka­bel wie oben an einen Spek­trum­ana­ly­sa­tor angeschlossen.

Im Breit­band­spek­trum sieht man erwar­tungs­ge­mäß deut­lich die unge­rad­zah­li­gen Ober­wel­len, denn das gemes­se­ne Signal ist wie oben gezeigt ein Recht­eck­si­gnal. Die schmal­ban­di­ge­ren Mes­sun­gen zei­gen Sei­ten­band­si­gna­le im Abstand von etwa 120 kHz, die von der Pha­sen­re­ge­lung der PLL erzeugt wer­den. Die Schmal­band­mes­sung mit 1 kHz Spann­brei­te und 10 Hz RBW zeigt kei­ne Auf­fäl­lig­kei­ten. Im Rah­men des­sen, was mein Spek­trum­ana­ly­sa­tor an Sei­ten­band­rau­schen über­haupt mes­sen kann, sieht das gut aus.

Das Spek­trum des Oszil­la­tors kann optio­nal mit einem Spread Spec­trum Con­trol­ler ver­brei­tert wer­den. Die Ver­su­che hebe ich mir für spä­ter auf.

Wie geht’s weiter?

In den näch­sten Tagen muß ich die hier gefun­de­nen Auf­fäl­lig­kei­ten klä­ren, beson­ders die Digi­ta­li­sie­rung mit den Kom­pa­ra­to­ren. Die ist unbe­frie­di­gend. Ich wer­de berichten…

Außer­dem muß ich den Ver­i­log-Code für das FPGA und die Test­soft­ware noch etwas ver­fei­nern. Das wird sich ver­mut­lich bis in das näch­ste Jahr hinziehen.

Links

Gam­ma-Mess­ge­rät – Der ech­te erste Pro­to­typ (Nach­trag zu den Messungen)

Anten­nen­up­date auf der Nordseite

Es geht lang­sam auf den Win­ter zu und mei­ne Lang­draht­an­ten­ne benö­tigt einen Update. Beim Auf­bau vor zwei Jah­ren hat­te ich den dum­men Anfän­ger­feh­ler began­gen, zum Abspan­nen des Fiber­glas-Mastes und des Anten­nen­drahts die bil­li­gen Poly­pro­py­len Schnü­re aus Dis­coun­ter-Son­der­an­ge­bo­ten zu ver­wen­den. Sie wer­den zwar als wet­ter­fest und UV-fest ange­prie­sen, sind es aber nicht. Da ich auch mit den gefrä­sten Rol­len und Mast­klem­men nicht so voll­ends zufrie­den bin, wer­den sie auch gleich durch neue 3D-gedruck­te Vari­an­ten ersetzt. Die neu­en Rol­len ver­hin­dern zuver­läs­sig das Ent­glei­sen des Anten­nen­drah­tes und sie sind mit ihrem Hal­ter hori­zon­tal dreh­bar, so daß sie der Rich­tung der Zug­kraft der Anten­nen­auf­hän­gung fol­gen. Die neu­en Mast­klem­men mit ihren Flü­gel­schrau­ben kön­nen nun ohne wei­te­res Werk­zeug kom­plett vom Mast­ele­ment gelöst wer­den. Eine Beschrei­bung die­ser neu­en 3D-Tei­le fin­det sich hier.

Der Sta­tus quo ante

Die bis­he­ri­ge Anten­ne ist hier noch­mal dargestellt:

Der lin­ke Arm zeigt ziem­lich genau nach Süden, der rech­te nach Nor­den. Die nach­fol­gend beschrie­be­nen Ände­run­gen betref­fen aus­schließ­lich die Nord­sei­te. Tuner und Balun sind am geer­de­ten Anten­nen­mast befe­stigt und das Metall­ge­häu­se des Tun­ers ist geer­det. Da der aktu­el­le Tuner nicht sym­me­trisch ist, ergab sich das Pro­blem, daß der nörd­li­che Teil des dezen­tral gespei­sten Dipols nicht ange­schlos­sen wer­den konn­te. Er war also bis­lang unbe­nutzt und der süd­li­che Arm ist damit zu einer end­ge­spei­sten Lang­draht­an­ten­ne mit dem Anten­nen­mast als Gegen­ge­wicht gewor­den. Die Umbau­maß­nah­men habe ich genutzt, um noch­mal die Impe­danz gegen­über dem Anten­nen­mast zu mes­sen. Hier das SWR mal mit und der bes­se­ren Über­sicht­lich­keit hal­ber mal ohne das Smith Diagramm:

Man sieht, daß sich Reso­nan­zen bei 6 MHz, 9,3 MHz, 18,5 MHz, 30,6 MHz und 55,1 MHz erge­ben, bei denen das SWR bes­ser als 3 oder zumin­dest nicht wesent­lich schlech­ter ist. Die Reso­nan­zen waren für die angren­zen­den Ama­teur­funk­bän­der also etwas zu hoch.

Der Sta­tus quo

Ein etwas län­ge­rer Draht soll­te Abhil­fe schaf­fen. Daher habe ich den 12-m-Draht durch einen von 13 m Län­ge ersetzt, den ich dann suk­zes­si­ve auf letzt­end­lich 12,75 m gekürzt habe. Damit erge­ben sich fol­gen­de Stehwellenverhältnisse:

Die Mar­ker zei­gen die Gren­zen für ein SWR klei­ner als 3. Das ist der Bereich, den der ein­ge­bau­te Tuner im IC7300 anpas­sen kann und das sind fol­gen­de 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)

Die­ser neue Anten­nen­draht deckt damit das 60-m-Band, das 17-m-Band und einen Teil des 10-m-Ban­des 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 Reso­nanz zu erken­nen, die mit einem SWR von 3,6 aber außer­halb des Abstimm­be­reichs des IC7300 liegt.

Bekannt­lich ver­bes­sert sich das Steh­wel­len­ver­hält­nis, wenn man ein ver­lust­be­haf­te­tes Kabel (vor­neh­mer aus­ge­drückt: ein Dämp­fungs­glied) zwi­schen Trans­cei­ver und Anten­ne anschließt. Also füh­re ich die­sel­be Mes­sung noch­mal im Shack aus, von wo aus ins­ge­samt unge­fähr 15 m Koax­ka­bel (halb RG213 und halb RG58) und ein Anten­nen­um­schal­ter dazwi­schen­lie­gen. Hier das Meßergebnis:

Das SWR im 6‑m-Band ist nun auf 2,4 geschrumpft und so gelingt dem Tuner auch auf 6 m eine Anpas­sung. Nicht ver­ges­sen: die­ses SWR ist dem zwi­schen­ge­schal­te­ten Dämp­fungs­glied geschul­det und daher kein unein­ge­schränk­ter Quell der Freu­de. Aber immer­hin, man kann auf dem Band arbei­ten. Außer­dem sind die Steh­wel­len­ver­hält­nis­se gezoomt auf die jewei­li­gen Band­gren­zen ange­zeigt. Das 10-m-Band wird nicht kom­plett abge­deckt, es feh­len die unte­ren 200 kHz und das 4‑m-Band lei­der garnicht.

Der prak­ti­sche Aufbau

Zum Anschluß der Anten­ne habe ich ein wet­ter­fe­stes und mög­lichst was­ser­dich­tes Gehäu­se ent­wor­fen und mit ASA-Fila­ment gedruckt. Für den Anten­nen­draht und den Erd­an­schluß sind M8er Kabel­ver­schrau­bun­gen ver­wen­det, die Dräh­te von 2 mm bis 3 mm was­ser­dicht in das Gehäu­se füh­ren kön­nen. Die SO239 Buch­se ist zur Ein­schraub­mon­ta­ge vor­ge­se­hen und sie hat bereits eine Gum­mi­dich­tung im Lie­fer­um­fang. Außer­dem hat sie ein vor­mon­tier­tes RG174 Koax-Kabel und auf der Gegen­sei­te einen SMA-Stecker. Das Gehäu­se­de­sign ist hier beschrieben.

Zum Anschluß gibt es eine klei­ne gefrä­ste und mit KiCad erstell­te Lei­ter­plat­te. Die Schal­tung ist trivial:

J1 ist die SMA-Ein­gangs­buch­se und J2 ist eine Wago-Klem­me Typ 2604–3102 mit zwei Anschlüs­sen für Dräh­te bis 3,5 mm². GD1 ist eine Gas­ent­la­dungs­röh­re, die bei 600 V zün­det und even­tu­el­le Über­span­nun­gen z.B. durch nahen­de Gewit­ter kurz­schließt. R1 ist ein hoch­oh­mi­ger Wider­stand, der sta­ti­sche Auf­la­dun­gen der Anten­ne verhindert.

R1 ist ein SMD-Wider­stand im 2512er Gehäu­se und er ist auf der Unter­sei­te auf­ge­lö­tet. Das 3D-Modell der Wago-Klem­me ist zwar maß­stabs­ge­recht, aber quick-and-dir­ty ohne Details gezeich­net. Hier das KiCad-Projekt:

Zum Schluß noch ein paar Fotos vom fer­ti­gen Aufbau:

Die Anschluß­do­se ist mit den pas­send 3D-gedruck­ten Mast­klem­men am Mast befestigt.

Die­ses Foto zeigt rechts etwas unscharf, wie der Anten­nen­draht befe­stigt ist. Ein Hal­te­seil ist mit einer Seil­klem­me etwa 1 m vor dem Ende des Anten­nen­drah­tes ange­schraubt. Die­ses Hal­te­seil trägt den Anten­nen­draht, der dann ohne Zug­kraft in der Anten­nen­do­se ange­klemmt ist. Eine gleich­ar­ti­ge Kon­struk­ti­on etwa 2 m tie­fer hält das ande­re Ende der Anten­ne, dort aber mit einer Spannvorrichtung.

Die fer­tig ver­schraub­te Antennenanschlußdose.

Sipeed Tang FPGA Series

Anläss­lich mei­ner Über­le­gun­gen zur Mes­sung des kom­ple­xen Refle­xi­ons­fak­tors oder all­ge­mei­ner eines Gam­ma-Mess­ge­rä­tes hat­te ich mich auf die Suche nach aktu­el­len CPLDs oder FPGAs bege­ben, die heut­zu­ta­ge für Ama­teur­bud­gets in Ein­zel­stück­zah­len erhält­lich sind. Da man dafür sowie­so nicht beson­ders vie­le Pins braucht, wäre ein wei­te­rer Wunsch, ein klei­nes QFP-Gehäu­se, das man mög­lichst noch von Hand löten kann. Ein 44- oder 64-Pin QFP mit 0,65 mm Pin-Pitch, not­falls 0,5 mm, wäre also bevor­zugt. Am näch­sten kam dem ein 5M160ZE64 von Alte­ra, die inzwi­schen wie­der von Intel geschie­den sind. Es hat aber 0,4 mm Pin­ab­stand und das traue ich mir nicht mehr zu, von Hand zuver­läs­sig zu löten.

Bei die­ser Suche stieß ich auf FPGAs der chi­ne­si­schen Fir­ma Gowin, die mir sehr inter­es­sant erschie­nen. Die eben­falls chi­ne­si­sche Fir­ma Sipeed setzt die­se FPGA auf ihren Tang-Boards ein, die zu sehr gün­sti­gen Prei­sen über die bekann­ten Platt­for­men gekauft wer­den können.

Die benö­tig­ten Ent­wick­lungs­werk­zeu­ge für die Soft­ware- und FPGA-Ent­wick­lung sind kosten­los von der Gowin-Web­site her­un­ter­zu­la­den. Sowohl die­se Werk­zeu­ge wie auch die Daten­blät­ter der Bau­tei­le sind abso­lut „Sta­te-of-the-Art“, geschrie­ben oder gegen­ge­le­sen und kor­ri­giert von eng­li­schen Mut­ter­sprach­lern. Kein Ver­gleich zu dem, was vor 40 Jah­ren aus Japan kam. Die Soft­ware-Tools basie­ren auf Eclip­se und die FPGA-Tools sind selbst geschrie­ben. Wer schon­mal mit Quar­tus gear­bei­tet hat, wird sich schnell zurechtfinden.

Die SW-Tools set­zen auf den GNU-Tools auf und unter­stüt­zen sowohl den ARM Cor­tex als auch die RISC‑V Archi­tek­tur. Die FPGA-Tools unter­stüt­zen Ver­i­log 95, Ver­i­log 2001, System-Ver­i­log 2017 und VHDL.

Ich habe mir die genann­ten Ent­wick­lungs­werk­zeu­ge instal­liert und zwei Tang Nano 4K-Boards, ein Tang Pri­mer 25K Dock Base Board (ent­hält ein Core Board) und dazu ein wei­te­res Core Board besorgt und damit ein paar Wochen herumgespielt.

Zum Ein­stieg will ich nach­fol­gend kurz mei­ne Erfah­run­gen beschrei­ben. Wer sel­ber ein­stei­gen will, wird nicht an der Ori­gi­nal-Doku­men­ta­ti­on der oben ver­link­ten Sei­ten vor­bei­kom­men. Zur Ein­ar­bei­tung wird auch je nach Vor­kennt­nis­sen ein gewis­ser Zeit­auf­wand not­wen­dig sein, den ich nie­man­dem abneh­men kann.

Tang Nano 4K

Tang Nano 4K ist ein Board der Grö­ße 60 mm x 22,86 mm, das als zen­tra­len Chip den GW1NSR-LV4C einsetzt.

Das Board ist offen­sicht­lich ursprüng­lich für Gra­fik­an­wen­dun­gen ent­wickelt wor­den, denn es hat sowohl einen HDMI-Anschluß für einen Moni­tor als auch ein DVP-Inter­face zum Anschluß einer Kame­ra. Außer­dem hat es einen 32 MBit Flash-Spei­cher und ein USB-Inter­face sowie zwei Taster und eine LED. Vie­le Signa­le des GW1NSR-LV4C sind auf eine der bei­den 22-poli­gen Stift­lei­sten her­aus­ge­führt, man muß aber stets dar­auf ach­ten, daß sie nicht schon ander­wei­tig für die Kame­ra oder den Moni­tor benutzt sind. Außer­dem haben sie unter­schied­li­che Signal­pe­gel, mal 1,8 V, mal 2,5 V und mal 3,3 V. Das schränkt die Anwen­dungs­fäl­le erheb­lich ein, aber als Star­ter­board zum Ein­ar­bei­ten in die Ent­wick­lungs­werk­zeu­ge ist es den­noch sehr hilfreich.

Tang Nano 4K ist ohne Kame­ra für etwa 15 Euro und inklu­si­ve HDMI Kame­ra für etwa 20 Euro über Ali­ex­press zu bezie­hen. Wem das zu teu­er ist, der kann sich auch den Tang Nano 1K mal anschau­en, der etwa 8 Euro kostet.

GW1NSR-LV4C

Der GW1NSR-LV4C ist der zen­tra­le Chip auf dem Tang Nano 4K-Board. Er hat als Hard-Core einen ARM Cor­tex-M3 an Bord (80 MHz max), sowie ein FPGA mit 4608 LUT4 Zel­len. Das sind „look-up Tabel­len“ mit jeweils vier Ein­gän­gen und einem Aus­gang. Sie kön­nen vier Ein­gangs­si­gna­le in belie­bi­ger Wei­se ver­knüp­fen und dar­aus das Aus­gangs­si­gnal erzeu­gen. Für wei­te­re Details der Archi­tek­tur kon­sul­tie­re man das Daten­blatt. Aller­dings ist die inter­ne Archi­tek­tur für den Anwen­der trans­pa­rent. Man muß nicht unbe­dingt wis­sen, wie der Chip intern funk­tio­niert, die Tools über­neh­men das sozu­sa­gen auf Knopfdruck.

Wei­te­re inter­es­san­te Bau­grup­pen auf dem Chip sind 180 kBit SRAM, 256 kBit Flash-Spei­cher, 64 MBit PSRAM, 64 MBit Hyper­RAM und 32 MBit NOR Flash. Außer­dem hat er 16 18 bit x 18 bit Mul­ti­pli­zie­rer, zwei PLLs (clkout 480 MHz max) und zwei DLLs ein­ge­baut, sowie einen Oszil­la­tor (125 MHz typ.) mit +/-5% Tole­ranz. Die vier I/O‑Bänke kön­nen jeweils mit Span­nun­gen zwi­schen 1,2 V und 3,3 V betrie­ben werden.

Hier ein Foto mit ange­schlos­se­nem Logik­ana­ly­sa­tor für Testzwecke.

Die Kom­mu­ni­ka­ti­on mit dem PC erfolgt über die USB-Buch­se auf der rech­ten Sei­te, die gleich­zei­tig die Span­nungs­ver­sor­gung des Boards bereitstellt.

Tang Pri­mer 25K

Viel inter­es­san­ter als der Tang Nano ist für mich der Tang Pri­mer 25K. Dabei han­delt es sich um zwei sepa­ra­te Lei­ter­plat­ten, das „Dock Base Board“ und das auf­ge­steck­te „Core Board“. Das Core Board ent­hält das eigent­li­che FPGA vom Typ GW5A-LV25MG121NC1/I0, einen 50 MHz Quarz­os­zil­la­tor, die Span­nungs­ver­sor­gung und ein 64 MBit NOR-Flash zum Spei­chern des FPGA-Inhalts inklu­si­ve gege­be­nen­falls des Codes für eine im FPGA imple­men­tier­te Soft­co­re-CPU. Auch die Tang Pri­mer Boards sind über Ali­ex­press bestell­bar. Der aktu­el­le Preis (2025) liegt bei etwa 20 Euro für das Core-Board und bei etwa 30 Euro für das Basis­board inklu­si­ve einem Core-Board.

Tang Pri­mer 25K Core-Board

Das Core-Board hat eine Grö­ße von nur 23 mm x 18 mm. Hier ein Grö­ßen­ver­gleich mit einer SMA-Buchse:

Die Ver­bin­dung mit dem Basis­board oder einem selbst zu bau­en­den Appli­ka­ti­ons­board erfolgt über zwei jeweils 60-poli­ge Sub­minia­tur Steck­ver­bin­der aus der DF40-Serie von Hiro­se. Sie haben einen Pin­ab­stand von 0,4 mm und damit ist ein zuver­läs­si­ges „Sel­ber­lö­ten“ nicht mehr mög­lich. Man wird also auf einen Bestücker zurück­grei­fen müs­sen und glück­li­cher­wei­se hat JLCPCB die pas­sen­den Sockel in sei­nem Lagerbestand.

Das Core-Board benö­tigt eine Ver­sor­gungs­span­nung von 3,6 V bis 5,5 V und erzeugt dar­aus mit meh­re­ren Schalt­reg­lern alle benö­tig­ten wei­te­ren Span­nun­gen: 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 wer­den nur zur Ver­sor­gung des FPGAs benö­tigt und die 1,8/2,5/3,3V wer­den auf die Steck­ver­bin­der geführt. Auch die I/O‑Spannungsversorgungen der sechs GPIO-Bän­ke wer­den auf die Steck­ver­bin­der geführt, so daß das Basis­board die­se Bän­ke über Lei­ter­bahn­brücken mit der benö­tig­ten Span­nung ver­sor­gen kann, ohne sie selbst erzeu­gen zu müssen.

Tang Pri­mer 25K Base-Board

Das Tang Pri­mer Base-Board stellt eine hand­hab­ba­re Hard­ware-Ent­wick­lungs­um­ge­bung zur Verfügung.

Über die USB-Buch­se auf der rech­ten Sei­te wird das Board mit einem Host-PC ver­bun­den und mit der Betriebs­span­nung ver­sorgt. Über die­se USB-Buch­se ist das FPGA direkt pro­gram­mier­bar und alter­na­tiv kann der Bit­stream in den Flash-Spei­cher gela­den wer­den, aus dem das FPGA sich nach dem Ein­schal­ten selbst konfiguriert.

Außer­dem sind vie­le Signa­le des FPGAs auf 100-mil-Stift- und Buch­sen­lei­sten her­aus­ge­führt. Damit sind Test­auf­bau­ten wie die­ser hier leicht möglich.

Hier ist ein Steck­board mit zwei auf­ge­steck­ten SMA-Buch­sen gezeigt, das jeweils einen 50 Ω Abschluß­wi­der­stand ent­hält und dann mit mög­lichst kur­zen Dräh­ten an die Stift­lei­ste ver­bun­den wird. Auf die SMA-Buch­sen sind BNC-Adap­ter auf­ge­schraubt, an die ein Signal­ge­nera­tor ange­schlos­sen wird. Auch der oben schon gezeig­te Logik­ana­ly­sa­tor wird hier wie­der ver­wen­det. Das Kabel, das nach rechts oben abgeht, führt zu einem USB-RS232-Kon­ver­ter. Er ist einer der simp­len Art, der nur RxD, TxD und +5V zur Ver­fü­gung stellt. Er funk­tio­niert gleich­wohl her­vor­ra­gend und wird regel­mä­ßig pro­blem­los mit 115 kBd betrieben.

Das GW5A-LV25MG121NC1/I0-FPGA

Das hier ver­wen­de­te Gowin-FPGA vom Typ GW5A hat 23040 logi­sche Ein­hei­ten, bestehend aus jeweils einer Look­up-Tabel­le mit vier Ein­gän­gen und einem Flip­flop. Außer­dem sind 56 SRAM-Blöcke mit ins­ge­samt 1008 KBit und zusätz­lich noch 180 KBit ver­teil­tes SRAM imple­men­tiert. Dar­über­hin­aus gibt es 28 DSP-Blöcke, jeweils bestehend aus meh­re­ren Hard­ware-Mul­ti­pli­zie­rern und ‑Addie­rern sowie einer 48-bit-ALU. Sechs PLLs sor­gen für ver­schie­de­ne benö­tig­te Takt­ra­ten. Die Refe­renz­ein­gangs­fre­quenz muß zwi­schen 19 MHz und 800 MHz lie­gen und die VCO-Fre­quenz liegt zwi­schen 800 MHz und 1600 MHz. Aus der ein­ge­stell­ten VCO-Fre­quenz wird durch Fre­quenz­tei­ler die benö­tig­te Aus­gangs­fre­quenz erzeugt.

FPGA-Ent­wick­lung

Als Soft­ware-Ent­wick­lungs­um­ge­bung wird das weit­ver­brei­te­te Eclip­se mit GNU-Tools ein­ge­setzt. Das soll hier nicht wei­ter bespro­chen wer­den, detail­lier­te Hil­fe gibt es im Inter­net. Wer, so wie ich, bis­her noch nicht damit gear­bei­tet hat, wird sich schnell zurecht­fin­den, soll­te aber „ein paar Tage“ zur Ein­ar­bei­tung ver­an­schla­gen. Die Gowin-Doku­men­ta­ti­on ist auch hier sehr hilf­reich, ins­be­son­de­re wenn es um die Kon­fi­gu­ra­ti­on für die ver­wen­de­te Ziel­ar­chi­tek­tur geht, also ARM Cor­tex oder RiscV.

Der Gowin FPGA-Desi­gner unter­stützt Ver­i­log 95, Ver­i­log 2001, System-Ver­i­log 2017 und VHDL. Die Logik­syn­the­se läuft sehr schnell, Pla­ce­ment und Rou­ting (P&R) braucht natur­ge­mäß etwas län­ger. Ein kom­plet­ter Durch­lauf für ein Design mit einem PicoR­V32-Soft­co­re, UART und Wish­bo­ne-Bus, einer PLL und eini­ger 32-bit Regi­ster und Glue-Logik dau­ert etwa 1 Minu­te. Ein Simu­la­tor ist nicht vor­han­den, aber man kann auf kosten­lo­se Simu­la­to­ren ande­rer Ent­wick­lungs­werk­zeu­ge aus­wei­chen. In mei­nem Fall ist das Model­sim, das bei der Intel/Altera Ent­wick­lungs­um­ge­bung dabei ist.

Der IP Core Gene­ra­tor soll noch kurz erwähnt wer­den. Er ist Teil des Gowin FPGA Desi­gners und gestat­tet die Kon­fi­gu­ra­ti­on eini­ger vor­de­fi­nier­ter Bau­stei­ne. Damit wird bei­spiels­wei­se der RiscV-Soft­co­re, die PLLs oder die DSPs kon­fi­gu­riert. Hier die Kon­fi­gu­ra­ti­on des CPU-Cores:

Für den RiscV-Core wählt man außer dem Befehls­satz auch die anzu­schlie­ßen­den Spei­cher und das Bus-Inter­face (AHB oder Wish­bo­ne). Außer­dem sind eini­ge für Micro­con­trol­ler typi­sche Peri­pherals wähl­bar: GPI­Os, UART, I2C-Master, SPI Master oder Slave oder SPI-Flash-Inter­face. Das sieht dann so aus:

Ich habe damit jetzt eini­ge Wochen her­um­ge­spielt und bin außer­or­dent­lich zufrie­den. Die Tools arbei­ten sehr sta­bil und zuver­läs­sig, kei­ner­lei uner­klär­li­ches Fehl­ver­hal­ten, das dann nach Neu­start des PCs genau­so uner­klär­lich wie­der weg ist. Das bin ich bei ande­ren Embedded Ent­wick­lungs­um­ge­bun­gen anders gewohnt, irgend­was ist ja immer. Auch das Her­un­ter­la­den des Bit­streams zum FPGA funk­tio­niert zuver­läs­sig und ohne Mur­ren. Wenn etwas schief­ging, wuss­te ich bis­her immer, wor­an es lag, mei­stens an mir.

Mit dem oben schon gezeig­ten Test­auf­bau habe ich einen digi­ta­len Pha­sen­ver­glei­cher gebaut, der mit den zuge­ge­ben sau­be­ren Signa­le eines Test­ge­ne­ra­tors Pha­sen­ver­schie­bun­gen zwi­schen zwei Signa­len von 0,1° auf­lö­sen kann. Die Abwei­chung vom tat­säch­li­chen Wert lag nach mei­nen Beob­ach­tun­gen zwi­schen 1° und 2°, was an dem pro­vi­so­ri­schen Auf­bau lie­gen kann. Eine Anwen­dung für die­sen Pha­sen­mes­ser könn­te ein Gam­ma-Meß­ge­rät sein, des­sen Pro­to­typ ich hier schon­mal vor­ge­stellt, aber bis­her nicht ver­wirk­licht habe.

Ich wer­de noch etwas opti­mie­ren, sowohl Ver­i­log- als auch C‑Code noch etwas berei­ni­gen und dann die Ergeb­nis­se hier vorstellen.

Ferrex 20V/40V Akku-Adapter

Die Idee

Mei­ne Frau sagt immer, ich soll mehr ent­span­nen. Daher habe ich nun zur Ent­span­nung mal ein wei­te­res Kiki-Pro­jekt gestar­tet, einen Adap­ter für die 20V/40V-„ACTIV ENERGY“ Akkus, die in den Akku-Gerä­ten der Mar­ke „FERREX“ ein­ge­setzt werden.

Ein neu­er Rasenmäher

Das Pro­jekt nahm sei­nen Anfang, als unser alter Akku-Rasen­mä­her kaputt­ging. Er hat­te einen 120V-Akku (!), der nicht mehr gefer­tigt wird und für den es somit kei­nen Ersatz mehr gab. Ich ver­mu­te Pro­blem mit den diver­sen Nie­der­span­nungs-Richt­li­ni­en, denn 120V sind nicht mehr ganz harm­los. Eine Feh­ler­ana­ly­se ergab, daß eine der 30 in Serie geschal­te­ten 18650-Zel­len einen Kurz­schluss hat­te und damit ließ sich der gan­ze Akku nicht mehr laden.

Zufäl­lig gab’s bei Aldi gera­de einen neu­en Rasen­mä­her mit den 20/40-V-Akkus und so haben wir zuge­schla­gen. Bis­her ver­wen­de ich für fast alle Akku­werk­zeu­ge die Parks­ide 20-V-Akkus, aber den neu­en 40-V-Akkus konn­te ich nicht wider­ste­hen. Ihr Vor­teil ist die gut hand­hab­ba­re unge­fähr­li­che Span­nung und halb so gro­ße Strom­stär­ke bei glei­cher Leistung.

Wozu das Ganze?

Mein Ziel ist der Betrieb eines IC7300 aus einem oder zwei die­ser Akkus. Bei 100 W Sen­de­lei­stung zieht er immer­hin 16A aus der 12V Ver­sor­gung, also nahe­zu 200 Watt. Bei 20 V wären das 10 A, bei einem 40-V-Akku nur 5 A. Zwei 40-V-Akkus kön­nen auch par­al­lel­ge­schal­tet wer­den, wie es bei Lithi­um-Akkus üblich ist. Damit sinkt die Strom­stär­ke wei­ter auf 2,5 A, zumin­dest wenn die Akkus in etwa den glei­chen Lade­stand haben. Das ist ein Argu­ment, zumal die Strom­auf­nah­me wegen des begrenz­ten Wir­kungs­grads des Span­nungs­wand­lers noch etwas höher lie­gen dürfte.

Wenn zwei Akkus ver­wen­det wer­den, wür­de ich sie jeweils über eine Schott­ky­di­ode mit dem Span­nungs­wand­ler ver­bin­den, damit sie sich nicht gegen­sei­tig laden oder ent­la­den, falls der Lade­stand sehr unter­schied­lich ist. Der Ein­satz zwei­er Akkus hät­te den Vor­teil, das man unter­bre­chungs­frei einen der bei­den tau­schen kann.

Das Pro­jekt

Hier die 3D-Ansicht des Prototypen:

Die Schal­tung

Die Schal­tung ist tri­vi­al. Als Kon­takt­zun­gen für den Akku die­nen Flach­stecker für Print­mon­ta­ge aus Mes­sing, es ist eine rück­stel­len­de Poly­mer-Siche­rung ein­ge­baut, 3,75 A beim Pro­to­ty­pen und für den Anschluß eines Kabels ist eine XT30-Buch­se vor­ge­se­hen. Die Aus­frä­sung in der Lei­ter­plat­te dient zum Ein­ra­sten des Akkus. Der mitt­le­re Flach­stecker darf nicht bestückt wer­den. Es sind in Wirk­lich­keit zwei Kon­tak­te, die mit T und ID bezeich­net sind. Ihre Funk­ti­on ist nicht ohne wei­te­res ersicht­lich. Ich tip­pe auf einen Tem­pe­ra­tur­sen­sor T und ein Signal zur Iden­ti­fi­ka­ti­on des Akku­typs. Sie sind für den Nor­mal­be­trieb offen­sicht­lich nicht not­wen­dig, könn­ten aber Not­si­gna­le bei zu hohem Strom oder zu hoher Tem­pe­ra­tur abge­ben. Pro­ce­ed at your own risk! Der 20-V-Akku hat die­se bei­den Signa­le übri­gens auch, aber ihm fehlt der Kon­takt B2-.

Hier das KiCad-Pro­jekt inclu­si­ve der 3D-Model­le, soweit vorhanden:

Der Akkuh­al­ter

Der Akkuh­al­ter ist mit dem 3D-Drucker gedruckt. Ich habe PLA-Fila­ment mit Car­bon­fa­sern ver­wen­det, in der Hoff­nung, daß es dadurch etwas sta­bi­ler wird. Es macht jeden­falls einen sta­bi­len Ein­druck. Hier ist das Free­Cad-Pro­jekt für den Hal­ter und das erzeug­te 3mf-File:

Span­nungs­wand­ler

Als Span­nungs­wand­ler habe ich einen „DC/DC Span­nungs­wand­ler Span­nungs­reg­ler Modul Step Down Buck 30–90V auf 12V 1–30A“ vor­ge­se­hen. Er ver­trägt 30–90 V Ein­gangs­span­nung und ist damit für den 40-V-Akku in allen Gren­zen von „voll“ bis „leer“ mit aus­rei­chen­den Reser­ven geeig­net. Erste Ver­su­che haben gezeigt, daß er sogar mit einem voll­ge­la­de­nen 20-V-Akku funk­tio­niert, was frei­lich außer­halb sei­ner Spe­zi­fi­ka­ti­on ist. Wenn der mehr oder weni­ger ent­la­den ist, bei­spiels­wei­se auf 15 V, wird das auch nicht mehr funktionieren.

Bei 130 W Last auf der 12-V-Sei­te wird der Span­nungs­wand­ler nach einer guten hal­ben Stun­de kaum hand­warm. Danach war der Akku leer und hat offen­sicht­lich auto­ma­tisch abge­schal­tet. Die ver­wen­de­te Siche­rung ist für 3,75 A Dau­er­strom aus­ge­legt, was der Grund für die Wahl der 130-W-Last war. Der Akku­strom­stär­ke lag zum Start des Tests bei 3,5 A, was 140 W Ein­gangs­lei­stung ent­spricht. Wegen des kon­ti­nu­ier­li­chen Abfalls der Akku­span­nung beim Ent­la­den, steigt die Strom­stär­ke im Test­ver­lauf und könn­te dann die Siche­rung auslösen.

Das Stör­spek­trum

Wegen des beab­sich­tig­ten Betriebs eines KW-Funk­ge­räts ist natür­lich das Stör­spek­trum des Wand­lers von beson­de­rer Bedeu­tung. Ich habe daher einen pas­sen­den Ring­kern mit 8 Win­dun­gen Draht bewickelt und ihn über die posi­ti­ve Zulei­tung der Aus­gangs­sei­te gezo­gen. Am Spek­trum­ana­ly­sa­tor zei­gen sich fol­gen­de Schmut­ze­lei­en abhän­gig von der Last und dem Frequenzbereich:

Am wich­tig­sten für den nor­ma­len Emp­fangs­be­trieb ist die Stör­strah­lung bei 20 W Last, denn das ist unge­fähr die Lei­stungs­auf­nah­me des IC7300. Das Stör­spek­trum liegt im Wesent­li­chen unter­halb von 1 MHz. Dort wird man sicher­lich hier und da Pfeif­stel­len beob­ach­ten. In den KW-Ama­teur­funk­be­rei­chen sind glück­li­cher­wei­se kaum Stö­run­gen zu erwar­ten. Im Sen­de­be­trieb, hier bei 80 Watt Ein­gangs­lei­stung, gehen die Stö­run­gen wei­ter zurück. Damit soll­te man arbei­ten können.