Forum: Mikrocontroller und Digitale Elektronik ADF4351 kein Signal am N Divider Output


von Stephan H. (stiph5)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich bin gerade dabei einen ADF4351 Synthesizer in Betrieb zu nehmen. Der 
Schaltplan ist dem Anhang zu entnehmen. Der Schleifenfilter wurde über 
SIMPLL berechnet. Das Layout ist vielleicht nicht 100% gelungen (da es 
ja doch ein HF Bauteil ist und somit sicher einiges an Verbesserung 
gemacht werden kann) sollte aber ausreichend sein um zumindest ein 
Signal generieren zu können. Vorsichtshalber befindet sich es aber auch 
im Anhang.
Ich bin auf folgenden Thread gestoßen: 
Beitrag "ADF 4350 Frequenz-Synthesizer"
Ich hab diesen Thread durchgefrostet und leider auch keinen Hinweiß auf 
mein Problem gefunden.

Mein Problem: Wenn ich den ADF4351 mit Folgenden Registerinhalten 
beschreibe und mir dabei den N Divider Output auf den MUX Pin lege 
bekomme ich da nur Spikes. Dadurch klarerweise auch kein Lockdetect. Am 
Ausgang ergibt sich dabei ein etwa 70MHz Signal (4400MHz/64=68,75MHZ). 
Ist zwar etwas zu hoch aber zu erwarten, da ich am VThune eine Spannung 
von 3V abgreifen kann. Die Spikes kommen mit einem Abstand von 2µs was 
meiner fPFD entspricht, aber sind halt leider nur Spikes (siehe Anhang). 
Wenn ich mir den RCounter Ausgang über den MUX Pin anzeigen lasse 
bekomme ich das Richtige Ergebnis. Versorgungsspannung hat einen 
leichten Rippel von 20mVpp, kann der Fehler daran liegen? Oder habe ich 
einfach nur einen Fehler in der Registerbeschreibung? Fällt jemanden ein 
Fehler auf? Spannend finde ich die Tatsache das der Fehler 
offensichtlich beim Frequenzteiler liegt, da an dessen Ausgang kein 
richtiges Signal anliegt.

Registerinhalt:
reg[0]=(4480<<INTEGERVALUEpos)|(0<<FRACTIONALVALUEpos);
reg[1]=(25<<MODpos) | (1<<PRESCALERpos);
reg[2]=(NDIVIDERo<<MUXOUTpos) | (1<<RDIVpos) | (10<<RCOUNTERpos) | 
(0xF<<CHARGEPUMPCURRENTpos) | (1<<PDPOLARITY);
reg[3]=(0<<CLKDIVMODEpos) | (200<<CLOCKDEVIDERpos);
reg[4]=(6<<RFDEVIDERSELECTpos) | (5<<BANDSELECTCLOCKDIVIDERpos) | 
(0<<MTLDpos) | (1<<AUXOUTPUTENABLEpos) | (3<<AUXOUTPUTPOWERpos) | 
(1<<RFOUTPUTENABLEpos) | (0<<OUTPUTPOWERpos);
reg[5]=REG5DEFAULT|(0b11<<LDPINMODEpos);

was soviel heißt wie:
r0=0x8c00000
r1=0x80000c8
r2=0x11029e40
r3=0x640
r4=0x6051e0
r5=0xc30000

Fällt jemanden noch eine andere Fehlerquelle ein?
Ich bin über jegliche Hilfe Dankbar!
LG Stephan

von Arduinoquäler (Gast)


Lesenswert?

Stephan Hochmüller schrieb:
> Ausgang ergibt sich dabei ein etwa 70MHz Signal (4400MHz/64=68,75MHZ).
> Ist zwar etwas zu hoch aber zu erwarten, da ich am VThune eine Spannung
> von 3V abgreifen kann. Die Spikes kommen mit einem Abstand von 2µs was
> meiner fPFD entspricht, aber sind halt leider nur Spikes (siehe Anhang).

