Forum: Analoge Elektronik und Schaltungstechnik ADF4156A reagiert nicht


von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich habe eine kleine Platine gebaut mit einem ADF4156A um einen VCO 
anzusteuern. Ich wollte jetzt den ADF mal testen und habe dazu dessen 
SPI-Schnittstelle über Litzen mit einem STM32 Discovery Board verbunden. 
Per Software-SPI werden die Register konfiguriert. Am Oskar sehen die 
Signale ganz OK aus, und grundsätzlich scheint der ADF die Befehle auch 
anzunehmen, so kann ich MUXOUT zwischen VDD und GND umschalten. Mehr 
geht dann aber auch wirklich gar nicht. Ich habe alle möglichen Register 
schon versucht zu programmieren, so z.B. auch am MUXOUT den R-Teiler 
auszugeben, aber ohne Erfolg. Irgendwie scheint der ADF keinen Takt zu 
bekommen oder was auch immer.

Den Referenzeingang habe ich mit einem 4 MHz Quarzoszillator verbunden, 
wahlweise über einen 0R oder über einen 1nF. Beides macht keinen 
Unterschied. Am RF Eingang ist ein VCO mit 400 MHz angeschlossen. Für 
das Loopfilter habe ich einfach mal 47k und 1nF rein gesetzt; meiner 
Meinung nach müsste man damit wenigstens mal was 'zappeln' sehen, aber 
es passiert - gar nichts!

Im Anhang mal mein Schematic. Wo könnte das Problem sein?

von Tobias P. (hubertus)


Lesenswert?

Kennt den Chip niemand?

von Georg A. (georga)


Lesenswert?

Bin mehr nicht mehr so ganz sicher ob das ein ADF oder eine andere PLL 
war. Bei einer war der "Debug"-Pin ala MUXOUT bei der Ausgabe von Takten 
kein Push-Pull mehr, er hat einen Pullup-R gebraucht.

Was ich aber noch recht genau von einem ADF* weiss, war die extreme 
Empfindlichkeit auf dem SPI, der hat sich da über ein paar cm Leitung 
zum boardexternen uC alles mögliche eingefangen und hat damit immer sein 
Setup verloren. Setz da mal überall 1k seriell mit ein paar 100pF gegen 
GND rein.

von Tobias P. (hubertus)


Lesenswert?

Hi Georg

danke für den Tip. Ich habe mal 330 Ohm seriell rein gesetzt. Das hat 
insofern etwas bewirkt, dass das Verhalten jetzt ein wenig anders ist, 
denn der PLL lässt sich immerhin nun ein- und ausschalten 
(Powerdown-Bit), was ich am Stromverbrauch sehe, der mal grösser und mal 
kleiner ist. Soweit also mal gut. Ich werde heute Abend mal noch kleine 
Kondensatoren reinsetzen, so 1 nF oder sowas und schauen, ob das etwas 
bringt.

