Fre­quenz­zäh­ler, Teil 2

Nach­dem ich die letz­ten Wochen damit ver­dad­delt habe, mei­nen neu­en Note­book soweit her­zu­rich­ten, daß er wie­der mit allen benö­tig­ten Pro­gram­men rund läuft, kom­me ich nun end­lich dazu, das PC-Inter­face zum Fre­quenz­zäh­ler zu beschreiben.

Wie bereits im ersten Teil beschrie­ben, benutzt der Fre­quenz­zäh­ler wie­der ein RS485-Inter­face zur Kom­mu­ni­ka­ti­on mit dem PC. Das ist ein sehr stör­si­che­res Inter­face, wenn man län­ge­re Strecken bis über 1 km zuver­läs­sig über­win­den muß. Daher habe ich es für die Kom­mu­ni­ka­ti­on mit dem Anten­nen­um­schal­ter und dem Anten­nen­tu­ner ver­wen­det, die immer­hin 20 m vom Shack ent­fernt und höhe­ren HF-Lei­stun­gen aus­ge­setzt sind. Das ist mit USB nicht mehr ohne wei­te­res zu machen. In die­sem Fall ist RS485 aber eher sub­op­ti­mal, weil der Zäh­ler sowie­so nahe am PC betrie­ben wird und weil immer einen USB-RS485-Umset­zer benö­tigt wird. Daher pla­ne ich jetzt schon ein Rede­sign, das dann direkt einen FTDI USB-RS232-Umwand­ler beinhal­ten wird. Die ent­spre­chen­den Modu­le sind ja für ein bis zwei Euro zu kau­fen und auch in dem USB-RS485-Umset­zer ver­baut. An der Soft­ware wird sich daher nichts ändern.

Die PC-Bedie­ner­ober­flä­che

Die Bedie­n­er­soft­ware ist wie auch die für den Anten­nen­um­schal­ter und Tuner wie­der für einen Win­dows-PC geschrie­ben. Der Fre­quenz­zäh­ler mel­det sich über den USB-RS485-Umset­zer als COM-Schnitt­stel­le an. Als Inter­face-Pro­to­koll ist auch hier wie­der der Mod­Bus implementiert.

Der nach­fol­gen­de Screen­shot zeigt die Benut­zer­ober­flä­che des Frequenzzählers:

UI Frequenzzähler
Benut­zer­ober­flä­che des Frequenzzählers

Das Haupt­fen­ster oben zeigt die gemes­se­ne Fre­quenz in Hz, die ande­ren Fen­ster und Steu­er­ele­men­te die­nen der Kon­fi­gu­ra­ti­on, die nach­fol­gend kurz beschrie­ben wer­den soll. Es wird übri­gens die euro­päi­sche Zah­len­no­ta­ti­on ange­wen­det, nach der ein Kom­ma als Dezi­mal­trenn­zei­chen und ein Punkt als Tau­sen­der­trenn­zei­chen ver­wen­det wird.

Fref

Fref ist die tat­säch­li­che Refe­renz­fre­quenz in Hertz. Sie kann manu­ell in die­sem Fen­ster ein­ge­ge­ben wer­den. Wenn der TCXO ver­wen­det wird, wird die Refe­renz­fre­quenz aus der aktu­ell gemes­se­nen Tem­pe­ra­tur und einer hin­ter­leg­ten Tem­pe­ra­tur­kur­ve errechnet.

Fref Pre­ci­si­on

Hier wird die Genau­ig­keit der Refe­renz­fre­quenz in ppb (parts per bil­li­on = 10-9) ange­ge­ben. Dar­aus wird nach der Mes­sung die Prä­zi­si­on des Meß­er­geb­nis­ses berech­net. Die Genau­ig­keit der übli­chen Quar­ze und Quarz­os­zil­la­to­ren liegt in der Grö­ßen­ord­nung von 10.000 ppb (= 10 ppm) und die Genau­ig­keit eines GPSDO ist bes­ser als 1 ppb.

Timer Rel­oad und Gate Time

Hier wird Anzahl der Tak­te zur Bestim­mung der Tor­zeit oder direkt die Tor­zeit in Mil­li­se­kun­den ein­ge­tra­gen. Bei Ände­rung eines die­ser Fel­der wird auto­ma­tisch der ande­re Wert aus Fref und der Betriebs­art (nor­mal oder revers) errechnet.

Coun­ter Temperature

Hier wird die momen­ta­ne Tem­pe­ra­tur des Fre­quenz­zäh­lers ange­zeigt. Der ver­wen­de­te Sen­sor hat ein Genau­ig­keit von 0.5 K und eine Auf­lö­sung von 116 K. Er ist aber im jet­zi­gen Modul so weit vom ein­ge­bau­ten Quarz­os­zil­la­tor ent­fernt, daß die Mes­sung der Oszil­la­tor­tem­pe­ra­tur ziem­lich unge­nau ist.

Reso­lu­ti­on und Precision

In die­sen Fel­dern wird nach der Mes­sung die momen­ta­ne Fre­quenz­auf­lö­sung und die maxi­ma­le Meß­ab­wei­chung von der tat­säch­li­chen Fre­quenz, also die Genau­ig­keit der Meß­er­geb­nis­ses, ange­zeigt. Die Fre­quenz­auf­lö­sung hängt von den Ein­stel­lun­gen (z.B. der Tor­zeit) ab, wäh­rend in die Prä­zi­si­on auch noch die Genau­ig­keit der Refe­renz­fre­quenz ein­geht. Die Prä­zi­si­on ist eine Kom­bi­na­ti­on aus dem in „Fref Pre­ci­si­on“ eige­ge­be­nen Wert und der Fre­quenz­auf­lö­sung. Daher ist die Prä­zi­si­on immer schlech­ter als jeder ein­zel­ne die­ser Werte.

fref und fcheck Radiobuttons

Mit den fref- und fcheck-Aus­wahl­knöp­fen wird die Refe­renz­fre­quenz und die zu mes­sen­de Fre­quenz aus­ge­wählt. clk0 ist der Oszil­la­tor des CPU-Moduls, clk1 und clk2 sind die SMA-Buch­sen mit nach­fol­gen­dem Vor­ver­stär­ker und clk3 ist die Fre­quenz des ein­ge­bau­ten 100 MHz Quarz­os­zil­la­tors. Ein exter­ner Refe­renz­os­zil­la­tor, z.B. ein GPSDO, wird an clk1 oder clk2 ange­schlos­sen, an den ver­blei­ben­den Ein­gang kommt die zu mes­sen­de Frequenz.

Pres­ca­ler

Mit dem Pres­ca­ler wird der Ein­gangs­tei­ler aus­ge­wählt, der den mit fcheck aus­ge­wähl­ten Takt durch 1, 2, 4 oder 8 teilt. Damit muß sicher­ge­stellt wer­den, daß fcheck klei­ner als fref/2 ist.

TCXO

Wird hier ein Haken gesetzt, dann ver­wen­det der Fre­quenz­zäh­ler den Oszil­la­tor des CPU-Moduls an clk0 oder den ein­ge­bau­ten Quarz­os­zil­la­tor an clk3 als Refe­renz und errech­net sei­ne Fre­quenz anhand der momen­ta­nen Tem­pe­ra­tur. Des­sen Fre­quenz­gang über der Tem­pe­ra­tur muß vor­her aus­ge­mes­sen wor­den sein, wie in dem Bei­trag zur Meß­da­ten­ana­ly­se mit Libre­Of­fice beschrie­ben wurde.

Revers

Wird hier ein Haken gesetzt, arbei­tet der Fre­quenz­zäh­ler im Revers­be­trieb. Statt fref bestimmt dann fcheck die Tor­zeit und der Zäh­ler zählt die Anzahl der fref-Tak­te wäh­rend die­ser Zeit.

Con­ti­nuous

Ein Haken in die­sem Feld führt dazu, daß der Zäh­ler kon­ti­nu­ier­lich zählt, statt nach einer Mes­sung aufzuhören.

Open Log

Mit die­ser Schalt­flä­che kann eine Log­da­tei geöff­net wer­den, in der im CSV-For­mat die Meß­wer­te abge­legt wer­den. Falls die Datei noch nicht exi­stiert, wird sie neu ange­legt, anson­sten fortgeschrieben.

Trig­ger Measurement

Mit die­ser Schalt­flä­che wird die Mes­sung gestar­tet und im Fal­le der kon­ti­nu­ier­li­chen Mes­sung auch wie­der gestoppt.

Remo­te Device