Ich habe bereits mit einigen ADFxxxx gearbeitet, und soweit ich mich
erinnere ist das was du misst schlichtweg korrekt. Das heisst wenn
du den RF Teiler richtig eingestellt hast und die Frequenz nachweisen
kannst die du erwartest hast du alles richtig gemacht. Das bedeuted
aber auch dass du nicht erwarten kannst dass ein herunter geteiltes
Signal mit Tastverhältnis 1:1 herauskommen muss. Die Pulse die du
nachweist müssen höchstens so lang sein wie die halbe Periodendauer
deines RF Einganssignals. Und das genügt auch um den Phasendetektor
korrekt zu steuern. Der braucht nämlich nur die Länge der Durchlaufzeit
der internen Gatter um die Phasendetektor Flipflops zu resetten.
Genau genommen eigentlich nur die positive Clock Flanke.

Du kannst ja einfach mal am RF Eingang eine quarzgenaue Frequenz
einspeisen, dann wirst du auch die genau heruntergeteile Frequenz
am Multiplexer Ausgang nachweisen können (um den Setup deines
Teilers zu überprüfen).

Falls deine Schleife nicht lockt hast du ein anderes Problem.
Krass falsche Steilheit des VCOs für die Schleifenberechnung
angenommen, oder eine falsche Polarität des Phasendetektors
(die ja umschaltbar ist) um zwei offensichtliche Beispiele zu
nennen.

von Arduinoquäler (Gast)


Lesenswert?

Bei Pin 29, REFIN, solltest du auf jeden Fall sicherstellen dass
der Eingang DC entkoppelt ist damit er sich selbst korrekt biasen kann.

Siehe dazu auch das Schaltbild im Datenblatt auf Seite 25, Figure 34.

von Arduinoquäler (Gast)


Lesenswert?

Stephan Hochmüller schrieb:
> Fällt jemanden noch eine andere Fehlerquelle ein?

Noch eine Stolperstelle: der Phasendetektor kann nicht unter
allen Umständen die 70 MHz die du dir vielleicht wünschst.

Aus dem Datenblatt
-----------------------------------------
Phase Detector Frequency (max.)
32 MHz   Fractional-N
45 MHz   Integer-N (band select enabled)
90 MHz   Integer-N (band select disabled)
-----------------------------------------

Man bekommt zwar aus dem Mux Ausgang was heraus aber das
garantiert nicht die Funktionsfähigkeit des Phasendetektors
für diese Frequenz.

Ich habe mir nicht die Mühe gemacht und alle deine Register-
Settings überprüft, und das werde ich auch nicht machen ....

von Sven B. (scummos)


Lesenswert?

Das Teil ist jedes Mal eine Qual, bis es läuft. ;P

Zu hohe PFD-Frequenz klingt nach einem guten Ansatz. Ripple auf der 
Versorgungsspannung hat andere Auswirkungen, ich glaube nicht, dass es 
daran liegt.

von Georg A. (georga)


Lesenswert?

Bei irgendsoeinem integriertem PLL+VCO-Ding (sorry, mein Alzheimer...) 
war es so, dass der MUXOUT bei einigen Quellen nur mit Pullup (~100R) 
funktioniert hat. Hat mich auch einiges an Nerven gekostet. So ein 
Verhalten ist zwar aus der ADF-Beschreibung nicht ersichtlich, aber 
schnell auszuprobieren.

: Bearbeitet durch User
von Helmut S. (helmuts)


Lesenswert?

Du hast doch überall AC-Kopplung mit nur 1nF. Miss mal direkt mit einer 
10:1 Probe an dem 50Ohm Widerstand.

: Bearbeitet durch User
von Uwe S. (de0508)


Lesenswert?

Hallo Stephan,

ich habe noch Probleme mit den Schleifenfilter - PLL Phase-Loop-Filter.

Wie sind bei deinem Ansatz:
* die Frequenz des PFD ?
* sind die Ausgangsteiler DIVIDER, Teil deiner PLL Phase-Loop-Filter ?
* welche Parameter (Frequenzen) wurden zur Berechnung verwendet ?
* Welcher Frequenzbereich soll generiert werden ? und
* wie hoch ist der Strom für das Phase-Loop-Filter ?

Ich verwende zwei ADF4350 über ein Mischerkonzept mit ZF ~ 250kHz.

von Stephan H. (stiph5)


Lesenswert?

