Forum: Projekte & Code RP2040 reziproker Frequenzzähler mit TDC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mi N. (msx)



Lesenswert?

Vor knapp einem Jahr gab es die erste Schaltung eines reziproken 
Frequenzzählers mit dem RP2040 Pico-Board: 
Beitrag "Pico Frequenzzähler mit RP2040"

Die Nachfrage nach höherer Auflösung hat zu einer neuen Schaltung 
geführt, bei der die Messung der Zeit ganz von einem TDC Baustein AS6501 
übernommen wird. Ausgehend von einer lokalen oder externen 10 MHz 
Referenzfrequenz liefert der TDC Auflösungen im 10 ps Bereich und ist 
nicht mehr von dem lokalen 12 MHz des Pico-Boards abhängig.

Um diese hohe Auflösung nutzen zu können, ist ein sorgfältiger Aufbau 
mit separaten Versorgungsspannungen und 4-lagigen Layout notwendig. Das 
Pico-Board ist weiterhin zu kleinem Preis erhältlich, wobei der AS6501 
ein "Kostentreiber" ist. Wenn man es braucht, ist er trotzdem eine gute 
Wahl.

Die Schaltung von links nach rechts: oben links die Spanungsversorgung 
der Eingangsstufen und des TDC mit einem Linearregler. Darunter der 
lokale TCXO, der bei Anliegen einer externen Referenzfrequenz zur 
Vermeidung von Interferenzen abgeschaltet wird. Ein Multiplexer 
74AUP1G97 schaltet das Referenzsignal um.
Das Eingangssignal (links unten) wird mit einem ungepufferten 
CMOS-Inverter vorverstärkt und anschließend per 74AUP1G14 in ein 
steilflankiges Rechtecksignal geformt. Ein weiterer 74AUP1G97 
Multiplexer reicht das Signal entweder 1:1 oder per 4:1 Teiler 
(74AUP2G80) an den RP2040 weiter.
Das DFF 74AUP1G74 synchronisiert die Zeitmessung des AS6501 mit dem 
Eingangssignal. Der RP2040 zählt die ext. Impulse, fordert einen neuen 
Zeitstempel mit der Leitung "INT-REQ" an und liest die Daten vom TDC 
ein.

Bleiben noch das LCD-Modul, der RS232-Treiber, ein EEPROM und die 
Anschlüsse für manuelle Bedienung, wie es schon bei der ursprünglichen 
Schaltung ausgeführt war.
Ein Bild der Leiterplatte zeigt die Oberseite. Die Platine kann 
huckepack auf's LCD gesteckt/gelötet werden oder separat mit den 
Befestigungslaschen montiert werden. Optinal sind auf der linken Seite 
Lötfahnen für vertikale oder horizontale Bestückung von 
SMA-Steckverbindern vorgesehen.

Die Software ist noch im V0.1-Zustand soll aber kompatibel zu der vom 
Pico-Fmeter2a werden, wobei der 2. Kanal entfällt. Hohe Genauigkeit kann 
nur mit einer hochstabilen ext. Fref erreicht werden.

Die beiden ersten Timelab-Kurven zeigen das Rauschen des Zählers, wenn 
10 MHz Fref auch an Fin gelegt werden: einmal als absolute 
Frequenzdifferenzen und einmal die Allan deviation dazu.
Die 3. Kurve zeigt die Phasenabhängigkeit zwischen Fin und Fref. An 
beiden Eingängen liegen OCXO-Signale mit einer Frequenzabweichung von 
knapp 0,22 Hz. Bei 10 ms Messzeit stört die Drift der OCXOs nicht aber 
man sieht alle ca. 4,5 s die Messwerte bei wiederholender Phasendiffernz 
zwischen 0 - 360 °. Ideal wäre eine gerade Linie.

Vor Ostern werden die Eier bemahlt und gezeigt aber der Inhalt noch 
nicht ausgepackt ;-)

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Die Kurve fehlte noch.