Die Leitungen auf meiner Leiterplatte vom uC zum ADF4156 sind ca. 1.5 cm 
lang. Da ich den uC aber noch nicht hier habe (vergessen zu 
bestellen.....), habe ich über Wrapdrähte die entsprechenden 
Verbindungen mit einem Discoveryboard gemacht. Die Wrapdrähte sind ca. 
5cm lang, also schon recht lang. Meinst du, dass das bereits ausreicht, 
um Einstreuungen vom VCO einzufangen, sodass der ADF sein Setup auch 
vergisst? :-(

Ich hoffe, dass es nachher funktioniert, wenn ich den richtigen 
Mikrocontroller drauf habe.

von ADFProgrammierer (Gast)


Lesenswert?

Tobias P. schrieb:
> Die Wrapdrähte sind ca.
> 5cm lang, also schon recht lang.

Das ist überhaupt kein Problem. Aber .....
... hast du dir überlegt wie du LE korrekt programmierst? Du
hast dazu nichts geschrieben und es ist vielleicht nicht
richtig. Einen SPIx_NSS vom STM32 kannst du nicht so verwenden.

Für den VCO: so wie du die Loop gestaltet hast kann das für
den VCO zu wenig Spannung bedeuten. VCOs brauchen oft bis 10V
oder auch 15V Abstimmspannung. Für diesen Fall brauchst du eine
Konfiguraton mit Operationsverstärker.

Ausserdem brauchst du für ein sauberes HF-Signal eine Pufferung
des VCOs zum ADF, da dessen Teiler auf den VCO zurückwirken,
ihn modulieren, was als (unerwünschte) Modulation auf dem
gelockten VCO-Signal zu sehen ist.

Referenz: dein Oszillator übersteuert womöglich den Referenz-
Eingang (siehe Datenblatt).

PLL: für die Berechnung der PLL-Parameter verwende das ADISIMPLL
Programm sonst wird deine Schleife nie "locken".

von ADFProgrammierer (Gast)


Lesenswert?

Tobias P. schrieb:
> Den Referenzeingang habe ich mit einem 4 MHz Quarzoszillator verbunden,
> wahlweise über einen 0R oder über einen 1nF. Beides macht keinen
> Unterschied.

Auf jeden Fall über einen Kondensator. Die Eingänge biasen sich
selbst und werden "stillgelegt" wenn sie von aussen mit DC
beaufschlagt werden. Gilt auch für den RF Input wo du es ja
richtig gemacht hast.

von ADFProgrammierer (Gast)


Lesenswert?

Tobias P. schrieb:
> Wo könnte das Problem sein?

An der Programmierung. Zeige sie.

von Tobias P. (hubertus)


Lesenswert?

Hallo,

vielen Dank. Ich lade die Software gleich hier hoch. Bin noch unterwegs!

von ADFProgrammierer (Gast)


Lesenswert?

ADFProgrammierer schrieb:
> Auf jeden Fall über einen Kondensator.

Nehme ich zurück. Gilt für diesen Baustein nicht.

von Tobias P. (hubertus)


Lesenswert?

So, hier mal mein Code. Die SPI-Schnittstelle betreibe ich im 'Bitbang' 
mode wie folgt:
1
void send_adf(uint32_t value)
2
{
3
  uint32_t cnt;
4
  int a;
5
  
6
  LE(0);
7
  for(a = 0; a < 10000; a++);
8
  for(cnt = 0; cnt < 32; cnt++)
9
  {
10
    SCK(0);
11
    for(a = 0; a < 10000; a++);
12
    if(value & BIT_31)
13
    {
14
      DATA(1);
15
    }
16
    else
17
    {
18
      DATA(0);
19
    }
20
    for(a = 0; a < 10000; a++);
21
    SCK(1);
22
    for(a = 0; a < 10000; a++);
23
    value = value << 1;
24
  }
25
  for(a = 0; a < 10000; a++);
26
  LE(1);
27
  for(a = 0; a < 10000; a++);
28
  LE(0);
29
  for(a = 0; a < 10000; a++);
30
}

Die for-Loops geben jeweils ca. 100 us Delay.

In die Register schreibe ich folgendes rein:
1
void main(void)
2
{
3
  send_adf( BIT_02 ); // R4
4
  send_adf(BIT_06  | BIT_03 | BIT_01 | BIT_00 ); // R3; enable counter reset
5
6
                                       // MOD
7
  send_adf( (10u << 24) | (1u << 15) | (10u << 3) | BIT_01 );  // R2
8
  send_adf((1u << 3) | BIT_00 );  // R1
9
10
  //                         INT          FRAC
11
  send_adf( (3u << 27) | (100u << 15) | (5u << 3) ); // R0
12
  send_adf( BIT_06 |  BIT_01 | BIT_00 ); // R3; disable counter reset
13
}

Wahlweise habe ich auch mal die Geschichte mit dem Counter-Reset weg 
gelassen, ändern tut sich dabei aber nichts. Mit dem Wert 3 an Position 
27 im R0 Register wird der R-Teiler auf den MUXOUT gelegt, ich meine, 
dass ich dann im Prinzip 4 MHz sehen müsste, aber es kommt nix raus, 
eben entweder weil der ADF sein Setup verliert wegen zu langer Leitungen 
oder aber weil der Quarztakt aus welchem Grund auch immer nicht im Chip 
ankommt. Ich habe beides, also AC und auch DC Kopplung probiert, beides 
hat nicht funktioniert.

von Tobias P. (hubertus)


Lesenswert?

Haha, ich habe den Fehler gefunden. Bitte nicht lachen :-)
Ich habe 2 Pins vertauscht. Jetzt geht es! Die Programmierung ist 
definitiv richtig. Ich habe den Ausgang des VCO über einen Splitter mit 
dem ADF verbunden, sowie mit dem Spektrumanalyser. Jetzt kann ich die 
Frequenz schön einstellen mit dem FRAC, MOD und INT, und am MUXOUT kommt 
auch das gewünschte raus. Es waren nicht die fehlenden Kondensatoren :-)

von ADFProgrammierer (Gast)


Lesenswert?

Tobias P. schrieb:
> So, hier mal mein Code.

Bis jetzt nichts Verdächtiges entdeckt.

Hast du den Chip mit seiner Massefläche an Gnd angeschlossen?

Kurze Masseverbindung vom ADF-Board zum STM Board?

Pins auf Output konfiguriert und Clock dafür enabled?
Richtige Pins?

Diese Schleifen

for(a = 0; a < 10000; a++);

können vom Compiler wegoptimiert werden. Prüfe nach ob
sich wirklich ein Delay ergibt....

Ansonsten musst du uns wohl oder übel auch deinen Aufbau zeigen.

von ADFProgrammierer (Gast)


Lesenswert?

ADFProgrammierer schrieb:
> Bis jetzt nichts Verdächtiges entdeckt.

... und schon zu spät ....

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Mein Aufbau sieht so aus, siehe Bild. Er ist nich so schön (lies: zum 
heulen), ich weiss. Aber dennoch funktioniert er, nachdem ich nun erst 
gesehen habe, dass ich 2 Pins versehentlich vertauscht habe.

Was ich mich aber noch frage:
ist es nötig bzw. sinnvoll, bei der Initialisierung des ADF den Counter 
Reset zu aktivieren? Das Datenblatt schweigt sich da aus.

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.