Hallo zusammen,
ich versuche derzeit den ADF4001 (PLL) zu initialisieren, allerdings
bisher "fast" erfolglos.
Es gibt laut Datenblatt mehrere Varianten, wie die PLL initialisiert
werden kann:
1. Initialisation Latch Method
2. CE Pin Method
3. Counter Reset Method
Gehe ich nach der "CE Pin Method" vor, lockt sich die PLL auch sofort
auf mein Referenzsignal.
Die beiden anderen Methoden scheinen nicht zu funktionieren, was im
Klartext heißt, die am Loopfilterausgang gemessene Kontrollspannung des
VCOs ist 0 und ändert sich auch nicht. Während die Kontrollspannung in
eingerastetem Zustand um die 2-2.5V beträgt.
Warum ich trotz einem eigentlich zufriedenstellenden Ergebnis immer noch
versuche die PLL mit einer anderen Methode zu initialisieren ist der
folgende Grund:
Der VCO, den ich auf mein Referenzsignal einrasten lasse, ist samt einer
weiteren PLL (LMX2326) auf einem anderen Board untergebracht, wo ich
nicht die Möglichkeit habe den CE des LMX2326 low bzw. high zu setzen,
da CE direkt an der Versorgungsspannung hängt. Es kommen also nur die
beiden anderen Initialisierungsmethoden in Frage.
Die Initialisierungsmethoden des LMX2326 sind die gleichen wie die des
ADF4001.
Deshalb bin ich bis jetzt davon ausgegangen (was vielleicht auch ein
Fehler sein könnte), dass beide PLLs sich bei der Initialisierung gleich
verhalten, aber ich will eine falsche Konfiguration so gut es geht
ausschließen, bevor ich mich auf weitere Fehlersuche mache, denn das
weitere Problem was ich habe ist, dass ich während des Betriebs kaum bis
gar nicht überprüfen kann, was der LMX2326 macht. Deshalb kam ich
überhaupt erst auf die Idee, die "Counter Reset Method" und die
"Initialisation Latch Method" vorerst am ADF4001 auszuprobieren.
Leider ohne Erfolg.
Ich weiß mir absolut keinen Rat mehr, da ich alles was mir in den Sinn
kam und sinnig erschien schon ausprobiert habe. Zumal das Vorgehen in
beiden Datenblättern auch eigentlich eindeutig ist, aber irgendwo muss
ich einen Fehler gemacht haben.
Ich habe die entsprechenden Zeilen aus meinem Code kopiert, wobei ich
allerdings nur die "Initialisation Latch Method" implementiert habe. Mir
würde es auch vollkommen reichen wenn die funktionieren würde.
1 | /* ADF4001 */
|
2 | #define ADF_CE 3
|
3 | #define ADF_SCLK 4
|
4 | #define ADF_SDATA 5
|
5 | #define ADF_LE 6
|
6 | #define ADF_MUXOUT 7
|
7 | /* width of shift register */
|
8 | #define ADF_SRW (21-1)
|
9 | /* control bits */
|
10 | #define ADF_C1 0
|
11 | #define ADF_C2 1
|
12 |
|
13 | /* reference counter = 1, antibacklashwidth = 6ns */
|
14 | uint32_t ADF_R_Counter = 0b00000000000000001000000000000001;
|
15 | uint16_t ADF_N_Counter = 1;
|
16 | uint32_t ADF_Init_Latch = 0b00000000000000110111111000100100;
|
17 |
|
18 | uint32_t temp_data;
|
19 |
|
20 | void SPI_Write_ADF(uint32_t latch_data_adf)
|
21 | {
|
22 | PORTA = (0 << ADF_LE);
|
23 |
|
24 | for(int i = 0; i <= ADF_SRW; i++)
|
25 | {
|
26 | PORTA &= ~(1 << ADF_SCLK);
|
27 |
|
28 | /* MSB first (bit 21)*/
|
29 | if(latch_data_adf & 0x100000)
|
30 | {
|
31 | PORTA |= (1 << ADF_SDATA);
|
32 | }
|
33 | else
|
34 | {
|
35 | PORTA &= ~(1 << ADF_SDATA);
|
36 | }
|
37 | PORTA |= (1 << ADF_SCLK);
|
38 |
|
39 | /* shift left */
|
40 | latch_data_adf = latch_data_adf << 1;
|
41 | }
|
42 | PORTA = (1 << ADF_LE);
|
43 | }
|
44 |
|
45 | void Configure_ADF(void)
|
46 | {
|
47 | /* write to initialization latch; shift 2 times, because the first 2 bits are the conrol bits */
|
48 | temp_data = ADF_Init_Latch << 2;
|
49 | /* set control bits */
|
50 | temp_data |= (1 << ADF_C1) | (1 << ADF_C2);
|
51 | SPI_Write_ADF(temp_data);
|
52 |
|
53 | /* write to R-counter */
|
54 | temp_data = ADF_R_Counter << 2;
|
55 | SPI_Write_ADF(temp_data);
|
56 |
|
57 | /* write to N-counter; shift 8 bit, because db2 - db7 are unused */
|
58 | temp_data = ADF_N_Counter << 8;
|
59 | temp_data |= (1 << ADF_C1);
|
60 | SPI_Write_ADF(temp_data);
|
61 | }
|
Datenblatt ADF4001 (S. 13):
http://www.analog.com/static/imported-files/data_sheets/ADF4001.pdf
Datenblatt LMX2326 (S. 15):
http://www.ti.com/lit/gpn/lmx2326
Danke für alle Antworten schon mal im Voraus.