von Markus B. (dalotel)


Lesenswert?

Daumen hoch, genau darauf habe ich gewartet.
Werde ich mir sehr gerne nachbauen.
Weiter so.

Markus

von Hans-Georg L. (h-g-l)


Lesenswert?

Hallo Michael, schön das du immer noch Zähler zum Nachbauen 
veröffentlichst.

Was mir an deiner ADEV Kurve etwas merkwürdig vorkommt sind die 
"Schwingungen", die sich erst nach 100s heraus mitteln. Meine Versuche 
mit dem AS6501 hatten das nicht. Wie sind deine Messzeiten ?. Sind die 
1s gemittelt oder single shot ?.

Probiere mal für Spass die 1,8V nach dem 10 Ohm Widerstand noch 
zusätzlich mit 100nf und 10nf (induktionsarm) zu blocken, das hat bei 
mir etwas gebracht.

von Mi N. (msx)



Lesenswert?

@Markus
Danke für die Blumen ;-)

@Hans-Georg
Danke auch Dir für Deinen Hinweis, gewisse Fehler nicht immer zu 
wiederholen. Da es mir zunächst um die reine Funktion geht, habe ich wie 
gewöhnlich alles freifliegend verkabelt.
So war der eine OCXO mit ca. 0,2 Hz Frequenzabweichung noch aktiv (siehe 
Kurve mit 10 ms Intervall) und konnte in das Fref-Signal einstreuen. Daß 
das Ergebnis noch verbesserungsfähig war, hatte ich schon an anderer 
Stelle gesehen zunächst aber ignoriert.

Aktuell habe ich eine Vergleichskurve aufgezeichnet und testweise die 
Abtastrate von 50 auf 100 kS/s erhöht. Da sieht man, daß sich eine 
deutliche Verbesserung ergeben hat.
Auch beim Kurzzeitvergleich der Frequenzdifferenzen sieht man die 
Abweichungen im ca. 5 s Abstand sehr gut.
Die Messungen laufen kontinuierlich - jede Periode des Signals wird 
erfasst. So muß das sein!

Die von Dir vorgeschlagenen Kondensatoren werde ich abschließend auch 
noch ergänzen. Anstelle der 10 Ohm Widerstände hatte ich schon 47 µH 
Drosseln verwendet, um überlagerte Störungen der Versorgungsspannung 
besser abzublocken.

Bei 133 MHz braucht der RP2040 für das Auslesen des AS6501 und der 
Verrechnung der Zeitstempel etwa 10 µs. Damit noch Luft für das 
restliche Programm bleibt, habe ich die Abtastrate auf 50 kS/s 
eingestellt. Für die 100 kS/s Kurve habe ich die Taktfrequenz des µC 
einfach verdoppelt.
Auch diese Abtastrate kann man noch verdoppeln, wenn man allein für die 
Zeitstempelerfassung den 2. Kern verwendet.
Das halte ich als Option offen.

Soweit.

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Es ist jetzt eine erste Programmversion verfügbar:
http://mino-elektronik.de/progs/Pico-FM-AS6501/Pico-FM-AS65.zip
Sie wurde mit der IAR IDE EWARM 9.2 unter WIN10 auf Laufwerk C: 
erstellt.

Eine gesonderte Beschreibung gibt es derzeit noch nicht. Da die Basis 
dieser Version das Programm vom 'Pico-Fmeter2a' ist, ist es ratsam sich 
dessen Beschreibung 
http://mino-elektronik.de/download/Pico-FMeter-RP2040-DT.pdf und 
Funktionsweise 
http://mino-elektronik.de/download/Arbeitsweise_Pico_Fmeter2.pdf 
anzusehen. Die wesentlichen Änderungen sind der fehlende 2. 
Eingangskanal und damit auch ein Abgleich per 1pps-Signal. Dafür ist die 
Auflösung der Messungen deutlich erhöht und beim Offset-Abgleich die 
Auflösung auf 1x10^-12 angepaßt.

