Fre­quenz­zäh­ler – Ver­si­on 2.0

Wie schon im vori­gen Bei­trag zu dem Fre­quenz­zäh­ler ange­deu­tet, habe ich eine neue Ver­si­on ent­wickelt, die eini­ge Nach­tei­le behebt. Nun ist ein USB-RS232-Kon­ver­ter inte­griert, die CPU ist direkt auf die Lei­ter­plat­te gelö­tet und der Quarz­os­zil­la­tor ist ther­misch eng mit dem Tem­pe­ra­tur­sen­sor gekop­pelt. Der Zäh­ler wird jetzt, so wie man das von einem moder­nen PC-Peri­phe­rie­ge­rät erwar­tet, direkt über das USB-Inter­face ver­sorgt. Ein sepa­ra­tes Netz­teil ist nicht mehr nötig. Die Strom­auf­nah­me liegt bei unter 100 mA. Die Funk­ti­ons­wei­se ist weit­ge­hend kom­pa­ti­bel zur alten Ver­si­on, aber das CPLD-Pin­out unter­schei­det sich aus Grün­den des ein­fa­che­ren Rou­tings. Mit einer Grö­ße von 75 mm x 100 mm passt der Zäh­ler nun in ein FISCHER Frame Gehäu­se aus Aluminium.

Hier zunächst mal die 3D-Ansich­ten von KiCad und der Schaltplan:

Hier sind nun auch noch die KiCad V6.0 Pro­jekt­da­tei­en, der Schalt­plan und das Layout.

Seit der KiCad Ver­si­on 6.0 soll­ten alle Daten in die­sen Datei­en ent­hal­ten sein, so daß sie sich direkt auf einem ande­ren PC öff­nen und wei­ter­be­ar­bei­ten las­sen sollten.

Beschrei­bung

Auf der obe­ren lin­ken Sei­te des Boards sieht man den USB-RS232-Kon­ver­ter. Es han­delt sich um ein klei­nes Board mit dem FT232R-Bau­stein von FTDI. Die­ses Board ist für zwei bis drei Euro über die bekann­ten Online-Händ­ler zu bezie­hen. Im Zeh­ner­pack direkt aus Chi­na auch noch preiswerter.

Links unter dem FTDI-Board sieht man den Quarz­os­zil­la­tor und den Tem­pe­ra­tur­sen­sor. Ein gefrä­stes PVC-Gehäu­se sorgt für eine gewis­se ther­mi­sche Abschir­mung, so daß die Tem­pe­ra­tur des Quarz­os­zil­la­tors ziem­lich genau gemes­sen wer­den kann. Die­ses Gehäu­se besteht aus zwei Tei­len, die oben in der 3D-Ansicht semi­trans­pa­rent dar­ge­stellt sind. Durch einen klei­nen Trick wird eine enge ther­mi­sche Kopp­lung des Oszil­la­tors zu dem Tem­pe­ra­tur­sen­sor sicher­ge­stellt. Der Tem­pe­ra­tur­sen­sor im SOIC8-Gehäu­se ist über einer recht­ecki­gen Aus­frä­sung in der Lei­ter­plat­te mon­tiert, in den der Quarz­os­zil­la­tor manu­ell von der ande­ren Sei­te mon­tiert und über vier Dräh­te ange­schlos­sen wird. Hier die 3D-Nahan­sicht von oben und unten ohne das PVC-Gehäuse:

Der Fre­quenz­zäh­ler wird mit 3.3 V betrie­ben, weil das CPLD nicht mehr ver­trägt. Die­se Ver­sor­gungs­span­nung wird mit einem klei­nen Line­ar­reg­ler aus den 5 V vom USB Bus erzeugt. Der Micro­chip-Pro­zes­sor (ehe­mals Atmel) ATMEGA644 kom­mu­ni­ziert über sei­nen UART und das FTDI-Board mit dem PC und über Port-Pins per Bit-Ban­ging mit der Logik im CPLD. Das CPLD-Inter­face ist selbst­ge­strickt und folgt kei­nem Stan­dard, zum Host wird wie­der das Mod­bus Pro­to­koll ver­wen­det. Die Logik im CPLD ent­spricht im wesent­li­chen dem der vor­he­ri­gen Ver­si­on, nur das Pin­out ist geän­dert und hier sind kei­ne LEDs und kein DIP-Schal­ter mehr ange­schlos­sen. Die CPU hat kei­nen eige­nen Quarz mehr, son­dern sie wird mit dem auf 10 MHz her­un­ter­ge­teil­ten Takt des 100 MHz Quarz­os­zil­la­tors betrieben.

