Neue CPU- und Relaistreiber-Boards

Nach­dem ich mich im ver­gan­ge­nen hal­ben oder drei­vier­tel Jahr mit dem Erwerb und Auf­bau einer neu­en CNC-Frä­se (eine Sor­otec BL1005) und der dazu­ge­hö­ri­gen Steue­rung beschäf­tigt habe, muss­te ich end­lich mal wie­der „etwas elek­tro­ni­sches“ machen. Die Frä­se läuft inzwi­schen, aber es fehlt noch drin­gend eine Umhau­sung und eine Min­der­men­gen­schmie­rung ins­be­son­de­re zum Frä­sen von Alu­mi­ni­um. Da steht noch eini­ges an Arbeit an. Aber das ist ein ganz ande­res The­ma, das ich gele­gent­lich auch noch beschrei­ben werde.

Für einen dem­nächst geplan­ten neu­en Anten­nen­tu­ner sol­len mehr als 16 bista­bi­le Relais ange­steu­ert wer­den. Das erfor­dert einen erwei­ter­ten Relais­trei­ber. Und wo wir schon dabei sind, kann auch das CPU-Board einen Update ver­tra­gen. Nötig gewe­sen wäre der aller­dings nicht.

Relais­trei­ber V1.2

Das alte Relais­trei­ber Board funk­tio­niert ein­wand­frei, hat aber nur vier high-side Trei­ber und acht low-side Trei­ber. Damit las­sen sich bei ent­spre­chen­dem Mul­ti­plex­ing bis zu 32 Relais­spu­len trei­ben. Beim Ein­satz bista­bi­ler Relais mit jeweils zwei Spu­len redu­ziert sich das dann aller­dings auf maxi­mal 16 Relais. Das reicht für einen Anten­nen­tu­ner mit acht geschal­te­ten Kon­den­sa­to­ren und acht geschal­te­ten Spu­len aus, aber sobald man auch nur die Kon­fi­gu­ra­ti­on zwi­schen L‑C und C‑L umschal­ten will, feht min­de­stens ein Relais. Daher habe ich ein neu­es Relais­trei­ber Board mit dop­pel­ter Anzahl an high-side Aus­gän­gen gebaut. Damit kön­nen nun bis zu 32 bista­bi­le Relais ange­steu­ert werden.

Durch die Aus­wahl einer vier­la­gi­gen Lei­ter­plat­te, den Ein­satz kleinst­mög­li­cher Gehäu­se­bau­for­men und Aus­nut­zung der Design-Regeln konn­ten fast alle Bau­tei­le auf einer Sei­te plat­ziert wer­den. Für Wider­stän­de und Kon­den­sa­to­ren wur­de fast durch­ge­hend die 0402 Packungs­grö­ße gewählt, ein ULN2803 low-side Trei­ber mit acht Kanä­len kommt im QFN-Gehäu­se zum Ein­satz. Kein Pro­blem bei auto­ma­ti­scher Bestückung. Wegen des Platz­ge­winns konn­te nun zusätz­lich noch ein 5 V‑Fest­span­nungs-Schalt­reg­ler ein­ge­baut wer­den. Es ist ein TI Simp­leS­wit­cher vom Typ LMR50410, der bis zu 36 V Ein­gangs­span­nung ver­trägt. Wegen der not­wen­di­gen Span­nungs­fe­stig­keit wur­den an des­sen Ein­gang etwas grö­ße­re Kon­den­sa­to­ren der Bau­form 0603 ein­ge­setzt. Die tat­säch­lich ver­wen­de­te Ein­gangs­span­nung wird 24 V nicht über­stei­gen. Daher wur­de eine SMBJ28A TVS-Schutz­di­ode ein­ge­baut, die zusam­men mit einer Siche­rung vor Span­nungs­spit­zen und Ver­po­lung schützt.

Durch den ULN2803 auf der auto­ma­tisch bestück­ten Sei­te bleibt nun auf der Gegen­sei­te genug Platz für zwei high-side Trei­ber vom Typ BTS724G, die dann aber hän­disch auf­ge­lö­tet wer­den müs­sen. Bei 50 mil Pin-pitch ist das kein Pro­blem. Außer­dem müs­sen die Prüf­pins und die Stift- und Sockel­lei­sten von Hand gelö­tet werden.

Hier nun die 3D-Ansich­ten von bei­den Sei­ten, der Schalt­plan im PDF-For­mat und die KiCad-Dateien.