Hier wird ein optio­na­les, am RS485-Bus ange­schlos­se­nes Device adres­siert, des­sen Betriebs­tem­pe­ra­tur hier ange­zeigt und gelog­ged wird. Zu Test­zwecken kann hier auch die Device-ID des Fre­quenz­zäh­lers ange­ge­ben wer­den. Damit wird auch in die­sem Feld noch­mal die­sel­be Tem­pe­ra­tur ange­zeigt, wie unter Coun­ter Temperature.

Bei­spiel­mes­sung

In der ersten Mes­sung wird die Fre­quenz des ein­ge­bau­ten 100 MHz Quarz­os­zil­la­tors mit einem GPSDO als Refe­renz gemessen.

XO via GPSDO
Fre­quenz des ein­ge­bau­ten Quarz­os­zil­la­tors mit GPSDO gemessen.

Der Quarz­os­zil­la­tor ist an clk3 ange­schlos­sen, der GPSDO an clk1. Es wur­de eine Tor­zeit von 1 Sekun­de gewählt und der Vor­tei­ler teilt durch 4, damit die zu mes­sen­de Fre­quenz nied­ri­ger als die hal­be Refe­renz­fre­quenz ist. Dar­aus ergibt sich eine Auf­lö­sung von 4.0 Hertz. Für höhe­re Auf­lö­sun­gen muß die Tor­zeit ver­län­gert wer­den. Wegen der hohen Genau­ig­keit des GPSDO von bes­ser als 1 ppm, wird die Prä­zi­si­on des Meß­er­geb­nis­ses von der Auf­lö­sung dominiert.

Die näch­ste Mes­sung mißt die Fre­quenz des Oszil­la­tors auf dem CPU-Board (clk0), die nomi­nal 8 MHz beträgt.

CPU via GPSDO
Fre­quenz des CPU Tak­tes mit GPSDO gemessen.

Da die Refe­renz­fre­quenz weit­aus höher ist, als die zu mes­sen­de Fre­quenz, kann der Vor­tei­ler auf 1 blei­ben. Auch hier ist die Auf­lö­sung wie­der ein Hertz, weil die Tor­zeit auf eine Sekun­de ein­ge­stellt wurde.

Stellt man eine Tor­zeit von 40 Sekun­den ein, dann ver­bes­sert sich die Auf­lö­sung auf 25 mHz und die Genau­ig­keit auf 33 mHz, wie der nach­fol­gen­de Screen­shot zeigt:

CPU via GPSDO
Fre­quenz des CPU Tak­tes mit GPSDO gemes­sen. Tor­zeit 40 Sekunden.

Lei­der muß man dabei auch 40 Sekun­den auf das Ergeb­nis war­ten. Man igno­rie­re hier den Timer Rel­oad Wert. Der wird lei­der als vor­zei­chen­be­haf­te­te 32-bit Zahl dargestellt.

Damit man bei nied­ri­gen zu mes­sen­den Fre­quen­zen auch bei kur­zer Meß­dau­er auf ein gut auf­ge­lö­stes Ergeb­nis kommt, benutzt man den Revers­be­trieb. Dabei wird die Dau­er der Refe­renz­pe­ri­ode mit dem hohen Refe­renz­takt aus­ge­mes­sen. Bei 100 MHz Refe­renz­fre­quenz erreicht man also eine Auf­lö­sung von 10 ns.

Das hier gezeig­te Meß­er­geb­nis wur­de im Revers­be­trieb bei einer Sekun­de Meß­dau­er erzielt. Es erreicht eine Genau­ig­keit von 88 mHz.

CPU via GPSDO
Fre­quenz des CPU Tak­tes mit GPSDO gemes­sen. Revers­be­trieb, Tor­zeit 1 Sekunde.

Durch Ver­län­gern der Meß­dau­er läßt sich auch im Revers­be­trieb die Genau­ig­keit wei­ter stei­gern. Bei 10 Sekun­den Meß­dau­er erreicht man eine Genau­ig­keit von 16 mHz.

CPU via GPSDO
Fre­quenz des CPU Tak­tes mit GPSDO gemes­sen. Revers­be­trieb, Tor­zeit 10 Sekunden.

Ver­wen­det man statt dem hoch­prä­zi­sen GPSDO den auf dem Fre­quenz­zäh­ler ver­bau­ten 100 MHz Oszil­la­tor als Refe­renz, dann ist die Genau­ig­keit sehr viel geringer.

GPSDO via XO
Fre­quenz des GPSDO mit ein­ge­bau­tem XO gemessen.

Hier ist der GPSDO auf den Meß­ein­gang geschal­tet, der für Ama­teur­zwecke exakt 100 MHz Aus­gangs­fre­quenz hat. Die Mes­sung weicht also um 676 Hz von der tat­säch­li­chen Fre­quenz ab und liegt damit inner­halb der durch die 10 ppm ange­ge­be­nen Feh­ler­gren­zen, die eine Abwei­chung bis 1004 Hz erlau­ben würden.

Wie oben schon beschrie­ben, kann der ein­ge­bau­te Oszil­la­tor per Soft­ware tem­pe­ra­tur­kom­pen­siert wer­den, indem man einen Haken bei TCXO setzt. Dadurch sinkt die Meß­ab­wei­chung auf etwa 1 Hz, wie der nach­fol­gen­de Screen­shot zeigt.

GPSDO via TCXO
Fre­quenz des GPSDO mit ein­ge­bau­tem TCXO gemessen.

Für schnel­le Mes­sun­gen kann man so also auf den GPSDO ver­zich­ten und den­noch sehr genau messen.

Anhang

Nach­fol­gend wer­den die mathe­ma­ti­schen For­meln zum Berech­nen der gemes­se­nen Fre­quenz und der jewei­li­gen Auf­lö­sung doku­men­tiert. Hier noch­mal als Refe­renz das Block­dia­gramm des Frequenzzählers:

Blockdiagramm des Frequenzzählers
Block­dia­gramm des Frequenzzählers

In den unten doku­men­tier­ten For­meln wer­den fol­gen­de Bezeich­ner verwendet:

cntr: Counter-Register, 32 bit
prsc: selprsc[1:0], 2 bit
fref: f_ref, Referenzfrequenz
rld: Timer reload value, 32 bit
gt: gate time (Torzeit) [s]
Δ(f): Frequenzauflösung [Hz]

Nor­mal­be­trieb

      rld
gt = ────
     fref


       gt ⋅ fcheck
cntr = ───────────
          prsc


         cntr ⋅ prsc ⋅ fref      cntr ⋅ prsc
fcheck = ────────────────── = ───────────
                 rld                 gt


       prsc ⋅ fref     prsc
Δ(f) = ─────────── = ────
           rel          gt

Revers­be­trieb

     prsc ⋅ rld
gt = ──────────
       fcheck


cntr = gt ⋅ fref


         rld ⋅ prsc ⋅ fref      rld ⋅ prsc
fcheck = ───────────────── = ──────────
               cntr                gt




            ⎛ rld ⋅ prsc ⋅ fref   ⎞
Δ(f) = abs    ─────────────────
            ⎝  cntr ⋅ (cntr + 1)  ⎠

Fre­quenz­zäh­ler, Teil 1

Hier kommt nun der erste Teil der Beschrei­bung des Fre­quenz­zäh­lers. Hier soll die Hard­ware bespro­chen wer­den, inklu­si­ve der Logik im ver­wen­de­ten CPLD und der Soft­ware des Controllers.

Eine kur­ze Erwäh­nung fand der Zäh­ler schon vor ein paar Wochen in der Über­sicht der aktu­el­len Pro­jek­te. Dort fin­det sich auch der Schalt­plan und die 3D-Ansicht, bei­des hier noch­mal zum direk­ten Zugriff:

Die Hard­ware

Der Fre­quenz­zäh­ler basiert wie­der auf dem ATME­GA­644-CPU-Board mit RS485-Schnitt­stel­le, das sich inzwi­schen in unter­schied­li­chen Pro­jek­ten bewährt hat. Die­ses CPU-Board kom­mu­ni­ziert über eine syn­chro­ne seri­el­le Schnitt­stel­le mit dem in einem EPM240T100 imple­men­tier­ten Fre­quenz­zäh­ler. Die benö­tig­te Geschwin­dig­keit ist unkri­tisch und daher wird die­se Kom­mu­ni­ka­ti­on auf dem CPU-Board über I/O‑Pins imple­men­tiert („bit-ban­ging“). Da der EPM240 mit 3,3 V betrie­ben wer­den muß und kei­ne 5‑V-tole­ran­ten I/O‑Pins hat, wird auch das CPU-Board mit 3,3 V betrie­ben. Das schränkt die Betriebs­fre­quenz auf maxi­mal 10 MHz ein. Wegen der gerin­gen Anfor­de­run­gen an die Geschwin­dig­keit, wur­de ein 8 MHz Quarz eingebaut.