Vielen Danke für die vielen Hinweiße! Ich bin gerade dabei allen 
nachzugehen, und sie hier parallel zu dokumentieren.

Dabei kann ich gleich mit dem letzten Kommentar anfangen. Ich muss mich 
entschuldigen, ich habe oben sicher zu wenig Information angegeben. Zu 
den offenen Punkten:

Uwe S. schrieb:
> * die Frequenz des PFD ?
> * sind die Ausgangsteiler DIVIDER, Teil deiner PLL Phase-Loop-Filter ?
> * welche Parameter (Frequenzen) wurden zur Berechnung verwendet ?
> * Welcher Frequenzbereich soll generiert werden ? und
> * wie hoch ist der Strom für das Phase-Loop-Filter ?

Die PFD Frequenz sollte bei 500kHz liegen. Ich habe als Referenzsignal 
ein 10MHz CMOS Signal aus einem Zynq7000. Verwende den Internen 
Frequenzteiler (um 50% duty cycle zu erzielen um eventuell mal das CSR 
Feature zu nützen) und einen Teilungsfaktor am R Counter von 10. Dies 
ergibt am MUX Ausgang gemessene 500kHz.

Die Ausgangsteiler sind Teil der PLL und auf 64 eingestellt. Ziel wäre 
es einmal ein Ausgangssignal von 35MHz zu generieren, deshalb 64.

Die Berechnung kommt wie folgt zustande:
FRF=35MHz
FPFD=500kHz
RF Divider = 64
MOD = 25
FRAC=0
INT = FRF/(FPFD/RF Divider) = 4480

Im Grunde sollte der ADF4351 als LO für ein Mischerkonzept arbeiten. 
Also prinzipiell über einen weiten Frequenzbereich bis 2,4GHz.

Der Filter wurde für einen Strom mit 5mA berechnet. Doch um ehrlich zu 
sein, versteh ich diesen Wert nicht ganz. Was sagt der aus? Liegt der 
Fehler vielleicht da? Der Filter ist lauf SimPLL für 5mA ausgelegt. Aber 
wo fließt dieser Strom? Der kann unmöglich über den Filter fließen. Oder 
ist das der Maximalwert den die Charge Pump liefern kann für den Fall 
einer Steilen Flanke an den C's`?


@Arduinoquäler:
Danke für den Tipp mit dem Tastverhältnis! Macht auf alle fälle Sinn, 
aber der N Counter richtig arbeiten würde, müssten die Spikes am Ausgang 
einen Pegel von mindestens VCC besitzen. Ich glaube da eher das da im 
Chip ein Kopplung von R Counter vorhanden ist.

Zum RFin eingang, ich habe mir darüber auch schon den Kopf zerbrochen, 
da mir das auch aufgefallen ist, und in meinem Design definitiv ein DC 
Anteil vorhanden ist, habe aber dann folgende Beschreibung zum Pin im 
Datenblatt gefunden:
1
Reference Input: This CMOS input has a nominal threshold of AVDD/2 and a dc equivalent input resistance of 100 kΩ. This input can be driven from a TTL or CMOS crystal oscillator, or it can be ac-coupled.
Ich habe das so interpretiert das ich sowohl ausgekoppelte Signale als 
auch CMOS/TTL Signale mit Gleichanteil verwenden kann. Sehe ich das 
falsch?

@Arduinoquäler:
@Sven B.:
Da die PFD Frequenz nur bei 500kHz liegt kann es das wohl nicht sein.
Der Band Select Clock Divider hat einen wert von 5 was 100kHz bedeutet 
und somit auch unter den spezifizierten 125kHz Maximum liegt.

@Georg A.: Habe leider gerade nicht die Möglichkeit das zu machen, werde 
das aber morgen ausprobieren.

@Helmut S.:
1nF sollte reichen, 1/(100Ohm*1nF)=10MHz. Das vorhandene Ausgangssignal 
(Amplitude) ist auch in Ordnung, nur die Frequenz stimmt nicht.