Die Fotos zeigen den Musteraufbau, bei dem IC1 noch wegen eines 
Layout-Fehlers über Kopf und verdreht eingelötet werden mußte. Die neue 
Schaltung ist noch nicht in ein neues Layout umgesetzt, da sich 
kurzfristig noch Änderungen ergeben könnten.
GPIO18 wird derzeit für die Laufzeitmessung der Regressionsberechnung 
verwendet und das 10 MHz Referenzsignal an GPIO22 könnte genutzt werden, 
um eine abgemagerte Programmversion ohne AS6501 zu verwenden. Die 
Referenzfrequenz wäre dann unabhängig von den lokalen 12 MHz des 
Pico-Boards.

Begrenzt durch den AS6501 liegt die untere Eingangsfrequenz bei ca. 0,6 
Hz.
Ohne den 4:1 Vorteiler 74AUP2G80 liegt die maximale Eingangsfrequenz bei 
etwas über 40 MHz. Wem das reicht, kann den 2G80 und den zugehörigen 
Multiplexer 1G97 weglassen und die automatische Umschaltung im Programm 
sperren. Mit dem lokalen Vorteiler können bis zu 160 MHz gemessen werden 
- mit zusätzlichem ext. Vorteiler auch mehr.
Diese Werte beziehen sich auf 133 MHz Taktfrequenz des RP2040, die mit 
einem ext. Widerstand verdoppelt werden können (siehe Beschreibung). Bei 
Bedarf kann man aber die Taktfrequenz (DEF_SYSCLOCK) schon vor 
Compilierung problemlos auf 300 MHz erhöhen. Bei den Einstellungen für 
PLL-SYS, VREG und QSPI-Wartezeiten ist das im Programm schon 
berücksichtigt.

von Dddns (dddns)


Lesenswert?

Hallo!

Der Aufbau und das layout ist nach den Fotos für mich wirklich 
wunderschön!
Hast Du das mit der Hand und Lupe selbst bestückt?
Deine Arbeit ist (für mich) professionell!

von Mi N. (msx)



Lesenswert?

Danke!
Es ist allerdings nicht mein erstes Layout und die Eier hat meine Frau 
gefärbt ;-)

Die obige Messung mit 10 ms Intervall und 0,2 Hz Frequenzdifferenz habe 
ich mit geschirmten Signalleitungen wiederholt (Bild 1). Bild 2 zeigt 
die vergrößerten ersten 18 s der Kurve.
Man sieht, daß die sinusförmige Fdiff entfällt und der "Phaseneffekt" 
bei 0° und 180° Phasenverschiebung wieder deutlich sichtbar wird. Es 
scheint eine Eigenart des AS6501 zu sein, den ich schon bei anderen 
Schaltungen mit STM32H7xx beobachtet hatte (Bild 3). Da hatte ich kein 
Gegenmittel gefunden.
Im 3. Bild ist zusätzlich eine Kurve vorhanden, die mit STM32H730 + 
TDC7200 aufgenommen wurde. Beim TDC7200 gibt es die Störungen bei 0°, 
360°, ...
Grob gesehen ist der AS6501 dem TDC7200 etwa Faktor 5 "überlegen". Aus 
diesem Grund wollte ich trotz deutlich günstigeren Preises diese 
Schaltung nicht mehr mit einem TDC7200 aufbauen.