Der Schalt­plan zeigt unten die Span­nungs­ver­sor­gung und die Kon­troll-LEDs, dar­über zwei gleich­ar­ti­ge Breit­band-Ver­stär­ker in klas­si­scher Emit­ter-Schal­tung für den Ein­gangs­takt. Sie sind ein­gangs­sei­tig mit 50 Ω abge­schlos­sen und heben den Pegel von etwa 6 dBm (8 mA Trei­ber­stär­ke) auf den für die CPLD-Takt­ein­gän­ge benö­tig­ten Hub von 3.3 V an. Wegen der Schmitt-Trig­ger-Ein­gän­ge darf es auch etwas weni­ger sein. Acht LEDs und vier DIP-Schal­ter kön­nen optio­nal zur Sta­tus­an­zei­ge und zur Kon­fi­gu­ra­ti­on ver­wen­det wer­den. Außer­dem ist ein 100 MHz Quarz­os­zil­la­tor ein­ge­baut sowie jeweils eine JTAG-Pro­gram­mier­schnitt­stel­le für das CPU-Board und das CPLD.

Funk­ti­ons­wei­se

Zur digi­ta­len Bestim­mung einer Fre­quenz gibt es prin­zi­pi­ell zwei Metho­den: man zählt die Anzahl der Tak­te wäh­rend eines mög­lichst genau bekann­ten Inter­valls oder man misst die Zeit­dau­er zwi­schen zwei oder meh­re­ren Tak­ten. Die erste Metho­de wird nach­fol­gend als Nor­mal­be­trieb bezeich­net, die zwei­te Metho­de als Revers­be­trieb. Bei­de Ver­fah­ren benö­ti­gen eine mög­lichst prä­zi­se Referenzfrequenz.

Prin­zi­pi­ell sind bei­de Betriebs­ar­ten gleich­wer­tig, sie unter­schei­den sich aber in der Dau­er der Mes­sung. Die Auf­lö­sung im Nor­mal­be­trieb ist umge­kehrt pro­por­tio­nal zum Mess­in­ter­vall. Um eine Auf­lö­sung von 1 Hz zu errei­chen, muß man eine Sekun­de lang mes­sen, bei 0,1 Hz Auf­lö­sung schon zehn Sekun­den. Den 32 kHz Takt einer Uhr kann man auf die­se Wei­se in einer Sekun­de also nur auf etwa 30 ppm genau mes­sen (2-15).

Im Revers­be­trieb teilt man den Takt der Uhr bei­spiels­wei­se durch 215 und bekommt so auch ein Inter­vall von einer Sekun­de. Zählt man in der Zeit die Tak­te einer 100 MHz Refe­renz, dann erreicht man auf eine Auf­lö­sung von 10 ns, was 0,01 ppm = 10 ppb entspricht.

Kurz zusam­men­ge­fasst: damit das Mess­in­ter­vall kurz gehal­ten wer­den kann, wählt man den Nor­mal­be­trieb am besten bei hohen Fre­quen­zen im Ver­gleich zur Refe­renz­fre­quenz, den Revers­be­trieb bei nied­ri­gen Frequenzen.

Das CPLD

Ein CPLD ist für die­se Art von Auf­ga­ben prä­de­sti­niert. Es besteht aus einer Anzahl Logik-Ele­men­te, in die­sem Fall 240 Blöcke, die weit­ge­hend frei ver­schal­tet wer­den kön­nen und über schnel­le Ver­bin­dun­gen zu den Pins ver­fü­gen. Anders als die mei­sten FPGAs, haben CPLDs nicht­flüch­ti­ge Spei­cher und müs­sen daher nicht bei jeden System­start neu kon­fi­gu­riert wer­den. Man benö­tigt aller­dings ein preis­wer­tes Werk­zeug, in die­sem (Intel/Al­te­ra-) Fall den soge­nann­ten USB-Bla­ster, um das CPLD in der Schal­tung zu pro­gram­mie­ren. Das kann man auch mehr­fach machen, aber die Anzahl der Pro­gram­mier­zy­klen ist auf etwa 100 beschränkt, wäh­rend der Flash-Spei­cher einer CPU nor­ma­ler­wei­se auch 10.000 bis 100.000-mal pro­gram­miert wer­den kann.

Die Logik wird in einer Pro­gram­mier­spra­che ähn­lich einer Soft­ware-Pro­gram­mier­spra­che ein­ge­ge­ben. Zwei Spra­chen haben sich eta­bliert, VHDL und Veri­log. Veri­log hat Ele­men­te der Pro­gram­mier­spra­che „C“ und ist für jeman­den, der die­se Spra­che kennt, rela­tiv leicht zu erler­nen. Der Unter­schied ist frei­lich, daß Soft­ware im wesent­li­chen sequen­zi­ell abge­ar­bei­tet wird, wäh­rend in Hard­ware vie­les gleich­zei­tig pas­siert. Wie auch bei der Soft­ware­pro­gram­mie­rung benö­tigt man Werk­zeu­ge, die den erstell­ten Quell­code in ein Binär­for­mat umwan­deln, das man in das CPLD laden kann. Die­se Werk­zeu­ge stellt der Her­stel­ler der Logik­bau­stei­ne, gege­be­nen­falls in einer abge­speck­ten Ver­si­on, kosten­los zur Ver­fü­gung. Im Fal­le Intels ist das die „Quartus“-Entwicklungsumgebung, die sogar eine ange­pass­te Ver­si­on des Men­tor Model­Sim Simu­la­tors ent­hält, der in der Voll­ver­si­on auch in der pro­fes­sio­nel­len Chip-Ent­wick­lung ver­wen­det wird.

Block­dia­gramm des Frequenzzählers

Genau wie beim Ent­wurf einer dis­kret auf­ge­bau­ten Schal­tung, soll­te man sich auch bei einem CPLD (oder FPGA) ein Block­dia­gramm erstel­len, das die Funk­ti­ons­blöcke dar­stellt. Die kön­nen dann bei Bedarf hier­ar­chisch wei­ter ver­fei­nert wer­den, was aber bei dem rela­tiv ein­fa­chen Zäh­ler hier nicht not­wen­dig ist.

Blockdiagramm des Frequenzzählers
Block­dia­gramm des Frequenzzählers

Die­ses Dia­gramm zeigt nur die Logik des Zäh­lers, nicht das CPU-Inter­face. Zunächst gibt es die vier Takt­ein­gän­ge clk0 .. clk3, die über den Ein­gangs­mul­ti­ple­xer ver­teilt wer­den. clk1 und clk2 sind über die oben beschrie­be­nen Vor­ver­stär­ker mit den bei­den SMA-Buch­sen ver­bun­den und für den Refe­renz­takt und die zu mes­sen­de Fre­quenz vor­ge­se­hen. clk0 ist fest mit dem CPU-Takt ver­bun­den und clk3 wird von dem 100 MHz Quarz­os­zil­la­tor betrieben.

f_check ist die zu mes­sen­de Fre­quenz, die über einen optio­na­len Vor­tei­ler auf die Refe­renz­fre­quenz f_ref syn­chro­ni­siert wird. Daher muß die Refe­renz­fre­quenz min­de­stens dop­pelt so hoch sein, wie die ggf. her­un­ter­ge­teil­te zu mes­sen­de Fre­quenz. Der Ein­gangs­mul­ti­ple­xer bestimmt, wel­cher der vier Takt­ein­gän­ge auf f_check und f_ref geschal­tet wird. Es gibt hier kei­ne Ein­schrän­kun­gen, zu Test­zwecken kann auch der­sel­be Takt auf bei­de Signa­le geschal­tet werden.

Die Refe­renz­fre­quenz wird übli­cher­wei­se in der Grö­ßen­ord­nung von 50 bis 100 MHz lie­gen und wenn die zu mes­sen­de Fre­quenz mehr als halb so hoch ist, muß sie mit dem Pres­ca­ler her­un­ter­ge­teilt werden.