Da ich am N Counter Ausgang kein richtiges Signal (FRF/(Int*FRAC/MOD) 
habe denke ich noch immer das ich da was Falsch mache. Ich habe die 
Einstellung des Clock Divider Mode noch nicht ganz verstanden. Im Moment 
verwende ich 0 -> disable click divider. Das klingt ein wenig so als ob 
der N Counter damit ausgeschalten ist. Habe aber auch schon die 
Einstellung 10->active phase resync versucht anzuwenden. Diese hatte das 
Selbe Ergebnis. Selbst wenn ich dabei die tsync falsch eingestellt 
hätte, und somit der lockdetect nicht einrastet, müsste am N Counter 
Ausgang ja trotzdem das "falsche" Signal anliegen oder?

Vielen Dank
LG Stephan

von Uwe S. (de0508)


Lesenswert?

Danke Stephan,

für dein Angabe, ich hatte auch schon ein wenig mit den Daten aus deinem 
ersten Beitrag gerechnet.

Kennst Du schon ADIsimPLL V3.60.10 ?

# https://form.analog.com/Form_Pages/RFComms/ADISimPll.aspx
# 
http://www.analog.com/media/en/training-seminars/tutorials/adisimpll.pdf

Damit kämpfe ich noch an den PLL Phase-Loop-Filter herum.

von Uwe S. (de0508)


Angehängte Dateien:

Lesenswert?

Hallo Stephan,

Hier ist noch mal das Blockschaltbild des ADF4351 mit etwas Farbe.

Man kann den RF Divider in den Regelkreis des PFD legen oder nicht.
Wenn man ihn verwendet, dann kann man bei allen Ausgabefrequenzen die 
selbe Frequenzschrittweite (fSTEP), bedingt durch MOD, nutzen.
Anderenfalls wird sie (fSTEP) um den um den Teiler RF Divider 
vermindert.

von Stephan H. (stiph5)


Lesenswert?

Hallo Uwe S.,
Ja diese Software ist mir bekannt, ich habe damit meinen Filter 
berechnet. Es gibt sogar die Erweiterung, welche die Registerwerte 
berechnet:


http://www.analog.com/media/en/evaluation-boards-kits/evaluation-software/ADF435x_v4_3_5.zip

leider klappt es aber damit auch nicht.

Mit dem RF Divider hast du recht. Dieser und der VCO funktionieren auch 
offensichtlich. Das Problem liegt offenbar im N Counter. Da an dessen 
Ausgang kein Signal anliegt, obwohl am RF Ausgang ein Messbares Signal 
zu erkennen ist.

von Uwe S. (de0508)


Lesenswert?

Hallo Stephan,

Du betreibst den ADF4351 ja im faktalen Modus.

Wusstest Du, dass man für alle (MOD,FRAC) Paare den GGT bilden muss und 
daraus neu Werte für den ADF4351 berechnet ?

Pseudo Code:
1
WENN (FRAC > 0) 
2
  ggt   = GGT(FRAC, MOD)
3
  FRAC' = FRAC /ggt
4
  MOD'  = MOD /ggt
5
SONST
6
  FRAC' = 0
7
  MOD'  = 1
8
END

Register 2
LDF = 0 an DB8, also LDFvalue = (0<<8)

Wie beschreibst Du denn die Register, in der Reihenfolge R5 bis R0 ?

Man sollte "DOUBLE BUFFER" an DB13 auf 1 setzen, dann werden die 
Frequenz relevanten Änderungen auf einmal ins System "geschrieben".

Register 3
(200<<CLOCKDEVIDERpos)

Abschnitt "PHASE RESYNC", wenn man von 400µs = 400*10⁻⁶ ausgeht, dann 
ergibt sich für CLK_DIV_VALUE:

t_SYNC = CLK_DIV_VALUE × MOD × t_PFD <=>
CLK_DIV_VALUE = t_SYNC /MOD /t_PFD

mit t_PFD = 1/ fPFD = 500*10⁻³ folgt:
CLK_DIV_VALUE = t_SYNC /MOD *fPFD = 400*10⁻⁶ /25 *500*10³
CLK_DIV_VALUE = 400 *500 /25 *10⁻³ = 8

Pseudo Code:
1
FUNC gcd( a : word, b : word ) : word
2
var h : word
3
4
when (a = 0)
5
  return 0
6
end
7
8
when ( b > a )
9
  b = b mod a
10
end
11
12
while ( b ) /* b <> 0 */
13
  h = a mod b
14
  a = b
15
  b = h
16
end
17
18
return a
19
END

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

Wenn du mir deine Quarz-Frequenz sagst, kann ich dir mit meiner sicher 
funktionierenden Software mal einen Satz Register generieren. Vielleicht 
hilft das bei der Fehlersuche.

Evtl. willst du auch mal ein zweites Board aufbauen und vergleichen? Der 
Baustein ist fies zu verlöten.

: Bearbeitet durch User
von Stephan H. (stiph5)


Lesenswert?

Hallo Leute,

@ Uwe S.: Danke das ist schon mal sehr nützlich! Das kann ich dann 
gleich in der weiteren Implementierung verwenden.

@ Sven B.: RFin wär bei 10 MHz.

Ich habe es jetzt geschafft das ding zum locken zu bringen. Doch 
verstehe ich nicht warum. Ich habe das FEEDBACK SELECT Bit in Register 4 
auf 1(Fundamental) geschrieben. Was in der Berechnung den RF DIVIDER 
raus nehmen sollte.

z.B.:
FEEDBACK SELECT = 0 (DIVIDED)
HFout = (INT+(frac/mod))*FPFD/RFDIVIDER
mit dieser Formel funktioniert es NICHT.

FEEDBACK SELECT =1 (Fundamental)
Mit gleicher Formel funktioniert es! WARUM? da müsste es ja lauten:
HFout=(INT+frac/mod))*fPFD?