Wenn die obigen Platinenfotos nun aufgeräumt aussehen, liegt das auch 
daran, daß ich nach den Erfahrungen mit anderen Synchronstufen die 
Schaltung auf ein Minumum reduzieren konnte.
Gleiches trifft auch auf die Software zu. Da hatte ich bei 
Optimierungsversuchen beispielsweise einen neuen Zeitstempel 
angefordert, sobald der vorherige ausgelesen wurde. Die SPI-Übertragung 
konnte daher im Hintergrund ablaufen. Zeitgewinn ca. 1,5 µs / 
Zeitstempel. Gut gedacht, aber die Ergebnisse bekamen dadurch einen 
kleinen Offet von 2 x 10^-12. Das wollen wir ja nicht.
Auch eine alternative Berchnung mit 128 Bit Integer-Werten brachte keine 
Verbesserung außer einer kleineren Ausführungszeit. Beim H7xx hatte die 
128 Bit Berechnung eine deutliche Verbesserung ergeben, da die dortige 
Double-Berechnung einen Offset erzeugte. Vermutlich wird bei der 
Dfloat-Hardware anders gerechnet als mit den Software-Routinen. Ich 
vermute eine unterschiedliche Rundung. Und so ist auch hier das 
entscheidend, was man nicht sieht ;-)

Es steht noch aus, den 2. Kern für die Regressionsberechnung anzuwerfen. 
Offen bleibt aber, ob durch die Verdoppelung der Abtastrate auch 
tatsächlich eine Verbesserung der Ergebnisse resultiert.
Die derzeitige Software-Version ist daher zunächst eine "runde Sache".

von Mi N. (msx)


Lesenswert?

Nach ein paar kleinen Änderungen habe ich die Platinendaten soweit 
fertig.
Hier sind aktueller Schaltplan, Bestückungsplan, Bestückungsliste und 
Gerber-Dateien für die Platinenfertigung zu finden:
http://mino-elektronik.de/download/pico-fmeter-AS65-2-BOARD.zip

Von dieser Version hatte ich noch keine Boards bestellt.

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Hans-Georg L. schrieb:
> zusätzlich mit 100nf und 10nf (induktionsarm) zu blocken, das hat bei
> mir etwas gebracht.

Das habe ich nun auch noch gemacht.
100 nF hatte ich ja schon und habe jetzt noch 1 nF ergänzt. Es scheint 
sich eine kleine Verbesserung ergeben zu haben. Diverse Versuche mit 
hoher Taktrate des µC oder Regressionsrate haben keine Verbesserung der 
Auflösung gebracht. Das Rauschen auf der Platine oder im AS6501 läßt 
sich nicht wegrechnen.
Die Regressionsberechnung im Hintergrund auf dem 2. Kern auszuführen war 
sehr ernüchternd. Das habe ich schnell wieder gelassen.

Hast Du Vergleichswerte mit dem AS6501 oder bringen Dir "drei Hüte" eine 
deutliche Verbesserung?

von Markus B. (dalotel)


Lesenswert?

Mi N. schrieb:
> Nach ein paar kleinen Änderungen habe ich die Platinendaten soweit
> fertig.
> Hier sind aktueller Schaltplan, Bestückungsplan, Bestückungsliste und
> Gerber-Dateien für die Platinenfertigung zu finden:
> http://mino-elektronik.de/download/pico-fmeter-AS65-2-BOARD.zip
>
> Von dieser Version hatte ich noch keine Boards bestellt.

Wollte mit den Gerberdaten Platinen bestellen.
Von IC14 fehlen im Gerberviewer aber links die kompletten Pads.
Hast du das mal verifiziert?

Gruß
Markus

von Mi N. (msx)


Lesenswert?

Markus B. schrieb:
> Von IC14 fehlen im Gerberviewer aber links die kompletten Pads.
> Hast du das mal verifiziert?

Die sind ganz bewußt weggelassen worden.
An Pin 1 - 12 liegen die LVDS-Signale zur Datenausgabe und 4 x NC. Bei 
meinem ersten, 2-lagigen Aufbau mit anderem µC hätte ich nur mit einigen 
Vias diese 'Pads' umgehen können, was für einen induktionsarmen Aufbau 
nicht geschickt gewesen wäre.
Bei 4-lagiger Leiterplatte hat sich die Situation entspannt. Da ich 
diese LVDS-Signale wohl nie brauchen werde, habe ich die Anschlüsse 
nicht mehr ergänzt und das Bauteil in dieser Minimalversion "AS6501-MIN" 
genannt.