Der eigent­li­che Zäh­ler besteht aus einem 32-bit brei­ten Regi­ster, des­sen Inhalt von der CPU ein­ge­le­sen wer­den kann, sinn­vol­ler­wei­se nach­dem die Mes­sung been­det ist und der Wert sich nicht mehr ändert. Der eben­falls 32-bit brei­te pro­gram­mier­ba­re Tei­ler wird beim Start des Meß­zy­klus mit dem Wert des Timer-Rel­oad-Regi­sters gela­den und anschlie­ßend her­un­ter­ge­zählt. Er bestimmt damit die Tor­zeit, also wie lan­ge der Zäh­ler zäh­len soll. Der Meß­zy­klus wird been­det, sobald die­ser Timer null erreicht. Ein kom­plet­ter Meß­zy­klus besteht aus der Kon­fi­gu­ra­ti­on des Fre­quenz­zäh­lers (Wahl der Takt­ein­gän­ge, der Betriebs­art und Ein­stel­lung des Vor­tei­lers), Set­zen des Rel­oad-Regi­sters und Trig­gern der Mes­sung, womit gleich­zei­tig der Zäh­ler auf null gesetzt wird. Ein Sta­tus­flag zeigt an, wenn der Meß­zy­klus been­det ist und das Ergeb­nis aus­ge­le­sen wer­den kann.

Timer, Zäh­ler und Steu­er­lo­gik lie­gen in der Clock-Domä­ne des aus­ge­wähl­ten Refe­renz­si­gnals, wäh­rend die von der CPU geschrie­be­nen Kon­fi­gu­ra­ti­ons- und Sta­tus-Regi­ster in der Clock-Domä­ne des CPU-Boards lie­gen (clk0). Die Simu­la­ti­on ergibt eine maxi­ma­le Ein­gangs­fre­quenz von 120 MHz für die Takt­ein­gän­ge des Fre­quenz­zäh­lers und über 50 MHz für das CPU-Inter­face. Bei Betrieb mit 100 MHz ist man also auf der siche­ren Sei­te und die 32-bit Zäh­ler kön­nen dann über 80 Sekun­den zäh­len, ohne überzulaufen.

Im Nor­mal­be­trieb wird die Tor­zeit von der Refe­renz­fre­quenz bestimmt und die Anzahl der stei­gen­den Flan­ken von f_check wird in die­sem Inter­vall gezählt. Im Revers­be­trieb bestimmt f_check die Tor­zeit wäh­rend­des­sen die Anzahl von f_ref Flan­ken gezählt wird.

Veri­log Code

Hier ist nun der Veri­log-Code des Fre­quenz­zäh­lers und die not­wen­di­gen Pro­jekt­da­tei­en für die Quar­tus-Ent­wick­lungs­um­ge­bung. Gege­be­nen­falls müs­sen Datei­pfa­de ange­passt werden.

Das eigent­li­che Design steckt in der Datei Datei FreqCntr.v, die hin­rei­chend gut kom­men­tiert sein soll­te. Zu beach­ten ist, daß die ursprüng­lich geplan­te Para­me­tri­sie­rung über die Para­me­ter COUNTERW, TIMERW und IOREGW nicht kon­se­quent ver­folgt wur­de. Sie soll­ten auf ihren Default-Wer­ten bleiben.

FreqCntr_EPM240.v instan­zi­iert den Fre­quenz­zäh­ler für das EPM240 CPLD auf dem Fre­quenz­zäh­ler-Board. Die bei­den wei­te­ren Veri­log Datei­en FreqCntr_tb_Counter.v und FreqCntr_tb_Serial_IO.v ent­hal­ten die Model­Sim-Test­ben­ches für den Zäh­ler und die seri­el­le CPU-Schnitt­stel­le. Die zuge­hö­ri­gen Skrip­te tb_Counter.do und tb_Serial_IO.do wer­den in Model­Sim aus­ge­führt und star­ten den jewei­li­gen Test.

Nach­trag: Quar­tus Prime V21.1

Nach­dem ich mir vor ein paar Wochen einen neu­en Note­book gelei­stet habe (der alte war tat­säch­lich mitt­ler­wei­le neun Jah­re alt), habe ich die jeweils neue­sten Ver­sio­nen der Ent­wick­lungs­um­ge­bun­gen instal­liert, für CPLDs und FPGAs von Intel (frü­her Alte­ra) also Quar­tus V21.1. Die­ses Paket beinhal­tet nicht mehr Model­sim, son­dern des­sen Nach­fol­ger Que­sta (bei­de von Men­tor). Die Bedie­ner­ober­flä­che ist prak­tisch gleich geblie­ben, aber es ist nun eine 64-bit Ver­si­on und die Simu­la­ti­ons­ge­schwin­dig­keit ist beein­druckend (was teil­wei­se auch am neu­en Note­book lie­gen könn­te). Lei­der benö­tigt die­se Ver­si­on eine zeit­lich auf ein Jahr befri­ste­te Lizenz, die aber kosten­los ist und danach auch ver­län­gert wer­den kann.

Fol­gen­des ist zu beach­ten: die alten mit Model­sim erstell­ten Pro­jek­te soll­ten durch neue mit Que­sta erstell­te Pro­jek­te ersetzt wer­den. Die alten Pro­jekt­da­tei­en ent­hal­ten Abhän­gig­kei­ten, die mit Que­sta nicht mehr funk­tio­nie­ren. Außer­dem muß das „vsim“-Kommando einen Para­me­ter für den Opti­mi­zer ent­hal­ten (voptargs=“+acc=prn“), damit die Namen der Ports (p), Regi­ster (r) und Net­ze (n) als Debug­in­for­ma­tio­nen erhal­ten blei­ben. Das voll­stän­di­ge vsim-Kom­man­do lau­tet also bei­spiels­wei­se folgendermaßen:

vsim <testbench> -voptargs="+acc=prn" -t 1ns

Das soll­te dann in den Test­ben­ches tb_*.do ent­spre­chend geän­dert werden.

ATME­GA­644-Code

Die Soft­ware, die auf dem ATMEGA644 aus­ge­führt wird, kann hier als Refe­renz her­un­ter­ge­la­den werden.

Ich ver­wen­de Atmel Stu­dio 7.0 als Ent­wick­lungs­um­ge­bung, habe aber kei­ne Pro­jekt­da­tei­en dazu­ge­fügt. Ver­mut­lich hat sowie­so jeder sei­ne eige­ne Phi­lo­so­phie bezüg­lich der Pfa­de. Das 7z-Archiv ent­hält auch eine PDF-Datei mit wei­te­ren Beschreibungen.

Im kom­men­den zwei­ten Teil soll die PC-Soft­ware zur Bedie­nung des Fre­quenz­zäh­lers beschrie­ben werden.

Meß­da­ten­ana­ly­se mit LibreOffice

In der Ent­wick­lungs­pha­se des noch zu beschrei­ben­den Fre­quenz­zäh­lers habe ich eini­ge Meß­rei­hen erstellt. Eine davon war der Fre­quenz­gang eines 8 MHz Quar­zes auf dem CPU-Board, die ande­re der Fre­quenz­gang eines 100 MHz Quarz­os­zil­la­tors auf dem Fre­quenz­zäh­ler selbst. Bei­de Fre­quenz­gän­ge wur­den über die Tem­pe­ra­tur gemes­sen, die mit Käl­te­spray (Butan­gas, nicht Rau­chen, kein offe­nes Feu­er aber offe­ne Fen­ster!) bzw. einem Föhn geän­dert wurde.

In bei­den Fäl­len wur­de die Tem­pe­ra­tur mit dem Tem­pe­ra­tur­sen­sor auf dem CPU-Board gemes­sen, einem TMP275. Zwi­schen ‑40 °C und +125 °C hat er eine Tole­ranz von +/- 1 °C. Die tat­säch­li­che Tem­pe­ra­tur des Quar­zes und beson­ders des Quarz­os­zil­la­tors dürf­ten um eini­ge °C von der gemes­se­nen Tem­pe­ra­tur abwei­chen, weil sie etwas ent­fernt davon mon­tiert sind. Es soll hier aber nicht um die Prä­zi­si­on der Mes­sung gehen, son­dern ein­zig und allein um die Aus­wer­tung mit Libre­of­fice Calc. Der Fre­quenz­zäh­ler spei­chert die Meß­da­ten in einem CSV-File ab, das mit Libre­Of­fice direkt ein­ge­le­sen wer­den kann. Die bei­den Open­Of­fice Calc Datei­en ste­hen als Refe­renz und für eige­ne Expe­ri­men­te zum Down­load bereit:

In der ersten Tabel­le der jewei­li­gen Datei ste­hen die ori­gi­nal Meß­da­ten. Die wei­te­ren Tabel­len sind nach­fol­gend beschrieben.

Aus­wer­tung