Die Takt­ein­gän­ge clk1 und clk2 sind wie in der vori­gen Ver­si­on mit 50 Ω Wider­stän­den ter­mi­niert und über einen ein­stu­fi­gen AC-gekop­pel­ten Tran­si­stor­ver­stär­ker in Emit­ter­schal­tung an das CPLD ange­schlos­sen. Um auch nied­ri­ge Fre­quen­zen bis hin zu DC zu unter­stüt­zen, wur­de der clk3-Ein­gang vor­ge­se­hen. Er ist über einen 100 Ω Wider­stand direkt an das CPLD ange­schlos­sen, das zum Schutz noch zwei Schott­ky-Dioden gegen GND und VCC geschal­tet hat. Die etwas selt­sam anmu­ten­de Aus­füh­rung mit Dop­pel­di­oden ist der zum Design­zeit­punkt ein­zig in der Bastel­ki­ste ver­füg­ba­ren Vari­an­te BAS70-05W geschul­det. Inzwi­schen ist auch die BAV99W-Vari­an­te in hin­rei­chen­den Stück­zah­len ein­ge­la­gert, die dann bei einem even­tu­el­len Rede­sign ein­ge­setzt würde.

Obe­rer und unte­rer Rand der Pla­ti­ne sind beid­sei­tig vom Löt­stopp­lack befreit. Die Kup­fer­flä­chen sind jeweils an GND ange­schlos­sen und stel­len so einen Kon­takt zum Gehäu­se her. Das ist bei einem Alu­mi­ni­um­ge­häu­se natur­ge­mäß unzu­ver­läs­sig, daher sind die zwei Flach­stecker TP4 und TP5 vor­ge­se­hen, über die zusätz­lich ein Mas­se­ka­bel mit dem Gehäu­se ver­bun­den wer­den kann.

Hier noch ein paar Fotos des fer­ti­gen Gerätes:

Die SMA-Buch­sen an der Vor­der- und Rück­sei­te wer­den über kur­ze RG174-Koax-Kabel an die Lei­ter­plat­te ange­schlos­sen. Weil die Buch­se des USB-RS232-Kon­ver­ters etwa 1 mm von der Rück­wand ent­fernt ist, die außer­dem 2 mm dick ist, reich­te ein klei­ner Durch­bruch lei­der nicht aus. Daher muss­te er lei­der so groß gefräst wer­den, daß der gesam­te Stecker hin­ein­passt. Neben dem clk3-Ein­gang und der USB-Buch­se ist auf der Rück­sei­te auch noch eine Flü­gel­schrau­be zur Erdung des Gerä­tes ange­bracht. Das wird nor­ma­ler­wei­se nicht nötig sein, könn­te aber bei grö­ße­ren HF-Lei­stun­gen in der Umge­bung hilf­reich sein.

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­ner­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­cis­i­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­cis­i­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.

Pre­s­ca­ler

Mit dem Pre­s­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­GA644-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 Ver­i­log. Ver­i­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 Pre­s­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.

Ver­i­log Code

Hier ist nun der Ver­i­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 Ver­i­log Datei­en FreqCntr_tb_Counter.v und FreqCntr_tb_Serial_IO.v ent­hal­ten die Model­Sim-Test­be­n­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­be­n­ches tb_*.do ent­spre­chend geän­dert werden.

ATME­GA644-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.

Was gibt’s neues?

Lei­der gab es seit ein paar Mona­ten kei­ne Updates mehr in die­sem Blog, das wer­de ich nun nach­ho­len. Im Som­mer war viel an unse­rem Haus zu tun, wir haben das Gar­ten­haus fer­tig­ge­stellt und auch im Haus gab und gibt es noch so eini­ge Bau­stel­len. Meist klei­ne Din­ge, die nicht drin­gend sind, aber doch bela­sten, weil man sie immer vor sich her­schiebt. Zwi­schen­durch hat­te ich immer wie­der etwas Zeit, um eine Lei­ter­plat­te zu desi­gnen oder Soft­ware zu schrei­ben, ohne mir aber die Zeit zu neh­men, die­se Din­ge in die­sem Blog zu beschrei­ben. Hier nun eine kur­ze Zusammenfassung.

ATMEGA644 V1.1

Nach­dem das mit der Fer­ti­gung und Bestückung des Relais­trei­bers in Chi­na so gut funk­tio­niert hat, habe ich auch das ATMEGA644 Board noch­mal auf­ge­legt und zehn Stück davon fer­ti­gen und teil­be­stücken las­sen. Es spart doch eine Men­ge Arbeit, wenn wenig­stens das Vogel­fut­ter schon­mal drauf ist und man nur noch die „makro­sko­pi­schen Bau­tei­le“ von Hand bestücken muß.