Ergänzend zu der zuerst gezeigten Schaltung ist R7 eingefügt worden und 
dient mit seinen 10 Ohm wie auch bei R26/R27 eher als Platzhalter für 
eine 47 µH Drossel. Zweck ist die bessere Filterung/Entkoppelung der 
Versorgungsspannungen. Eine Gegenprobe mit 10 Ohm habe ich nicht 
gemacht.

Kleiner Tipp für JLCPCB-Besteller: auf der Startseite unten das Angebot 
4-8 Lagen zu $2 anklicken. Klickt man sich oben 4-lagig an ist der 
Grundpreis $7 ;-)

Von meiner oben gezeigten Leiterplatte, mit der auch alle Versuche 
durchgeführt wurden, habe ich noch zwei Stück. Wer mag kann sie von mir 
für 3 Euro zzgl. Briefversand bekommen. Um Fummeleien zu ersparen, würde 
ich IC1 schon auflöten.

von Markus B. (dalotel)


Lesenswert?

Das ist mal eine nachvollziehbare Erklärung.
Hätte mich auch gewundert warum der Rest sonst i. O. aussah.
Danke.

von Paul V. (paul_v)


Lesenswert?

Michael,

I would love to get my hands one of your boards to test this version.
Are you using Paypal? If so I can send you the money that way.
Otherwise you need to send me your IBAN.

Many thanks,

Paul
------------------------------------------
For the others reading this, I have built two versions of Michael's 
counter and have designed a simple GPSDO-based external clock that gives 
me great results with the Fmeter-G431.

Have a look here for my Blog: https://www.paulvdiyblogs.net/

von Markus B. (dalotel)


Lesenswert?

Hi Paul,
I read your very intereting blog times ago.
Like to build it too.
Do you share your pcb files?

Regards
Markus

von Mi N. (msx)


Lesenswert?

Markus B. schrieb:
> Hi Paul,
> I read your very intereting blog times ago.

Paul kümmert sich auch sehr intensiv darum, Problemen auf den Grund zu 
gehen. Dort finden sich auch Hinweise, wie man meine Projekte unter der 
IAR Demo-IDE EWARM V9.30 so verwenden kann, daß auch die .uf2-Datei 
richtig erzeugt wird.
Selber verwende ich noch V9.20 und möchte derzeit nicht zwei Version 
parallel verändern.

von Paul V. (paul_v)


Lesenswert?

Hallo Markus,

Yes, eventually I will publish them on my Github when I have the time to 
put all the information together.

The Gerbers are no secret and I can share them if needed although a few 
of them need some corrections or explanations.

During this project, I designed several boards so which one(s) would you 
like?
I only used one or two of the five I ordered, so I'm willing to share.

MfG,
Paul

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Es gibt nun die Programmversion V1.1.
Das Signal 'Fin' wurde an GPIO21 gelegt, um auch den Eingang PWM2B 
nutzen zu können. PWM_CH2_CTR wird jetzt als Ereigniszähler verwendet 
und mit PIO0_SM0 eine Capture-Funktion umgesetzt. Da der Ereigniszähler 
hinreichend schnell ausgelesen wird, reicht der 16 Bit breite Zähler 
aus.

Zusätzlich ist die Option vorgesehen, mit "CORE1_AKTIV" die Erfassung 
und Vorverarbeitung für die Regressionsberechnung auf dem 2. Kern laufen 
zu lassen. Mit eingeschalteter höherer Priorität für DMA-Zugriffe auf 
die Busse sehen die Ergebnisse jetzt ähnlich gut aus wie zuvor.