Zur Aus­wer­tung emp­fiehlt es sich, zunächst eine Pivot-Tabel­le („Daten->Pivot-Tabelle->Einfügen) zu erstel­len. Als Zei­len­fel­der wählt man die Tem­pe­ra­tur und als Daten­fel­der die gemes­se­ne Fre­quenz Fcheck. Für die Daten­fel­der inter­es­siert uns aber nicht die Sum­me, son­dern der Mit­tel­wert. Das muß vor dem Erzeu­gen der Pivot-Tabel­le ein­ge­stellt wer­den. Nun sucht Calc alle in der Tabel­le vor­kom­men­den Tem­pe­ra­tu­ren, sor­tiert sie auf­stei­gend und ord­net jeder Tem­pe­ra­tur den Mit­tel­wert aller für die­se Tem­pe­ra­tur gefun­de­nen Meß­wer­te zu. So erhal­ten wir eine Tabel­le der gemit­tel­ten Meß­wer­te von etwa ‑30 °C bis +70 °C (Tabel­le: „Pivot-Tabel­le“).

Da wir einen 8 MHz bzw. einen 100 MHz Quarz­os­zil­la­tor gemes­sen haben, lie­gen alle Meß­wer­te ziem­lich nahe bei 8.000.000 Hz oder 100.000.000 Hz. Ohne ver­nünf­ti­ge Ska­lie­rung sieht man da nur eine hori­zon­ta­le Linie über der Tem­pe­ra­tur. Damit die Meß­wer­te sinn­voll dar­ge­stellt wer­den kön­nen, erstellt man in die­sem Fall am besten eine Spal­te mit der Dif­fe­renz der Meß­wer­te zum Nomi­nal­wert, denn alle Wer­te wei­chen nur sehr wenig davon ab. Die­ses Del­ta läßt sich dann gra­fisch über der Tem­pe­ra­tur darstellen.

Die lin­ken Dia­gram­me zei­gen die unver­än­der­ten Ori­gi­nal­da­ten. Man erkennt deut­lich den Tem­pe­ra­tur­gang, aber die vie­len Aus­rei­ßer sind erschreckend. Die Ori­gi­nal­da­ten ent­hal­ten die sehr schnel­le Abkühl­pha­se mit Käl­te­spray und die fast genau­so schnel­le Auf­heiz­pha­se mit dem Föhn. Dar­an schließt sich jeweils eine Pha­se lang­sa­men Auf­hei­zens bzw. lang­sa­men Abküh­lens auf Zim­mer­tem­pe­ra­tur an.

Die rech­ten Dia­gram­me zei­gen nur die lang­sa­men Pha­sen und die Aus­rei­ßer sind hier kom­plett ver­schwun­den (Tabel­len: „Aus­wahl“ und „Pivot-Tabel­le_1“). Die Kur­ven­form bleibt unver­än­dert. Offen­sicht­lich tun in bei­den Fäl­len die schnel­len Tem­pe­ra­tur­än­de­run­gen nicht gut, die Schwin­gung reißt ver­mut­lich kurz­zei­tig ab.

Erzeu­gen einer Ausgleichskurve

Alle wei­te­ren Aus­wer­tun­gen erfol­gen nun mit den bei­den „lang­sa­men Kur­ven“, denn sie spie­geln offen­sicht­lich die wah­ren Ver­hält­nis­se. Das Ziel ist nun, die jewei­li­ge Kur­ve so zu glät­ten, daß die geglät­te­te Kur­ve mög­lichst genau der gemes­se­nen Kur­ve ent­spricht, ohne deren Meß­ab­wei­chun­gen abzu­bil­den. Die Stan­dard­me­tho­de zum Erzeu­gen einer soge­nann­ten Aus­gleichs­kur­ve ist die Aus­gleichs­rech­nung. Für ein mathe­ma­ti­schen Lösungs­ver­fah­ren muß die­ser Aus­gleichs­rech­nung ein Modell zugrun­de lie­gen. Im all­ge­mei­nen Fall ist das ein Poly­nom der Form

y = a0 + a1 * x + a2 * x2 + … + an * xn

In der Pra­xis muß man die­se Rei­he natür­lich früh­zei­tig irgend­wo abbre­chen, denn sonst wird der Rechen­auf­wand immer grö­ßer. Es sei vor­ab ver­ra­ten, daß bei den gezeig­ten Kur­ven min­de­stens ein Poly­nom drit­ten Gra­des nötig ist, also n = 3. Das liegt an den zwei loka­len Mini­ma bzw. Maxi­ma (jeweils grob bei 0 °C und bei 60 °C), bei denen die erste Ablei­tung des Poly­noms null sein muß. Um zwei Null­stel­len zu haben, muß die erste Ablei­tung aber min­de­stens einen qua­dra­ti­schen Term haben.

Pro­bie­ren wir den­noch zum Spaß und zu Übungs­zwecken ein­fach mal eine Gera­de aus, bre­chen also nach n = 1 ab (Tabel­le „Aus­gleichs­ge­ra­de“):

y = a0 + a1 * x

  • Wir tra­gen wenn mög­lich gut erra­te­ne Start­wer­te für die Para­me­ter a0 und a1 in jeweils eine Zel­le der Tabel­le ein (hier C2 und C3). In eine Spal­te (hier: Spal­te E) neben den Meß­wer­ten tra­gen wir dann die For­mel für die Gera­de ein, mit Bezug auf die Para­me­ter ($C$2 und $C$3) und fül­len die­se Spal­te nach unten auf (obe­re Zel­le und alle Zel­len bis zum Ende der Daten aus­wäh­len und Strg‑D drücken).
  • In einer wei­te­ren Spal­te berech­nen wir dann das Qua­drat des Feh­lers, den der so errech­ne­te Punkt zum tat­säch­lich gemes­se­nen Wert hat (hier: Spal­te F). Auch die­se Spal­te fül­len wir nach unten auf und errech­nen in einer wei­te­ren Zel­le (G2) die Sum­me all die­ser Feh­ler­qua­dra­te. Das Ziel ist nun, a0 und a1 (C2 und C3) so zu bestim­men, daß die Sum­me der Feh­ler­qua­dra­te mini­mal wird.

Von Hand ist das aus­ge­spro­chen müh­sam, aber zum Glück bie­tet Calc dafür eine auto­ma­ti­sche Lösung, den „Sol­ver“. Man star­tet Extras->Solver und gibt die Zel­le mit der Sum­me der Feh­ler­qua­dra­te (hier G2) als Ziel­zel­le an. Der Ziel­wert soll mini­mal wer­den und als ver­än­der­li­che Zel­len geben wir C2 und C3 in der Form $C$2:$C$3 an. Der Sol­ver rech­net nun eini­ge Sekun­den, denn er muss die Wer­te in C2 und C3 solan­ge anpas­sen, bis er einen Mini­mal­wert findet.

Wie die bei­den Dia­gram­me zei­gen, fin­det der Sol­ver nach eini­gen Sekun­den einen plau­si­blen Wert. Die oran­ge dar­ge­stell­ten Gera­den nähern die gemes­se­ne Kur­ve best­mög­lich an. Bei nur zwei Varia­blen und den linea­ren Eigen­schaf­ten einer Gera­den kann man auch sicher sein, ein ech­tes Mini­mum gefun­den zu haben.

Aus­gleichs­kur­ve mit Polynomen

Die Aus­gleichs­ge­ra­de aus dem vori­gen Kapi­tel ist bes­ser als nichts, aber sie befrie­digt nicht wirk­lich. Für bes­se­re rech­ne­ri­sche Annä­he­rung an die Meß­kur­ve kommt man nicht umhin, höher­gra­di­ge Poly­no­me zu ver­wen­den. Der Rechen­weg unter­schei­det sich dabei nicht grund­le­gend von dem der Aus­gleichs­ge­ra­den, nur die For­mel wird etwas kom­pli­zier­ter. Wir neh­men ein­fach wei­te­re Ter­me der Form anxn dazu.

Je grö­ßer n wird, je höher also die Ord­nung des Poly­noms wird, umso genau­er kön­nen wir die Meß­kur­ve annä­hern. Pro­bie­ren wir es der Rei­he nach durch, zunächst mit einem Poly­nom zwei­ten Grades:

Aus den oben schon genann­ten Grün­den ver­wun­dert es nicht, daß das die Meß­kur­ve noch nicht trifft. Wie erwar­tet gibt es nur einen loka­len Extrem­wert, ein Mini­mum bei etwa 20 °C. Ver­su­chen wir es nun mit einem Poly­nom drit­ten Grades:

Damit kom­men wir der Form der gemes­se­nen Kur­ve schon sehr nahe. Gleich­zei­tig wird die Sum­me der Feh­ler­qua­dra­te mit stei­gen­dem Grad des Poly­noms immer kleiner.

Um es auf die Spit­ze zu trei­ben, kann man für den 100 MHz Quarz­os­zil­la­tor auch ein Poly­nom vier­ten und fünf­ten Gra­des aus­pro­bie­ren, das wei­te­re klei­ne Ver­bes­se­run­gen bringt:

Tem­pe­ra­tur­kom­pen­sa­ti­on per Software

Das sind net­te Spie­le­rei­en mit einem Spreadsheet-Pro­gramm, aber was bringt das gan­ze nun? Ganz ein­fach, das so gefun­de­ne Poly­nom gestat­tet uns eine soft­ware­ge­steu­er­te Tem­pe­ra­tur­kom­pen­sa­ti­on. Wir kön­nen die mut­maß­li­che tat­säch­li­che Fre­quenz des Oszil­la­tors bei einer bestimm­ten Tem­pe­ra­tur aus sei­ner Nomi­nal­fre­quenz annähern.

Das zeigt die Tabel­le Poly_n5 für bei­de Quarz­os­zil­la­to­ren. In der Spal­te H wur­de die nach der Kom­pen­sa­ti­on ver­blei­ben­de Abwei­chung zur gemes­se­nen Fre­quenz errech­net und in Spal­te I in ppm (parts per mil­li­on) umge­rech­net. Die ver­blei­ben­de Abwei­chung liegt nun außer an den Tem­pe­ra­tur­gren­zen bei weni­ger als 1 ppm. Die unkom­pen­sier­te Abwei­chung ist zum Ver­gleich in Spal­te J dar­ge­stellt und deren Maxi­mum liegt bei knapp 40 ppm bzw. gut 16 ppm, was für einen mit +/- 25 ppm spe­zi­fi­zier­ten Quarz auch schon recht gut ist.

Man beach­te die unter­schied­li­che Ska­lie­rung der y‑Achsen. Von den extre­men Tem­pe­ra­tur­be­rei­chen abge­se­hen, hat die Tem­pe­ra­tur­kom­pen­sa­ti­on die Fre­quenz­sta­bi­li­tät also min­de­stens um den Fak­tor 10 ver­bes­sert. Die deut­li­chen Abwei­chun­gen bei etwa 25 °C lie­gen an der Meß­me­tho­de, denn die Zim­mer­tem­pe­ra­tur war jeweils der End­punkt der Mes­sun­gen. Hier gab es mut­maß­lich Meß­feh­ler durch den abge­setz­ten Tem­pe­ra­tur­sen­sor auf dem CPU Board, der durch die Eigen­er­wär­mung eini­ge Grad mehr anzeigt, als beim Quarz wirk­lich herrschen.

Such­stra­te­gien

Bei der hier gezeig­ten Meß­da­ten­ana­ly­se kommt der Calc-Sol­ver schnell an sei­ne Gren­zen. Am Ende steht ein Poly­nom fünf­ter Ord­nung mit sechs unbe­kann­ten Para­me­tern a0 .. a5. Der Sol­ver muß im Prin­zip alle mög­li­chen Para­me­ter-Wer­te durch­pro­bie­ren, die Qua­drat­sum­me bil­den und ver­su­chen, die­se Sum­me zu mini­mie­ren. Ohne halb­wegs pas­send gewähl­te Start­wer­te ist das ein Unter­fan­gen, das auf heu­ti­gen Rech­nern nicht lös­bar ist. Der Such­raum ist unend­lich groß und der Sol­ver muß ihn auf irgend­ei­ne Wei­se ein­schrän­ken. Sei­ne Suche gilt als been­det, wenn die Qua­drat­sum­me bei jeder klei­nen Ände­rung eines Para­me­ters wie­der grö­ßer wird. Dabei besteht aber immer die Gefahr, ein loka­les Mini­mum zu fin­den, das weit weg vom tat­säch­li­chen Mini­mum liegt. Es kann immer sein, daß hin­ter den Ber­gen bei den sie­ben Zwer­gen ein Mini­mum liegt, das tau­send­mal schö­ner als das bis­her gefun­de­ne ist. Man soll­te dem Sol­ver also durch geeig­ne­te Anfangs­wer­te hel­fen. Wie macht man das?

Suk­zes­si­ve Erhö­hung des Polynom-Grades

Die ein­fach­ste Metho­de, die hier auch ange­wen­det wur­de, ist die suk­zes­si­ve Erhö­hung des Poly­nom Gra­des. Man star­tet mit nied­ri­ger Ord­nung und lässt den Sol­ver dazu pas­sen­de Para­me­ter suchen. Geht man schritt­wei­se zu höhe­ren Ord­nun­gen, dann sind die­se Para­me­ter zwar nicht mehr ganz rich­tig, aber auch nicht ganz falsch. Sie sind ein guter Start­wert. Man kann auch zunächst mal nur den besten neu­en Para­me­ter suchen und erst dann eine wei­te­re Suche über alle bis­he­ri­gen Para­me­ter star­ten. So ver­bes­sert sich das Ergeb­nis nach und nach.

Kur­ven­dis­kus­si­on

Eine Kur­ven­dis­kus­si­on kann beim Erra­ten gün­sti­ger Anfangs­wer­te für die Para­me­ter hel­fen. Zur Kur­ven­dis­kus­si­on benö­tigt man die Ablei­tun­gen der Funk­ti­on. Gehen wir zunächst von einem Poly­nom drit­ten Gra­des aus, so erge­ben sich fol­gen­de Ableitungen:

y = a0 + a1 * x + a2 * x2 + a3 * x3

y‘ = a1 + 2 * a2 * x + 3 * a3 * x2

y“ = 2 * a2 + 6 * a3 * x

Aus der ersten Glei­chung erkennt man sofort, daß a0 = y(0) ist, denn wenn x = 0 ist, dann fal­len alle ande­ren Ter­me weg. a0 ist beim 8 MHz Oszil­la­tor also etwa 212 und beim 100 MHz Oszil­la­tor etwa 355.

Die erste Ablei­tung einer Funk­ti­on ist an loka­len Extrem­wer­ten gleich null. Beim 100 MHz Oszil­la­tor fin­den wir ein loka­les Mini­mum etwa bei x=3 und ein loka­les Maxi­mum bei etwa x=60. Mit der ersten Ablei­tung erhal­ten wir dar­aus zwei Gleichungen:

y‘ = a1 + 2 * a2 * 3 + 3 * a3 * 32 = 0

y‘ = a1 + 2 * a2 * 60 + 3 * a3 * 602 = 0

Aus zwei Glei­chun­gen mit drei Unbe­kann­ten kann man durch Mul­ti­pli­ka­ti­on mit einem geeig­ne­ten Fak­tor und anschlie­ßen­der Addi­ti­on bei­der Glei­chun­gen eine Glei­chung mit zwei Unbe­kann­ten machen. Eli­mi­nie­ren wir zunächst a2 durch Mul­ti­pli­ka­ti­on der ersten Glei­chung mit ‑20 und anschlie­ßen­der Addition:

‑20 * (a1 + 2 * a2 * 3 + 3 * a3 * 32) + a1 + 2 * a2 * 60 + 3 * a3 * 602 = 0

ergibt nach Auflösung:

a1 = 540 * a3

Durch Mul­ti­pli­ka­ti­on mit ‑1 und anschlie­ßen­der Addi­ti­on lässt sich alter­na­tiv a1 eliminieren:

a1 + 2 * a2 * 60 + 3 * a3 * 602 – (a1 + 2 * a2 * 3 + 3 * a3 * 32) = 0

und nach Ausmultiplizieren

a2 = ‑94,5 * a3

Damit haben wir eine direk­te Abhän­gig­keit zwi­schen a1 und a3 bzw. a2 und a3 gefun­den. Die­se bei­den For­meln kann man direkt in die Zel­len für a1 und a2 ein­ge­ben und braucht sie dann nicht mehr in die Liste der Unbe­kann­ten für den Sol­ver auf­zu­neh­men. Der Such­raum ist also wei­ter deut­lich eingeschränkt.

Kön­nen wir noch mehr tun? Ja klar, wir ken­nen nun Nähe­rungs­wer­te für a0, a1 und a2 und kön­nen die in die Glei­chung des Poly­noms einsetzen:

y = 355 + 540 * a3 * x – 94,5 * a3 * x2 + a3 * x3

Ohne zu ver­ges­sen, daß alles sowie­so nur Nähe­rungs­wer­te sind, suchen wir aus der Meß­rei­he einen Wert x und den zuge­hö­ri­gen Wert y her­aus. Dabei ver­su­chen wir einen reprä­sen­ta­ti­ven Wert zu fin­den, also Son­der­fäl­le an den Tem­pe­ra­tur­gren­zen und auch die loka­len Extrem­wer­te zu ver­mei­den. Wie wär’s, mehr oder weni­ger will­kür­lich, mit x=40 und y=773? Mit die­sen Wer­ten kön­nen wir nun einen plau­si­blen Start­wert für a3 ausrechnen:

773 = 355 + 540 * a3 * 40 – 94,5 * a3 * 402 + a3 * 403

Aus die­ser Glei­chung ergibt sich a3 = ‑0,006372 und durch Ein­set­zen die­ses Wer­tes in die oben schon gefun­de­nen Glei­chun­gen a1 = ‑3,44088 und a2 = 0,602154.

Damit haben wir dem Sol­ver das Leben leicht­ge­macht. Wir haben plau­si­ble Start­wer­te für alle Para­me­ter des Poly­noms drit­ter Ord­nung. Ohne den Sol­ver auch nur zu bemü­hen, deckt sich die­se Kur­ve schon erstaun­lich gut mit der Meß­kur­ve (links):

Rechts ist noch­mal zum Ver­gleich das oben schon gezeig­te Dia­gramm des mit dem Sol­ver gefun­de­nen Poly­noms der­sel­ben Ord­nung gezeigt. Über gro­ße Tei­le des Dia­gramms ist die Deckung des von Hand gefun­de­nen Poly­noms sogar bes­ser. Aller­dings ist die Sum­me der Feh­ler­qua­dra­te den­noch höher, denn um den Dia­gramm­teil bei hohen Tem­pe­ra­tu­ren kor­rekt zu model­lie­ren feh­len die höher­gra­di­gen Terme.

Ganz am Schluß kann man dann a0 bis a3 noch­mal durch den Sol­ver ver­bes­sern las­sen. Der fin­det dabei tat­säch­lich eine bes­se­re Lösung, als bei der Suche aufs Gera­te­wohl im ersten Ansatz. Die gering­ste Sum­me der Feh­ler­qua­dra­te ergibt sich bei a0 = 339,27, a1 = ‑3,023, a2 = 0,703 und a3 = ‑0,00858.

Mit dem­sel­ben Vor­ge­hen kann man natür­lich auch den Fall des 8 MHz Oszil­la­tors noch­mal durch­spie­len, was aber hier kei­ne neu­en Erkennt­nis­se mehr bringt. Das sei daher dem geneig­ten Leser überlassen.

Nütz­li­che Websites

Anläss­lich mei­ner diver­sen Designs in den ver­gan­ge­nen Mona­ten, brauch­te ich immer wie­der mal die Mög­lich­keit, ein­fa­che Gra­fi­ken, Tabel­len und For­meln als Text in die Quell­tex­te der C‑Programme und Veri­log-Datei­en als Kom­men­tar­blöcke ein­zu­bet­ten. Bis­her habe ich mehr schlecht als recht mit AACir­cuit gear­bei­tet, das aller­dings schon reich­lich ange­staubt ist und auch sei­ne Macken hat. Eine Suche im Inter­net för­der­te ein paar sehr hilf­rei­che Online-Tools zu Tage.

Dia­gon – ASCII art dia­gram collection

Dia­gon (Dia­gram Online) ist ein Online-Tool, um mathe­ma­ti­sche Aus­drücke, Tabel­len, Fluß­dia­gram­me und son­sti­ges in ASCII- oder UTF-8-For­mat umzu­wan­deln. Ein­fach mal die Web­site auf­ru­fen und aus­pro­bie­ren. Man wählt zunächst das Werk­zeug aus und kann dann im Ein­ga­be­fen­ster die Roh­da­ten ein­ge­ben. Sie wer­den dann sofort im Aus­ga­be­fen­ster dar­ge­stellt und kön­nen mit Copy&Paste in den eige­nen Code über­nom­men wer­den. Für jedes Tool gibt es ein oder meh­re­re Bei­spie­le, die zei­gen, wie es geht.

ASCIIFLOW

ASCIIFLOW ist ein wei­te­res Online-Tool, das auf das Zeich­nen ein­fa­cher geo­me­tri­scher For­men spe­zia­li­siert ist. Man kann Recht­ecke, Lini­en und Pfei­le zeich­nen und natür­lich auch Tex­te ein­ge­ben. ASCIIFLOW unter­stützt außer dem ASCII-Zei­chen­satz auch den erwei­ter­ten Zei­chen­satz, der schö­ne Lini­en und Ecken dar­stel­len kann. Dar­über­hin­aus kann man das Ergeb­nis direkt als Kom­men­ta­re in /* und */ ein­bet­ten. Das zeigt, was der Ent­wick­ler im Sinn hatte.

Tex­tik

Tex­tik funk­tio­niert ähn­lich wie ASCIIFLOW. Auch hier kann man auf einer Lein­wand ein­stell­ba­rer Grö­ße Recht­ecke, Lini­en, Pfei­le und Text zeich­nen. Anders als ASCIIFLOW kennt Tex­tik unter­schied­li­che Ebe­nen in z‑Richtung. Man kann also wäh­len, ob ein Objekt über oder unter ande­ren Objek­ten liegt. Dafür unter­stützt Tex­tik aber nur den Stan­dard ASCII Zeichensatz.

Was noch schön wäre…

Ich hät­te noch ein Tool gesucht, das ein­fa­che (exten­ded-) ASCII-Timing Dia­gram­me dar­stel­len kann. Auch das ist in Quell­tex­ten immer wie­der mal nötig. Bis­her zeich­ne ich sowas von Hand, dabei bricht man sich die Fin­ger. Est recht, wenn man dar­an etwas ändern muß. Wer sowas kennt, kann mich ger­ne kon­tak­tie­ren. Ich habe auch schon über­legt, sowas sel­ber zu schreiben.

Phy­si­ka­li­sche Eigen­schaf­ten, überarbeitet

Die hier beschrie­be­ne Libre­Of­fice Tabel­le habe ich nun etwas über­ar­bei­tet. Ich habe die Struk­tur grund­le­gend geän­dert und die Berech­nung um den Skin-Effekt erwei­tert. Man kann also jetzt auch den Wider­stand eines Lei­ters bei Anle­gen einer Wech­sel­span­nung bestim­men. Das funk­tio­niert nur ange­nä­hert und auch nur bei den Mate­ria­li­en, für die die magne­ti­sche Per­mea­bi­li­tät ver­füg­bar war. Die neue Tabel­le kann hier her­un­ter­ge­la­den werden:

Ich den­ke daß die Tabel­le selbst­er­klä­rend ist. Nur die grün hin­ter­leg­ten Fel­der müs­sen aus­ge­füllt wer­den. Man wählt das Lei­ter­ma­te­ri­al in B3 und den Quer­schnitt in B4. Wie in der alten Ver­si­on kann man Draht (rund), Rohr (rund und hohl) oder Lei­ter­band (recht­eckig) aus­wäh­len. Dann gibt man die Fre­quenz, die Tem­pe­ra­tur, die Strom­stär­ke (optio­nal) und die Dimen­sio­nen an. Dar­un­ter wer­den eini­ge Zwi­schen­er­geb­nis­se ange­zeigt, die man nor­ma­ler­wei­se nicht braucht, die aber zu Kon­troll­zwecken nütz­lich sein kön­nen. Die Ergeb­nis­se ste­hen dann in den Zel­len E3 bis I3.

Alles wie immer ohne Gewähr. Wer Feh­ler fin­det, möge sie mir bit­te mit­tei­len und ich wer­de mich um Kor­rek­tur bemühen.

Anpas­sung der end­ge­spei­sten Drahtantenne

Die Anpas­sung einer end­ge­spei­sten Draht­an­ten­ne (im eng­li­schen als End-Fed-Half-Wave- oder EFHW-Anten­ne bezeich­net) ist lei­der nicht so tri­vi­al, wie man mei­nen könn­te, ins­be­son­de­re wenn man meh­re­re Bän­der abdecken möch­te. Es geht schon damit los, daß das Ver­hal­ten rea­ler Über­tra­ger, auch wenn man sich viel Mühe beim Wickeln macht, in der Regel weit ent­fernt von dem eines idea­len Über­tra­gers ist. Der Kop­pel­fak­tor der Win­dun­gen liegt deut­lich unter 1 und para­si­tä­re Kapa­zi­tä­ten zwi­schen den Wick­lun­gen machen den Über­tra­ger fre­quenz­ab­hän­gig. Dar­über­hin­aus macht die Fre­quenz­ab­hän­gig­keit und die magne­ti­sche Sät­ti­gung des Kern­ma­te­ri­als zu schaffen.