Ich habe die Schal­tung mini­mal geän­dert, es wur­den zwei optio­na­le Schott­ky-Dioden vor­ge­se­hen, damit man dem Board ein Bat­te­rie-Back­up spen­die­ren kann und es wur­den zwei zusätz­li­che Stütz­kon­den­sa­to­ren für den Pro­zes­sor hin­zu­ge­fügt. Der hat jetzt an jedem sei­ner drei VCC-Pins einen eige­nen Stütz­kon­den­sa­tor. Kann nichts scha­den, kostet kein Geld (eini­ge mil­li-Cent) und bei 0402-er Bau­form ist auch der Platz­be­darf zu ver­nach­läs­si­gen. Den Trimm­kon­den­sa­tor am Quarz habe ich weg­ge­las­sen, der war sowie­so nur expe­ri­men­tell auf einem ein­zi­gen Board auf­ge­lö­tet. Außer­dem habe ich eine Mög­lich­keit vor­ge­se­hen, den Span­nungs­reg­ler etwas zu küh­len. Es sind zwei Boh­run­gen vor­han­den, in die ein Flach­stecker als Kühl­fah­ne ein­ge­lö­tet wer­den kann. Not­wen­dig ist die­se Küh­lung nicht, aber es hat sich beim Anten­nen­um­schal­ter und beim Tuner gezeigt, daß die Tem­pe­ra­tur der Pla­ti­ne im Betrieb um ein paar Grad ange­ho­ben wird und damit die Tem­pe­ra­tur­mes­sung ver­fälscht wird. Hier nun der Voll­stän­dig­keit hal­ber die 3D-Ansich­ten der neu­en Pla­ti­ne und der Schaltplan.

Zuge­ge­ben, die Kühl­fah­ne sieht etwas gewöh­nungs­be­dürf­tig aus, aber man muß sie ja nicht bestücken. Zudem kann man sie vor dem Ein­lö­ten seit­lich weg­bie­gen oder auch auf der Unter­sei­te bestücken. Sie kann natür­lich auch durch irgend­ein ande­res pas­sen­des Blech ersetzt werden.

Fre­quenz­zäh­ler

Pas­send zum oben beschrie­be­nen CPU-Board habe ich einen Fre­quenz­zäh­ler gebaut. Hier zunächst mal die 3D-Ansichten:

Auf der Ober­sei­te sieht man links das auf­ge­steck­te CPU-Board und dane­ben das Intel (Alte­ra) CPLD, in dem der Zäh­ler und das CPU-Inter­face imple­men­tiert sind. Rechts sind zwei SMA-Buch­sen ange­bracht, über die das zu mes­sen­de Signal und die Refe­renz­fre­quenz ein­ge­speist wer­den. Ganz links sieht man die Buch­se für die Span­nungs­ver­sor­gung und dar­über die Klemm­lei­ste für das RS485-Inter­face. Um das CPLD her­um sind Stift­lei­sten ange­bracht, auf die die nicht ver­wen­de­ten CPLD-Pins geführt sind. Damit ist das Board auch für ande­re Zwecke ver­wend­bar. Die Schal­ter­stel­lun­gen des vier­po­li­gen DIP-Schal­ters kön­nen von der CPU ein­ge­le­sen wer­den und die acht LEDs am obe­ren Rand kön­nen per Soft­ware ein- und aus­ge­schal­tet wer­den. Die bei­den zehn­po­li­gen Stift­lei­sten am obe­ren Rand der Pla­ti­ne die­nen zum Pro­gram­mie­ren der CPU und des CPLDs. Hier ist nun der Schaltplan:

Der Fre­quenz­zäh­ler funk­tio­niert inzwi­schen sehr gut. Die Simu­la­ti­on ergibt eine Grenz­fre­quenz von 120 MHz für die Refe­renz- und die Meß­fre­quenz. Den Zäh­ler wer­de ich spä­ter in vor­aus­sicht­lich meh­re­ren Bei­trä­gen detail­lier­ter beschrei­ben. Dazu gehört dann der in Ver­i­log geschrie­be­ne CPLD-Code, die Soft­ware für das CPU-Board und die Host Soft­ware für einen Win­dows-PC. Außer­dem lohnt es, die Aus­wer­tung einer Meß­rei­he mit Libre­of­fice genau­er anzu­schau­en. Viel­leicht fan­ge ich sogar damit an, auch wenn es die chro­no­lo­gisch fal­sche Rei­hen­fol­ge ist.

Pro­gram­mier- und Debugboard

Wo ich gera­de so schön am Desi­gnen war und sowie­so eine Bestel­lung in Chi­na plan­te, habe ich auch noch ein klei­nes Pro­gram­mier- und Debug­board für das ATME­GA644-CPU-Board ent­wickelt. Es dient dazu, Pro­gram­me auf das CPU-Board zu pro­gram­mie­ren und auch zu testen. Der ATMEGA644 hat meh­re­re Schnitt­stel­len, unter ande­rem die SPI Schnitt­stel­le zum Pro­gram­mie­ren des Flash-Spei­chers und des EEPROMs und die JTAG-Schnitt­stel­le, die dar­über­hin­aus auch zum Debug­gen ver­wen­det wer­den kann.

Auf dem Board sind außer­dem ein paar Taster und LEDs ange­bracht, damit auf ein­fa­che Wei­se ohne Emu­la­tor ein paar Ein- und Aus­ga­be­mög­lich­kei­ten zu haben. Auf die SMA-Buch­se kann der System­takt aus­ge­ge­ben wer­den, um sei­ne Fre­quenz bei­spiels­wei­se mit dem oben gezeig­ten Fre­quenz­zäh­ler bei unter­schied­li­chen Tem­pe­ra­tu­ren zu messen.

Der Schalt­plan zeigt kei­ne Beson­der­hei­ten, die erklä­rungs­be­dürf­tig wären.