Für die Spei­cher­dros­sel L33 und die Siche­rung F1 ist lei­der z.Zt. kein 3D-Modell vor­han­den, sie sind aber bestückt.

ATMEGA644PA CPU-Board V1.2

Auch das ATMEGA644PA-CPU Board V1.1 habe ich über­ar­bei­tet. Die­ses Board hat zwar auch zuver­läs­sig funk­tio­niert, aber die Bestückung von Hand ist doch müh­sam und feh­ler­an­fäl­lig. Außer­dem hat es den klei­nen Nach­teil, daß es mit einem Line­ar-Fest­span­nungs­reg­ler bestückt ist, der nur bis zu 18 V Ein­gangs­span­nung ver­trägt (abs max). Für die ursprüng­lich geplan­ten maxi­mal 12 V ist das völ­lig aus­rei­chend, aber inzwi­schen kam der Wunsch auf, auch 24 V Ein­gangs­span­nun­gen zu ver­wen­den und wenn mög­lich sogar mehr. Selbst die 12 V erzeu­gen eine unnö­ti­ge Ver­lust­lei­stung von 350 mW, wenn die CPU 50 mA Strom zieht. Das ist zwar kei­ne Lei­stung, die signi­fi­kant auf die Strom­rech­nung durch­schlägt, sich aber doch bei Dau­er­be­trieb doch auf immer­hin 3 kWh im Jahr auf­sum­miert. Das kostet bei den aktu­el­len Strom­prei­sen mehr als 1 € pro Jahr. Wer hät­te das gedacht?

Den­noch, das grö­ße­re Pro­blem ist die Erwär­mung des Boards und dadurch eine Ver­fäl­schung der Tem­pe­ra­tur­mes­sung. Es muss­te also wie beim Relais­trei­ber ein Schalt­reg­ler her. Hier fiel die Wahl auf einen ein­stell­ba­ren Schalt­reg­ler, den LMR16006YQ. Auch das ist ein Simp­leS­wit­cher von Texas Instru­ments, der im Bau­tei­le­ar­se­nal von JLCPCB als „Exten­ded Com­po­nent“ gegen einen ein­ma­li­gen Auf­preis zur Ver­fü­gung steht. Er ver­trägt sogar bis zu 60 V Ein­gangs­span­nung und kann durch exter­ne Beschal­tung mit pas­sen­den Wider­stän­den den gesam­ten Betriebs­span­nungs­be­reich des ATMEGA644PA von 1,8 V bis 5,0 V abdecken. Er lie­fert einen Aus­gangs­strom von bis zu 600 mA.

Hier die KiCad 3D-Ansicht des Boards:

der Schalt­plan als PDF-Datei:

und die KiCad Designfiles:

Das Wider­stands­netz­werk des Schalt­reg­lers ist so dimen­sio­niert, daß eine Aus­gangs­span­nung von 5 V erzeugt wird. Durch optio­na­le Bestückung eines wei­te­ren Wider­stands auf der Ober­sei­te der Pla­ti­ne, kann eine nied­ri­ge­re Aus­gangs­span­nung von bei­spiels­wei­se 3,3 V erzeugt wer­den. Es wur­de ein 18,432 MHz Quarz ein­ge­baut, der die Aus­wahl aller Stan­dard-Baud­ra­ten gestat­tet und auch eine exak­te 1ms- und 10ms-Inter­rupt-Peri­ode erzeugt. Das ist für den Erhalt von Datum und Uhr­zeit wichtig.

Betriebs­span­nun­gen und Einschränkungen

Alle ver­bau­ten Kom­po­nen­ten kön­nen mit Betriebs­span­nun­gen zwi­schen 3.0 V und 5.5 V betrie­ben wer­den. Bei Betriebs­span­nun­gen unter­halb von 3.0 V ist die Funk­ti­on des MAX14783 RS485-Trans­cei­vers nicht mehr gewähr­lei­stet. Unter­halb von 2.7 V sind auch der Tem­pe­ra­tur­sen­sor TMP275 und die Span­nungs­re­fe­renz REF5025 außer­halb ihrer Spe­zi­fi­ka­ti­on. Der Mikro­con­trol­ler kann zwi­schen 2.7 V und 5.5 V mit 10 MHz Takt­fre­quenz betrie­ben wer­den, ab 4.5 V mit bis zu 20 MHz. Sein full-swing Quarz­os­zil­la­tor arbei­tet von 2.7 V bis 5.5 V bis 20 MHz. Der ein­ge­bau­te 18,432 MHz Quarz funk­tio­niert also sowohl bei 3,3 V als auch 5.0 V nomi­na­ler Betriebs­span­nung. Unter­halb von 4,5 V muß dann aber die Takt­fre­quenz über die CLKDIV8 Fuse auf ein Ach­tel davon ein­ge­stellt wer­den. Die CPU läuft dann mit 2,304 MHz los und kann anschlie­ßend durch Schrei­ben des Clock Pre­s­ca­le Regi­sters CLKPR auf einen Tei­lungs­fak­tor von 2 ein­ge­stellt wer­den. Damit kann das Board bei 3.3 V mit 9,216 MHz betrie­ben werden.