Für Vergleichsmessungen läßt sich die Regressionsberechnung am Ende 
eines Messintervalls nun auch abschalten, indem nur die Gesamtereignisse 
und Gesamtzeit für die Berechnung verwendet werden (Variable: 
F1_reg_modus). Die Berechnung entfällt auch bei niedrigen Frequenzen, 
wenn im Messintervall nur ein einzelner Eingangsimpuls erkannt wird.
Dazu gibt es auch eine Adev-Kurve mit geradem Verlauf, wie es zu 
erwarten ist.

von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Die Änderungen zur neuen Programmversion V1.2 zusammengefasst:

Die Auswertung der lin. Regression ist abschaltbar, sodaß die Frequenz 
allein aus Startzeitpunkt und Endzeitpunkt des TDC berechnet wird. Die 
zugehörige Variable 'F1_reg_modus' kann manuell oder per seriellem 
Befehl auf '0' oder '1' gesetzt werden. Der ser. Befehl sieht so aus:
.1Z zum Einschalten und .0Z zum Abschalten der Berechnung.
Die Adev-Kurve ohne Regressionsberechnung wurde ja schon gezeigt.

Zunächst wurden alle Berechnungen mit 'double'-Werten durchgeführt, was 
bei längeren Messzeiten > 3 s die Ergebnisse nicht mehr verbessern 
konnte. Als neue Compiler-Option gibt es nun ein #define INT128, wodurch 
die Erfassung und Vorverarbeitung der Zeitstempel auf das letzte Bit 
genau erledigt werden. Erst für die abschließende Auswertung werden 
'double' verwendet.

Als Abtastrate für die Zeitstempel sind maximal 50 kHz vorgesehen, was 
bei 133 MHz Taktfrequenz den Controller zu 50% auslastet. Aktiviert man 
den 2. Prozessorkern können die Zeitstempel ohne Einschränkung durch das 
restliche Programm erfaßt werden.
Bei 133 MHz sind es rund 100 kHz Abtastrate.
Um den 2. Kern zu verwenden muß im Quellcode #define CORE1_AKTIV 
eingefügt werden.
Verdoppelt man den Prozessortakt (3k3 Widerstand zwischen GPIO1 und 
GPIO2) auf 266 MHz erreicht man rund 200 kHz Abtastrate.

Den Vergleich zwischen diesen beiden Betriebsarten zeigt die Kurve. 
Scheinbar bringt die höhere Abtastrate nicht den erhofften Erfolg.
Dies als Erfahrungswert.

: Bearbeitet durch User
von Markus B. (dalotel)


Lesenswert?

Da ich die Platinen nun mittlerweile passiv bestückt auf dem Tisch 
liegen habe, und ich gerade am Bestellen der aktiven Teile bin, ist eine 
neue Frage aufgetaucht. Beim 10Mhz VCXO wird der V-Anschluß nicht aktiv, 
zumindest nicht dynamisch bedient. Spricht dann etwas gegen einen 
günstigeren TCXO?
Wenn ich das richtig sehe wird der bei Betrieb mit ext. 10Mhz sogar gar 
nicht gebraucht.

von Mi N. (msx)


Lesenswert?

Markus B. schrieb:
> Beim 10Mhz VCXO wird der V-Anschluß nicht aktiv,
> zumindest nicht dynamisch bedient. Spricht dann etwas gegen einen
> günstigeren TCXO?

Normalerweise verwende ich diesen TCXO: 
https://www.lcsc.com/product-detail/Temperature-Compensated-Crystal-Oscillators-TCXOs_KDS-Daishinku-1XTV10000MDA_C253701.html 
und denke, daß er schon günstig ist.

In Planung bei mir ist noch eine Programmversion, die auch ohne den 
AS6501 auskommt und auf dem selben Board läuft. Bei Bedarf kann man sich 
dann den Luxus des TDCs dazukaufen.
Ohne TDC könnte man das Trimmpoti auch mit VC verbinden, um auch ohne 
EEPROM auf möglichst genaue 10 MHz abzugleichen.
Aber mache es so, wie Du es für richtig hälst. Weder die Schaltung noch 
das Programm sind in Stein gemeißelt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.