Die Dimen­sio­nie­rung des Über­tra­gers erfor­dert eini­ge Kom­pro­mis­se. Zunächst soll­te man sich auf die maxi­mal zu über­tra­gen­de Lei­stung fest­le­gen. Im Inter­net fin­det man Hin­wei­se, daß ein FT-140-Kern für 100 Watt reicht. So pau­schal stimmt das aber nicht. Der Crest-Fak­tor ist bei SSB ein ganz ande­rer als bei digi­ta­len Betriebs­ar­ten. Bei SSB ist die nomi­na­le Aus­gangs­lei­stung ein Spit­zen­wert, der nur kurz­zei­tig erreicht wird, wäh­rend die gesam­te Lei­stung bei FT‑8 15 Sekun­den lang über­tra­gen wer­den muß, bei WSPR sogar für zwei Minu­ten, bei RTTY gege­be­nen­falls sogar noch län­ger. Mes­sun­gen mit einer FLIR-Kame­ra haben gezeigt, daß die Tem­pe­ra­tur des Ring­kerns mei­nes ersten Anpaß­glieds mit einem FT140-77 schon nach kur­zem Betrieb (weni­ge Minu­ten) mit 50 Watt auf deut­lich über 100 °C ansteigt.

Wärmebild des Ringkerns
Wär­me­bild des Ring­kerns nach weni­gen Minu­ten Bela­stung mit 50 Watt auf dem 40-m-Band.

So kann das nicht blei­ben. Wo lie­gen die Ursa­chen und was muß ich ändern?

Nach einer alten Faust­re­gel soll der Blind­wi­der­stand eines Über­tra­gers min­de­stens vier­mal so groß sein, wie der reel­le Last­wi­der­stand. Bei 50 Ω auf der Pri­mär­sei­te wären das also min­de­stens 200 Ω, was bei 7 MHz knapp 5 µH wären. Mit einem FT-140 77 Ring­kern wäre die­se Induk­ti­vi­tät schon bei etwas mehr als einer Win­dung erreicht. Das ist natür­lich schon beim Wickeln der Spu­le recht unprak­tisch, weil ohne Hand­stand eigent­lich nur ganz­zah­li­ge Win­dungs­zah­len mög­lich sind. Das grö­ße­re Pro­blem ist aber die magne­ti­sche Fluß­dich­te, die durch den ver­wen­de­ten Ring­kern begrenzt ist. Wird die Fluß­dich­te zu hoch, dann gerät der Kern in die Sät­ti­gung und die magne­ti­sche Feld­stär­ke im Kern steigt dann nicht mehr pro­por­tio­nal zur ange­leg­ten Span­nung. Das über­tra­ge­ne Signal wird ver­zerrt und die Kern­ver­lu­ste stei­gen über­pro­por­tio­nal, so daß der Kern über­mä­ßig heiß wird.

Die magne­ti­sche Fluß­dich­te ist pro­por­tio­nal zur ange­leg­ten Span­nung und umge­kehrt pro­por­tio­nal zur Win­dungs­zahl der Spu­le. Die maxi­ma­le Fluß­dich­te, die der Kern ver­trägt, ist außer­dem auch noch fre­quenz­ab­hän­gig. Der mini Ring­kern­rech­ner berech­net die Fluß­dich­te einer Spu­le und zeigt freund­li­cher­wei­se für eini­ge Ker­ne auch die maxi­mal mög­li­che Fluß­dich­te an. Der oben genann­te Ring­kern soll­te min­de­stens 5 Win­dun­gen haben, um 100 W auf dem 40-m-Band zu über­tra­gen. Die gewähl­te Anzahl von 3 Win­dun­gen ist also deut­lich zu nied­rig. Bei 5 Win­dun­gen hat die Pri­mär­spu­le aber schon 56 µH und einen Blind­wi­der­stand von 2,5 kΩ. Das wäre auf 40 m bei 7 MHz sicher noch trag­bar, aber am ande­ren Ende bei 29 MHz sind das schon über 10 kΩ und bei den hohen Fre­quen­zen machen sich dann auch die Kapa­zi­tä­ten zwi­schen den ein­zel­nen Win­dun­gen immer deut­li­cher bemerk­bar. Die Win­dungs­zahl begrenzt also die obe­re nutz­ba­re Fre­quenz des Über­tra­gers. Eine „ech­ter“ Breit­band­über­tra­ger ist also immer ein Kompromiß.

Für einen neu­en Über­tra­ger habe ich nun zwei gesta­pel­te FT140-43 aus­ge­wählt. Durch das Sta­peln hal­biert sich der magne­ti­sche Fluß für jeden der bei­den Ker­ne und die Induk­ti­vi­tät ver­dop­pelt sich, da sich der umwickel­te Quer­schnitt ver­dop­pelt. Der AL-Wert des ‑43-er Kerns ist weni­ger als halb so groß, wie der des ‑77-er Kerns. Damit erge­ben N Win­dun­gen auf zwei ‑43-er Ker­nen etwas weni­ger Induk­ti­vi­tät, als die glei­che Win­dungs­zahl auf einem ein­zi­gen ‑77-er Kern. Die Fluß­dich­te ist hal­biert und liegt bis 100 Watt im 40-m-Band im Rah­men des Erlaub­ten. Hier ein Foto des ersten Ver­suchs mit einem Win­dungs­ver­hält­nis von 3:18 (Über­tra­gungs­ver­hält­nis 1:36, also 50 Ω am Ein­gang, 1,8 kΩ am Ausgang):

Übertrager mit zwei FT140-43 Ringkernen
Über­tra­ger mit zwei FT140-43 Ringkernen

Die letzt­lich ver­wen­de­te Ver­si­on hat ein noch höhe­res Wick­lungs­ver­hält­nis von 3:22. Da der bis­her ver­wen­de­te Anten­nen­draht von 18,55 m Län­ge zu kurz war, habe ich ihn durch einen 20,30 m lan­gen Draht ersetzt. Damit liegt die Reso­nanz nun deut­lich bes­ser auf den Ama­teur­bän­dern. Die gemes­se­ne Impe­danz sieht nun fol­gen­der­ma­ßen aus:

Impedanz des 20,30m Antennedrahts mit 2xFT140-43 und 100pF Anpassung
Impe­danz des 20,30 m lan­gen Anten­ne­drahts mit 2xF­T140-43 und 100pF Anpassung.

Das Steh­wel­len­ver­hält­nis liegt nun also auf 20- und 40‑m unter­halb von 3:1 und kann vom Anten­nen­tu­ner des IC-7300 ange­passt wer­den. Das 15-m-Band liegt zwar außer­halb, wird aber zumin­dest im unte­ren Bereich noch vom Anten­nen­tu­ner erfasst. Das 10-m-Band liegt deut­lich außer­halb, funk­tio­niert aber noch im Emer­gen­cy-Modus mit bis zu 50 Watt Ausgangsleistung.

Nach dem Lehr­buch müss­ten die oben gezeig­ten Fre­quen­zen alle im Mit­tel­punkt des Smith-Charts bei zumin­dest unge­fähr 50 Ω lie­gen, denn die Bän­der sind har­mo­nisch zuein­an­der. Die Abwei­chun­gen dürf­ten im wesent­li­chen an dem immer noch unzu­läng­li­chen Über­tra­ger lie­gen, sei­nem Kopp­lungs­ver­hält­nis, den para­si­tä­ren Kapa­zi­tä­ten und den Kern­ver­lu­sten. Den­noch sieht das Chart rea­li­stisch aus, denn nicht-reso­nante Fre­quen­zen haben hohe Blind­an­tei­le. Sie fin­den sich am Rand des Smith-Dia­gramms. Bei dem ursprüng­li­chen Über­tra­ger fan­den sich fast alle Fre­quen­zen inner­halb des SWV 3:1 Krei­ses. Das kann nur durch hohe Ver­lu­ste kom­men, denn nur eine Dum­my-Load hat über einen gro­ßen Fre­quenz­be­reich ein Steh­wel­len­ver­hält­nis von 1:1. Eine Auf­nah­me mit der Wär­me­bild­ka­me­ra zeigt, daß sich die Ver­lu­ste jetzt in Gren­zen halten:

Übertrager mit 2xFT140-43 nach mehreren Minuten Betrieb auf 40-m mit 100 Watt
Über­tra­ger mit 2xF­T140-43 nach meh­re­ren Minu­ten Betrieb auf 40‑m mit 100 Watt

Auch nach meh­re­ren Minu­ten Betrieb auf dem 40-m-Band mit 100 Watt steigt die Tem­pe­ra­tur nicht mehr wesent­lich an. Die Kame­ra macht zwei Fotos, eines im opti­schen Bereich und eines im Infra­rot­be­reich, die je nach Abstand des Motivs nicht ganz in Deckung sind.