Betriebs­span­nungATMEGA64418,432 MHz OszillatorMAX14783TMP275REF5025
1,8 V ~ 2,7 V
inter­nal osc, max 4 MHz
2,7 V ~ 3,0 V
Clk÷2
3,0 V ~ 4,5 V
Clk÷2
4,5 V ~ 5,5 V
Ein­schrän­kun­gen bei ver­schie­de­nen Betriebsspannungen

Der Con­trol­ler funk­tio­niert ab 1.8 V, dann aber nur mit maxi­mal 4 MHz Takt­fre­quenz und einer ande­ren Takt­quel­le als dem full-swing Oszil­la­tor. Das kann bei­spiels­wei­se einer der inter­nen Oszil­la­to­ren sein.

Ein­stel­len der Betriebsspannung

Die Aus­gangs­span­nung des Schalt­reg­lers wird durch das Wider­stands­netz­werk R6||R9 und R8 ein­ge­stellt. Auf dem Board ist R6 mit 56 kΩ bestückt, R8 mit 10 kΩ und R9 ist unbe­stückt. In der nach­fol­gen­den Glei­chung wer­den die par­al­lel­ge­schal­te­ten Wider­stän­de R6 und R9 als RA bezeich­net und UA ist die gewünsch­te Aus­gangs­span­nung. Dann ist RA fol­gen­der­ma­ßen zu wählen:

RA = ((UA * R8) / 0,765) – R8
oder
RA = ((UA * 10.000) / 0,765) – 10.000

Unter die­sen Bedin­gun­gen errech­net sich R9 zu:

R9 = R6 * RA / (R6 – RA)
oder
R9 = 56.000 * RA / (56.000 – RA)

Solan­ge R9 unbe­stückt bleibt, errech­net sich eine Betriebs­span­nung von 5.0 V. Für eine Betriebs­span­nung von 3.3 V muß R9 mit einem 82 kΩ Wider­stand bestückt werden.

Strom­auf­nah­me

Die Strom­auf­nah­me des gesam­ten CPU-Boards liegt bei höch­stens 50 mA. Der Schalt­reg­ler wur­de daher für etwa 100 mA aus­ge­legt, was auch noch die Ver­sor­gung eines spar­sa­men exter­nen Boards ermög­licht. Der Schalt­reg­ler kann bis zu 600 mA lie­fern. Falls deut­lich mehr Strom als 100 mA benö­tigt wird, soll­te eine wei­te­re Spei­cher­dros­sel auf L5 bestückt wer­den. Sie ist zur ein­ge­bau­ten Spei­cher­dros­sel par­al­lel­ge­schal­tet. Zur Berech­nung ihrer Induk­ti­vi­tät soll­te das Daten­blatt zu Rate gezo­gen wer­den. Eine Grö­ßen­ord­nung von 10 ~ 22 µH ist ein guter Anhalts­punkt. Der Schalt­reg­ler wird übri­gens mit 2,1 MHz getaktet.

Bat­te­rie­be­trieb

Das Board kann mit einer Stütz­bat­te­rie betrie­ben wer­den, die die Span­nungs­ver­sor­gung bei Netz­aus­fall über­nimmt. Für die­sen Fall muß R1 ent­fernt und die Dop­pel­schott­ky­di­ode D3 auf der Ober­sei­te bestückt wer­den. Die Bat­te­rie­span­nung darf nicht höher als die Ver­sor­gungs­span­nung sein. Es ist zu beach­ten, daß die Ver­sor­gungs­span­nung aller Kom­po­nen­ten in die­sem Fall um die Dioden­span­nung von 0,3 ~ 0,5 V sinkt.

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 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.