Habe ich einen Denkfehler?

LG Stephan.

von Felix P. (fixxl)


Lesenswert?

Hatte mit dem Teil auch mal einige Probleme, bis ich das CSR-Bit im 
Register 3 entdeckt habe. Sobald das gesetzt war, hat die PLL ohne 
Probleme gelockt.

von Uwe S. (de0508)


Lesenswert?

Hallo Stephan,

bitte schau mal in das Blockschaltbild, da habe ich den Part doch 
farblich abgesetzt.

Und einmal schrieb ich, dass der RF_DIVIDER mal innerhalb, mal außerhalb 
der PLL Phase-Loop-Filter sitzen kann.

So ergaben sich auch zwei Formel für die Ausgabefrequenz, bzw. die Werte 
für
INT, FRAC bei gegebenen RFin, fPFD und MOD.

Zeige doch bitte deinen gesamten Code, wenn Du nicht auf meine Fragen 
eingehen möchtest.

Wie gesagt ich habe zwei von den ADF4350 im Einsatz und das schwierigste 
sind die PLL Phase-Loop-Filter, bis die mal zum locken der PLL führen.

Noch ein Tipp, verwende mal den LD Ausgang als Digital Lockdetect über 
eine LED mit Vorwiderstand nach Masse, so sieht man schnell, wenn die 
PLL gelockt hat.

Bitte auch die entsprechenden Configbits setzen..

von Stephan H. (stiph5)


Lesenswert?

Hallo Uwe S.

Uwe S. schrieb:
> bitte schau mal in das Blockschaltbild, da habe ich den Part doch
> farblich abgesetzt.
>
> Und einmal schrieb ich, dass der RF_DIVIDER mal innerhalb, mal außerhalb
> der PLL Phase-Loop-Filter sitzen kann.
>
> So ergaben sich auch zwei Formel für die Ausgabefrequenz, bzw. die Werte
> für
> INT, FRAC bei gegebenen RFin, fPFD und MOD.

Das ist mir alles klar! Ich habe es auch überprüft als du den Thread 
geschrieben hast. Nur ist genau hier mein Denkfehler gesessen. Jetzt hab 
ich es endlich verstanden. Der RF_DIVIDER wird im INT wert mit 
eingerechnet wenn dieser im PLL Kreis ist. Eigentlich logisch...

Danke auf alle fälle für die Hilfe! Ich werde meine Files noch 
fertigstellen und dann hier hochladen.
LG Stephan

von Uwe S. (de0508)


Lesenswert?

Danke Stephan !

von Stephan H. (stiph5)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

soweit ist alles fertig. Vielleicht kann jemand was damit anfangen.
Lg Stephan

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.